Repository: denoland/deno
Pull request: ci: make canary uploads less racy

Closes https://github.com/denoland/deno/issues/25464

Only uploads canary git hash if the one in the bucket is present
in the current action Git history.

Changed files:
filename: .github/workflows/ci.generate.ts
patch: @@ -813,8 +813,12 @@ const ci = {
           ].join("\n"),
           run: [
             'gsutil -h "Cache-Control: public, max-age=3600" cp ./target/release/*.zip gs://dl.deno.land/canary/$(git rev-parse HEAD)/',
-            "echo ${{ github.sha }} > canary-latest.txt",
-            'gsutil -h "Cache-Control: no-cache" cp canary-latest.txt gs://dl.deno.land/canary-$(rustc -vV | sed -n "s|host: ||p")-latest.txt',
+            'lastest_canary_hash=$(gsutil cat gs://dl.deno.land/canary-$(rustc -vV | sed -n "s|host: ||p")-latest.txt)',
+            "git cat-file -e $(lastest_canary_hash)",
+            "if [ $? -eq 0 ]; then",
+            "  echo ${{ github.sha }} > canary-latest.txt",
+            '  gsutil -h "Cache-Control: no-cache" cp canary-latest.txt gs://dl.deno.land/canary-$(rustc -vV | sed -n "s|host: ||p")-latest.txt',
+            "fi",
           ].join("\n"),
         },
         {
@@ -1092,8 +1096,12 @@ const ci = {
         {
           name: "Upload canary version file to dl.deno.land",
           run: [
-            "echo ${{ github.sha }} > canary-latest.txt",
-            'gsutil -h "Cache-Control: no-cache" cp canary-latest.txt gs://dl.deno.land/canary-latest.txt',
+            "lastest_canary_hash=$(gsutil cat gs://dl.deno.land/canary-latest.txt) && \\",
+            "git cat-file -e $(lastest_canary_hash)",
+            "if [ $? -eq 0]; then",
+            "  echo ${{ github.sha }} > canary-latest.txt && \\",
+            '  gsutil -h "Cache-Control: no-cache" cp canary-latest.txt gs://dl.deno.land/canary-latest.txt',
+            "fi",
           ].join("\n"),
         },
       ],

filename: .github/workflows/ci.yml
patch: @@ -486,8 +486,12 @@ jobs:
           github.ref == 'refs/heads/main')
         run: |-
           gsutil -h "Cache-Control: public, max-age=3600" cp ./target/release/*.zip gs://dl.deno.land/canary/$(git rev-parse HEAD)/
-          echo ${{ github.sha }} > canary-latest.txt
-          gsutil -h "Cache-Control: no-cache" cp canary-latest.txt gs://dl.deno.land/canary-$(rustc -vV | sed -n "s|host: ||p")-latest.txt
+          lastest_canary_hash=$(gsutil cat gs://dl.deno.land/canary-$(rustc -vV | sed -n "s|host: ||p")-latest.txt)
+          git cat-file -e $(lastest_canary_hash)
+          if [ $? -eq 0 ]; then
+            echo ${{ github.sha }} > canary-latest.txt
+            gsutil -h "Cache-Control: no-cache" cp canary-latest.txt gs://dl.deno.land/canary-$(rustc -vV | sed -n "s|host: ||p")-latest.txt
+          fi
       - name: Autobahn testsuite
         if: |-
           !(matrix.skip) && ((matrix.os == 'linux' && matrix.arch != 'aarch64') &&
@@ -690,5 +694,9 @@ jobs:
           project_id: denoland
       - name: Upload canary version file to dl.deno.land
         run: |-
-          echo ${{ github.sha }} > canary-latest.txt
-          gsutil -h "Cache-Control: no-cache" cp canary-latest.txt gs://dl.deno.land/canary-latest.txt
+          lastest_canary_hash=$(gsutil cat gs://dl.deno.land/canary-latest.txt) && \
+          git cat-file -e $(lastest_canary_hash)
+          if [ $? -eq 0]; then
+            echo ${{ github.sha }} > canary-latest.txt && \
+            gsutil -h "Cache-Control: no-cache" cp canary-latest.txt gs://dl.deno.land/canary-latest.txt
+          fi