Skip to content

Commit f4e52a1

Browse files
committed
ci: make release asset publishing atomic
1 parent 1b3b6b3 commit f4e52a1

1 file changed

Lines changed: 22 additions & 3 deletions

File tree

.github/workflows/build-and-release.yml

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -239,12 +239,31 @@ jobs:
239239
else
240240
echo "No existing release for $GITHUB_REF_NAME."
241241
fi
242-
- name: Create GitHub Release
243-
uses: softprops/action-gh-release@v1
242+
- name: Create draft GitHub Release and upload assets
243+
id: release
244+
uses: softprops/action-gh-release@v3
244245
with:
245246
tag_name: ${{ github.ref_name }}
246247
name: Release ${{ github.ref_name }}
247248
body: ${{ steps.changelog.outputs.changelog }}
248249
files: release_assets/*
249-
draft: false
250+
draft: true
250251
prerelease: false
252+
preserve_order: true
253+
fail_on_unmatched_files: true
254+
- name: Verify assets and publish GitHub Release
255+
env:
256+
GH_TOKEN: ${{ github.token }}
257+
run: |
258+
set -Eeuo pipefail
259+
mapfile -t expected < <(find release_assets -maxdepth 1 -type f -printf '%f\n' | sort)
260+
mapfile -t uploaded < <(gh release view "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" --json assets --jq '.assets[].name' | sort)
261+
if (( ${#expected[@]} == 0 )); then
262+
echo "No local release assets were found."
263+
exit 1
264+
fi
265+
if (( ${#expected[@]} != ${#uploaded[@]} )) || ! diff -u <(printf '%s\n' "${expected[@]}") <(printf '%s\n' "${uploaded[@]}"); then
266+
echo "Uploaded release assets do not match the downloaded build artifacts."
267+
exit 1
268+
fi
269+
gh release edit "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" --draft=false --latest

0 commit comments

Comments
 (0)