Explorar o código

fix: upload release assets sequentially (#287)

The single softprops/action-gh-release step fired ~500 concurrent
uploads and got the runner killed twice at the same point mid-upload.
Upload one asset at a time via gh release upload with per-file
retries, creating the release first if missing.
James McConnell hai 6 días
pai
achega
97e11f0c35
Modificáronse 1 ficheiros con 48 adicións e 11 borrados
  1. 48 11
      .github/workflows/main.yml

+ 48 - 11
.github/workflows/main.yml

@@ -1359,17 +1359,54 @@ jobs:
         done
 
     - name: Create Release
-      uses: softprops/action-gh-release@v1
-      with:
-        tag_name: ${{ steps.tag.outputs.new_tag }}
-        name: ${{ steps.release_meta.outputs.release_title }}
-        body_path: release_body.md
-        draft: false
-        prerelease: ${{ inputs.release_type == 'Pre-Release' }}
-        files: |
-          release-assets/**/*.zip
-          release-assets/**/*.apk
-          release-assets/**/*-boot*.img
+      env:
+        GH_TOKEN: ${{ github.token }}
+        TAG_NAME: ${{ steps.tag.outputs.new_tag }}
+        RELEASE_TITLE: ${{ steps.release_meta.outputs.release_title }}
+        IS_PRERELEASE: ${{ inputs.release_type == 'Pre-Release' }}
+      run: |
+        set -euo pipefail
+        shopt -s nullglob globstar
+
+        # Collect assets first so a glob miss fails fast instead of mid-release.
+        files=(release-assets/**/*.zip release-assets/**/*.apk release-assets/**/*-boot*.img)
+        if [ "${#files[@]}" -eq 0 ]; then
+          echo "No release assets found" >&2
+          exit 1
+        fi
+        echo "Uploading ${#files[@]} assets one at a time..."
+
+        # The release may already exist (partial upload from a retried run).
+        if gh release view "$TAG_NAME" >/dev/null 2>&1; then
+          echo "Release $TAG_NAME already exists — uploading into it."
+        else
+          create_args=(--title "$RELEASE_TITLE" --notes-file release_body.md)
+          if [ "$IS_PRERELEASE" = "true" ]; then
+            create_args+=(--prerelease)
+          fi
+          gh release create "$TAG_NAME" "${create_args[@]}"
+        fi
+
+        # Sequential uploads: one asset at a time with per-file retries.
+        # (The previous single-step bulk upload fired ~500 concurrent
+        # uploads and got the runner killed twice at the same point.)
+        failed=0
+        for f in "${files[@]}"; do
+          ok=false
+          for attempt in 1 2 3; do
+            if gh release upload "$TAG_NAME" "$f" --clobber; then
+              ok=true
+              break
+            fi
+            echo "Retry $attempt/3 failed for: $f" >&2
+            sleep 10
+          done
+          if [ "$ok" = false ]; then
+            echo "ERROR: giving up on $f" >&2
+            failed=1
+          fi
+        done
+        exit "$failed"
 
   nightly-release:
     if: always() && github.event_name == 'workflow_dispatch' && !inputs.test_release_notes && inputs.release_type == 'Action'