diff --git a/.github/scripts/test-release.sh b/.github/scripts/test-release.sh index 3d7c4f1..b371826 100644 --- a/.github/scripts/test-release.sh +++ b/.github/scripts/test-release.sh @@ -53,12 +53,18 @@ case "$*" in api\ */commits/*\ --jq\ .sha) cat "$STATE/commit" ;; api\ --paginate\ --slurp\ */releases\?per_page=100) [[ ! -f "$STATE/api-error" ]] || exit 1 + if [[ -f "$STATE/stale-list" && -f "$STATE/created" ]]; then + echo '[[{"id":8,"tag_name":"v0.0.0","draft":false}]]' + exit 0 + fi jq -s '[[{id: 8, tag_name: "v0.0.0", draft: false}], .]' "$STATE/release" ;; api\ --paginate\ --slurp\ */assets\?per_page=100) jq -s '[[], .]' "$STATE/assets" ;; - "release create $RELEASE_TAG --repo $GH_REPO --verify-tag --draft --generate-notes --title $RELEASE_TAG") + "api --method POST repos/$GH_REPO/releases -f tag_name=$RELEASE_TAG -f target_commitish=$RELEASE_COMMIT -f name=$RELEASE_TAG -F draft=true -F prerelease=false -F generate_release_notes=true") echo create >> "$STATE/writes" - echo '{"id":7,"tag_name":"v1.2.3","draft":true,"prerelease":false}' > "$STATE/release" ;; + echo '{"id":7,"tag_name":"v1.2.3","draft":true,"prerelease":false}' > "$STATE/release" + touch "$STATE/created" + cat "$STATE/release" ;; "release upload $RELEASE_TAG --repo $GH_REPO --clobber "*) jq -e .draft "$STATE/release" > /dev/null echo upload >> "$STATE/writes" @@ -97,6 +103,7 @@ reject bash "$ROOT/release.sh" --authorize rm "$STATE/permission-error" reset_github() { + rm -f "$STATE/created" : > "$STATE/release" : > "$STATE/assets" : > "$STATE/writes" @@ -233,6 +240,12 @@ for failure in missing extra digest; do test "$(cat "$STATE/writes")" = $'create\nupload\nedit' done +reset_github +# Creation must succeed even while the releases list omits the new draft. +touch "$STATE/stale-list" +release --publish +test "$(cat "$STATE/writes")" = $'create\nupload\nedit' +rm "$STATE/stale-list" reset_github touch "$STATE/interrupt" reject release --publish diff --git a/release.sh b/release.sh index 4a7a2ab..2c9b716 100755 --- a/release.sh +++ b/release.sh @@ -113,10 +113,16 @@ find_release() { verify_tag release=$(find_release) if [[ "$release" == null ]]; then - gh release create "$tag" --repo "$repo" --verify-tag --draft --generate-notes --title "$tag" - release=$(find_release) + # The releases list can lag behind creation. Keep the response so a new draft + # does not need to appear in that list before we can upload its assets. + release=$(gh api --method POST "repos/$repo/releases" \ + -f tag_name="$tag" -f target_commitish="$commit" -f name="$tag" \ + -F draft=true -F prerelease=false -F generate_release_notes=true) fi -id=$(jq -er .id <<< "$release") +id=$(jq -er .id <<< "$release") || { + echo "Release $tag has no release ID; refusing to publish." >&2 + exit 1 +} if jq -e .draft <<< "$release" > /dev/null; then gh release upload "$tag" --repo "$repo" --clobber "${assets[@]/#/dist/}" elif ! jq -e '.prerelease == false' <<< "$release" > /dev/null; then