diff --git a/.gitea/workflows/sync-beta.yml b/.gitea/workflows/sync-beta.yml new file mode 100644 index 00000000..214dc550 --- /dev/null +++ b/.gitea/workflows/sync-beta.yml @@ -0,0 +1,66 @@ +name: Sync Beta from Master + +# Merges master into beta after every push to master so beta never falls +# behind. Uses RELEASE_TOKEN (admin user) which can push to protected +# branches, same as the CHANGELOG commit in auto-tag.yml. +# +# NOTE: commits carrying [skip ci] in their message (e.g. the CHANGELOG +# commit from auto-tag.yml) suppress all workflow runs, so this job will +# not fire for those specific commits. The NEXT real push to master will +# bring the skipped commit(s) along in the merge. If you need immediate +# sync of every commit, remove [skip ci] from auto-tag.yml's CHANGELOG +# commit and instead gate auto-tag.yml with a path or branch filter. + +on: + push: + branches: + - master + +concurrency: + group: sync-beta + cancel-in-progress: true + +jobs: + sync: + runs-on: linux-amd64 + container: + image: alpine:latest + steps: + - name: Merge master into beta + env: + RELEASE_TOKEN: ${{ secrets.RELEASE_TOKEN }} + run: | + set -eu + apk add --no-cache git + + git init + git remote add origin \ + "http://oauth2:${RELEASE_TOKEN}@172.0.0.29:3000/${GITHUB_REPOSITORY}.git" + git config user.name "gitea-actions[bot]" + git config user.email "gitea-actions@local" + + # Check beta exists before trying to merge into it + if ! git ls-remote --exit-code origin refs/heads/beta >/dev/null 2>&1; then + echo "beta branch does not exist yet — skipping sync" + exit 0 + fi + + git fetch origin master beta + git checkout -b beta origin/beta + + # If beta already contains everything in master (e.g. right after a + # beta→master promotion) there is nothing to do. + if git merge-base --is-ancestor origin/master HEAD; then + echo "beta is already up to date with master — nothing to do" + exit 0 + fi + + if git merge --no-ff origin/master \ + -m "chore: sync beta from master [skip ci]"; then + git push origin beta + echo "✓ beta synced with master" + else + echo "✗ Merge conflict — manual resolution required" + git merge --abort || true + exit 1 + fi