Skip to content

Commit b86f84a

Browse files
soul2zimateclaude
andcommitted
fix: harden stage workflow concurrency, error handling, and uploads
- Split concurrency to job level: build is cancelable, release is not, preventing incomplete early-access releases from mid-flight cancellation - Replace blanket continue-on-error with explicit 404 handling when checking for existing releases, so real API failures are surfaced - Add set -euo pipefail and curl --fail-with-body --retry to asset uploads so server errors fail the workflow instead of passing silently Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 43753cc commit b86f84a

1 file changed

Lines changed: 22 additions & 9 deletions

File tree

.github/workflows/stage.yml

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,13 @@ on:
99
paths-ignore:
1010
- ".github/**"
1111

12-
concurrency:
13-
group: stage-${{ github.ref }}
14-
cancel-in-progress: true
15-
1612
jobs:
1713
build:
1814
runs-on: ubuntu-latest
1915
name: Build project
16+
concurrency:
17+
group: stage-build-${{ github.ref }}
18+
cancel-in-progress: true
2019
steps:
2120
- name: Checkout sources
2221
uses: actions/checkout@v6
@@ -44,6 +43,9 @@ jobs:
4443
release:
4544
runs-on: ubuntu-latest
4645
name: Create an early-access release
46+
concurrency:
47+
group: stage-release-${{ github.ref }}
48+
cancel-in-progress: false
4749
permissions:
4850
contents: write
4951
needs: build
@@ -61,14 +63,21 @@ jobs:
6163
- name: Check for existing early-access release
6264
id: existing_release
6365
uses: actions/github-script@v7
64-
continue-on-error: true
6566
with:
6667
github-token: ${{ secrets.GITHUB_TOKEN }}
6768
script: |
6869
const repo_name = context.payload.repository.full_name
69-
var response = await github.request('GET /repos/' + repo_name + '/releases/tags/early-access')
70-
// if the request fails (ie 404) the next steps will not occur and the output will not be set
71-
core.setOutput('id', response.data.id)
70+
try {
71+
const response = await github.request('GET /repos/' + repo_name + '/releases/tags/early-access')
72+
core.setOutput('id', response.data.id)
73+
} catch (error) {
74+
if (error.status === 404) {
75+
core.info('No existing early-access release found')
76+
core.setOutput('id', '')
77+
} else {
78+
core.setFailed(`Failed to check for early-access release: ${error.status} ${error.message}`)
79+
}
80+
}
7281
7382
- name: Delete early-access release if exists
7483
if: ${{ steps.existing_release.outputs.id }}
@@ -123,12 +132,16 @@ jobs:
123132
- name: Upload packages and checksums as early-access release assets
124133
working-directory: distributions
125134
run: |
135+
set -euo pipefail
126136
for file in *
127137
do
128138
asset_name=$(basename "$file")
129139
upload_url=$(echo "${{ steps.new_release.outputs.upload_url }}" | sed "s/{?name,label}/?name=$asset_name/g")
130-
curl --data-binary @"$file" \
140+
echo "Uploading $asset_name..."
141+
curl --fail-with-body --retry 3 --retry-all-errors --show-error --silent \
142+
--data-binary @"$file" \
131143
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
132144
-H "Content-Type: application/octet-stream" \
133145
"$upload_url"
146+
echo ""
134147
done

0 commit comments

Comments
 (0)