Auto-publish Arm64 images when emscripten-releases-tags.json is updated (#1231)

Add job to conditionally build arm64 images when emscripten-releases-tags.json updated
diff --git a/.circleci/config.yml b/.circleci/config.yml
index bc573c1..3b44851 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -27,7 +27,7 @@
     resource_class: macos.m1.medium.gen1
   linux_arm64:
     machine:
-      image: ubuntu-2004:202101-01
+      image: ubuntu-2004:2023.07.1
     resource_class: arm.medium
 
 commands:
@@ -173,7 +173,7 @@
             $env:SYSTEM_FLAG="--system"
             test/test_path_preservation.ps1
 
-  build-docker-image:
+  build-docker-image-x64:
     executor: bionic
     steps:
       - checkout
@@ -189,7 +189,7 @@
           name: test
           command: make -C ./docker version=tot test
 
-  publish-docker-image:
+  publish-docker-image-x64:
     executor: bionic
     steps:
       - checkout
@@ -209,6 +209,53 @@
             docker login -u "$DOCKER_USER" -p "$DOCKER_PASS"
             make -C ./docker version=${CIRCLE_TAG} alias=latest push
 
+  publish-docker-image-arm64:
+    executor: linux_arm64
+    steps:
+      - checkout
+      - run:
+          name: check if emscripten-releases-tags.json has changed
+          command: |
+            CHANGED_FILES=$(git diff --name-only <<pipeline.git.base_revision>>..<<pipeline.git.revision>>)
+            if [[ ! $CHANGED_FILES =~ "emscripten-releases-tags.json" ]]; then
+              echo "emscripten-releases-tags.json has not changed, skipping build and publish"
+              circleci-agent step halt
+            fi
+      - run:
+          name: extract latest emscripten arm64 linux version
+          command: |
+            ARM64_VERSION=$(grep -oP '(?<="latest-arm64-linux": ")[^"]*' emscripten-releases-tags.json)
+            ARM64_IMAGE_TAG=${ARM64_VERSION}-arm64
+            echo "export ARM64_VERSION=$ARM64_VERSION" >> $BASH_ENV
+            echo "export ARM64_IMAGE_TAG=$ARM64_IMAGE_TAG" >> $BASH_ENV
+            echo "ARM64_VERSION=$ARM64_VERSION"
+            echo "ARM64_IMAGE_TAG=$ARM64_IMAGE_TAG"
+      - run:
+          name: check if docker image already exists
+          command: |
+            if [ -z "$ARM64_VERSION" ]; then
+              echo "ARM64_VERSION is empty, skipping publish"
+              circleci-agent step halt
+              exit 0
+            fi
+            DOCKER_IMAGE_EXISTS=$(curl -s -o /dev/null -w "%{http_code}" https://hub.docker.com/v2/repositories/emscripten/emsdk/tags/$ARM64_IMAGE_TAG)
+            if [ "$DOCKER_IMAGE_EXISTS" = "200" ]; then
+              echo "Docker image: $ARM64_VERSION"
+              echo "Docker image already exists, skipping build and publish"
+              circleci-agent step halt
+            fi
+      - run:
+          name: build
+          command: make -C ./docker version=${ARM64_VERSION} build
+      - run:
+          name: test
+          command: make -C ./docker version=${ARM64_VERSION} test
+      - run:
+          name: push image
+          command: |
+            docker login -u "$DOCKER_USER" -p "$DOCKER_PASS"
+            make -C ./docker version=${ARM64_VERSION} alias=${ARM64_IMAGE_TAG} only_alias=true push
+
   test-bazel-linux:
     executor: bionic
     steps:
@@ -284,13 +331,17 @@
       - test-windows
   build-docker-image:
     jobs:
-      - build-docker-image
-      - publish-docker-image:
+      - build-docker-image-x64
+      - publish-docker-image-x64:
           filters:
             branches:
               ignore: /.*/
             tags:
               only: /.*/
+      - publish-docker-image-arm64:
+          filters:
+            branches:
+              only: main
   test-bazel-linux:
     jobs:
       - test-bazel-linux
diff --git a/docker/Makefile b/docker/Makefile
index 8e84b2e..22bea0e 100644
--- a/docker/Makefile
+++ b/docker/Makefile
@@ -4,6 +4,7 @@
 # i.e.:  1.39.18
 version =
 alias =
+only_alias =
 
 image_name ?= emscripten/emsdk
 
@@ -21,7 +22,9 @@
 	docker run --rm -u `id -u`:`id -g` -w /emsdk/docker --net=host --entrypoint /bin/bash ${image_name}:${version} $<
 
 push: .TEST
+ifndef only_alias
 	docker push ${image_name}:${version}
+endif
 ifdef alias
 	docker tag ${image_name}:${version} ${image_name}:${alias}
 	docker push ${image_name}:${alias}