Remove incomplete prereleases after asset upload failures (#59887)

## Why

Prereleases are published before their assets are uploaded. A failed upload can leave an incomplete public release and prevent a rerun from recreating its `prereleased` event.

## What changed

Track newly created prereleases and successful asset uploads in the release workflow. Remove a newly created prerelease if its upload fails, preserving the tag so a rerun can recreate the release. Keep existing releases and releases whose assets finished uploading, even if the metadata update fails.

## Testing

Add a regression test that runs the workflow commands with a stubbed `gh`, covering upload failure cleanup, a successful rerun, preservation of existing prereleases, and metadata update failures after upload.

GitOrigin-RevId: 29411d6d1e649f4e8c67e84a41d9de2c9d31558f
This commit is contained in:
jif
2026-11-06 11:32:48 +00:00
committed by copyberry
parent ddd1812a51
commit b6f53857fc
2 changed files with 122 additions and 0 deletions
+12
View File
@@ -1763,6 +1763,7 @@ jobs:
mv dist/x86_64-pc-windows-msvc/install.ps1 dist/install.ps1
- name: Create GitHub Release
id: github_release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
RELEASE_NAME: ${{ steps.release_name.outputs.name }}
@@ -1795,14 +1796,25 @@ jobs:
fi
gh release create "$GITHUB_REF_NAME" "${release_args[@]}" \
--draft="$draft" --verify-tag --latest=false
if [[ "$PRERELEASE" == true ]]; then
echo "created_prerelease=true" >> "$GITHUB_OUTPUT"
fi
fi
mapfile -d '' assets < <(find dist -type f -print0 | sort -z)
gh release upload "$GITHUB_REF_NAME" "${assets[@]}" \
--repo "$GITHUB_REPOSITORY" --clobber
echo "assets_uploaded=true" >> "$GITHUB_OUTPUT"
gh release edit "$GITHUB_REF_NAME" "${release_args[@]}" \
--draft=false --latest="$MAKE_LATEST"
- name: Remove incomplete prerelease
# Keep the tag so a rerun can recreate the release and its prereleased event.
if: ${{ always() && steps.github_release.outputs.created_prerelease == 'true' && steps.github_release.outputs.assets_uploaded != 'true' }}
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: gh release delete "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" --yes
publish-r2-assets:
name: publish-r2-assets
needs: release