diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 473c098..b5c2970 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -409,33 +409,64 @@ jobs: id: version run: echo "VERSION=${GITHUB_REF#refs/tags/}" >> "$GITHUB_OUTPUT" - - name: Validate AUR SSH secret + - name: Check AUR publish prerequisites + id: aur_prereqs env: AUR_SSH_PRIVATE_KEY: ${{ secrets.AUR_SSH_PRIVATE_KEY }} run: | set -euo pipefail if [ -z "${AUR_SSH_PRIVATE_KEY}" ]; then - echo "Missing required secret: AUR_SSH_PRIVATE_KEY" - exit 1 + echo "::warning::Missing AUR_SSH_PRIVATE_KEY; skipping automated AUR publish." + echo "skip=true" >> "$GITHUB_OUTPUT" + exit 0 fi + echo "skip=false" >> "$GITHUB_OUTPUT" - name: Configure SSH for AUR + id: aur_ssh + if: steps.aur_prereqs.outputs.skip != 'true' env: AUR_SSH_PRIVATE_KEY: ${{ secrets.AUR_SSH_PRIVATE_KEY }} run: | set -euo pipefail - install -dm700 ~/.ssh - printf '%s\n' "${AUR_SSH_PRIVATE_KEY}" > ~/.ssh/aur - chmod 600 ~/.ssh/aur - ssh-keyscan aur.archlinux.org >> ~/.ssh/known_hosts - chmod 644 ~/.ssh/known_hosts + if install -dm700 ~/.ssh \ + && printf '%s\n' "${AUR_SSH_PRIVATE_KEY}" > ~/.ssh/aur \ + && chmod 600 ~/.ssh/aur \ + && ssh-keyscan aur.archlinux.org >> ~/.ssh/known_hosts \ + && chmod 644 ~/.ssh/known_hosts; then + echo "skip=false" >> "$GITHUB_OUTPUT" + exit 0 + fi + + echo "::warning::Unable to configure SSH for AUR; skipping automated AUR publish." + echo "skip=true" >> "$GITHUB_OUTPUT" - name: Clone AUR repo + id: aur_clone + if: steps.aur_prereqs.outputs.skip != 'true' && steps.aur_ssh.outputs.skip != 'true' env: GIT_SSH_COMMAND: ssh -i ~/.ssh/aur -o IdentitiesOnly=yes - run: git clone ssh://aur@aur.archlinux.org/subminer-bin.git aur-subminer-bin + run: | + set -euo pipefail + attempts=3 + for attempt in $(seq 1 "$attempts"); do + if git clone ssh://aur@aur.archlinux.org/subminer-bin.git aur-subminer-bin; then + echo "skip=false" >> "$GITHUB_OUTPUT" + exit 0 + fi + + rm -rf aur-subminer-bin + + if [ "$attempt" -lt "$attempts" ]; then + sleep $((attempt * 15)) + fi + done + + echo "::warning::Unable to clone subminer-bin from AUR after ${attempts} attempts; skipping automated AUR publish." + echo "skip=true" >> "$GITHUB_OUTPUT" - name: Download release assets for AUR + if: steps.aur_prereqs.outputs.skip != 'true' && steps.aur_ssh.outputs.skip != 'true' && steps.aur_clone.outputs.skip != 'true' env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | @@ -449,6 +480,7 @@ jobs: --pattern "subminer-assets.tar.gz" - name: Update AUR packaging metadata + if: steps.aur_prereqs.outputs.skip != 'true' && steps.aur_ssh.outputs.skip != 'true' && steps.aur_clone.outputs.skip != 'true' run: | set -euo pipefail version_no_v="${{ steps.version.outputs.VERSION }}" @@ -463,6 +495,7 @@ jobs: --assets ".tmp/aur-release-assets/subminer-assets.tar.gz" - name: Commit and push AUR update + if: steps.aur_prereqs.outputs.skip != 'true' && steps.aur_ssh.outputs.skip != 'true' && steps.aur_clone.outputs.skip != 'true' working-directory: aur-subminer-bin env: GIT_SSH_COMMAND: ssh -i ~/.ssh/aur -o IdentitiesOnly=yes @@ -476,4 +509,16 @@ jobs: git config user.email "41898282+github-actions[bot]@users.noreply.github.com" git add PKGBUILD .SRCINFO git commit -m "Update to ${{ steps.version.outputs.VERSION }}" - git push origin HEAD:master + + attempts=3 + for attempt in $(seq 1 "$attempts"); do + if git push origin HEAD:master; then + exit 0 + fi + + if [ "$attempt" -lt "$attempts" ]; then + sleep $((attempt * 15)) + fi + done + + echo "::warning::Unable to push the AUR update after ${attempts} attempts; GitHub release is published, but subminer-bin needs manual follow-up." diff --git a/backlog/tasks/task-252 - Harden-AUR-publish-release-step-against-transient-SSH-failures.md b/backlog/tasks/task-252 - Harden-AUR-publish-release-step-against-transient-SSH-failures.md new file mode 100644 index 0000000..b2638f5 --- /dev/null +++ b/backlog/tasks/task-252 - Harden-AUR-publish-release-step-against-transient-SSH-failures.md @@ -0,0 +1,35 @@ +--- +id: TASK-252 +title: Harden AUR publish release step against transient SSH failures +status: Done +assignee: [] +created_date: '2026-03-29 23:46' +updated_date: '2026-03-29 23:49' +labels: + - release + - ci + - aur +dependencies: [] +priority: high +--- + +## Description + + +Make tagged releases resilient when the automated AUR update hits transient SSH disconnects from GitHub-hosted runners. The GitHub Release should still complete successfully, while AUR publish should retry a few times and downgrade persistent AUR failures to warnings instead of failing the entire release workflow. + + +## Acceptance Criteria + +- [x] #1 Tagged release workflow retries the AUR clone/push path with bounded backoff when AUR SSH disconnects transiently. +- [x] #2 Persistent AUR publish failure does not fail the overall tagged release workflow or block GitHub Release publication. +- [x] #3 Release documentation notes that AUR publish is best-effort and may need manual follow-up when retries are exhausted. + + +## Implementation Notes + + +Updated .github/workflows/release.yml so AUR secret/configure/clone/push failures downgrade to warnings, clone/push retry three times with linear backoff, and the GitHub Release path remains green. + +Documented AUR publish as best-effort in docs/RELEASING.md and added changes/253-aur-release-best-effort.md for PR changelog compliance. + diff --git a/changes/253-aur-release-best-effort.md b/changes/253-aur-release-best-effort.md new file mode 100644 index 0000000..c9f3768 --- /dev/null +++ b/changes/253-aur-release-best-effort.md @@ -0,0 +1,5 @@ +type: internal +area: release + +- Retried AUR clone and push operations in the tagged release workflow. +- Kept GitHub Releases green when AUR publish flakes and needs manual follow-up. diff --git a/docs/RELEASING.md b/docs/RELEASING.md index 80a059d..25d9da8 100644 --- a/docs/RELEASING.md +++ b/docs/RELEASING.md @@ -34,4 +34,5 @@ Notes: - Do not tag while `changes/*.md` fragments still exist. - If you need to repair a published release body (for example, a prior version’s section was omitted), regenerate notes from `CHANGELOG.md` and re-edit the release with `gh release edit --notes-file`. - Tagged release workflow now also attempts to update `subminer-bin` on the AUR after GitHub Release publication. +- AUR publish is best-effort: the workflow retries transient SSH clone/push failures, then warns and leaves the GitHub Release green if AUR still fails. Follow up with a manual `git push aur master` from the AUR checkout when needed. - Required GitHub Actions secret: `AUR_SSH_PRIVATE_KEY`. Add the matching public key to your AUR account before relying on the automation.