From 40e4675e88a7bce81f6b93e25f36017849a2ea87 Mon Sep 17 00:00:00 2001 From: alexbelgium Date: Wed, 22 Jul 2026 07:45:08 +0200 Subject: [PATCH] fix(ci): scope revert-on-failure to the failing push's own commits revert-on-failure re-fetched master and reverted before..HEAD, but HEAD was the live tip of master, not the head of the failing push. When the updater bot pushes one addon per commit in quick succession, a single addon's build failure would sweep in every successful commit pushed while the revert job was still running and revert them too. Revert before..github.sha instead, and retry the push with a rebase in case master moves again before we push. --- .github/workflows/onpush_builder.yaml | 34 ++++++++++++++++++++------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/.github/workflows/onpush_builder.yaml b/.github/workflows/onpush_builder.yaml index b58e380d8d..ee7c3d1fc9 100644 --- a/.github/workflows/onpush_builder.yaml +++ b/.github/workflows/onpush_builder.yaml @@ -407,20 +407,25 @@ jobs: fetch-depth: 0 - name: Revert commits from this failed push + env: + BEFORE: ${{ github.event.before }} + HEAD_SHA: ${{ github.sha }} run: | set -euo pipefail git config --global user.name "GitHub Actions" git config --global user.email "actions@github.com" - git fetch origin - git checkout master - git pull --ff-only origin master + git fetch origin master - before="${{ github.event.before }}" - if [ -n "$before" ] && [ "$before" != "0000000000000000000000000000000000000000" ]; then - mapfile -t commits < <(git rev-list "${before}..HEAD") + # Revert exactly the commits THIS push introduced (before..HEAD_SHA). + # Do not diff against the live master tip: concurrent pushes (e.g. the + # updater bot committing one addon per push) can land on master while + # this job is running, and a moving HEAD would sweep their unrelated, + # successful commits into the revert too. + if [ -n "$BEFORE" ] && [ "$BEFORE" != "0000000000000000000000000000000000000000" ]; then + mapfile -t commits < <(git rev-list "${BEFORE}..${HEAD_SHA}") else - commits=("${{ github.sha }}") + commits=("$HEAD_SHA") fi if [ "${#commits[@]}" -eq 0 ]; then @@ -428,8 +433,21 @@ jobs: exit 0 fi + git checkout -B master origin/master for commit in "${commits[@]}"; do git revert --no-edit "$commit" done - git push origin HEAD:master + # Master may have moved again since we fetched (e.g. another + # concurrent updater push), so retry the push with a rebase. + for attempt in 1 2 3 4 5; do + if git push origin HEAD:master; then + exit 0 + fi + echo "Push rejected, rebasing onto latest master (attempt ${attempt})" + git fetch origin master + git rebase origin/master + done + + echo "Failed to push reverts after retries" >&2 + exit 1