Skip to content

Promote Main to Release Branches #53

Promote Main to Release Branches

Promote Main to Release Branches #53

Workflow file for this run

name: Promote Main to Release Branches
permissions:
contents: write
on:
workflow_dispatch:
inputs:
target:
description: "Promote target"
required: true
default: "both"
type: choice
options:
- both
- web
- admin
jobs:
generate_tag:
name: Generate HeadVer Tag
uses: ./.github/workflows/headver-tagging.yml
with: {}
create_release:
name: Create GitHub Release
runs-on: ubuntu-latest
needs: generate_tag
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Create Release
uses: ncipollo/release-action@v1
with:
tag: "v${{ needs.generate_tag.outputs.version }}"
release_name: "Release v${{ needs.generate_tag.outputs.version }}"
body: "Automated release created for build v${{ needs.generate_tag.outputs.version }}"
token: ${{ secrets.GITHUB_TOKEN }}
promote_release_branch:
name: Promote main -> release branch(es)
runs-on: ubuntu-latest
needs: create_release
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Promote main branch to selected release branch(es)
run: |
set -euo pipefail
git fetch origin main
MAIN_SHA=$(git rev-parse origin/main)
TARGET="${{ github.event.inputs.target }}"
case "$TARGET" in
web)
RELEASE_BRANCHES="release-web"
;;
admin)
RELEASE_BRANCHES="release-admin"
;;
both)
RELEASE_BRANCHES="release-web release-admin"
;;
*)
echo "Unsupported target: $TARGET" >&2
exit 1
;;
esac
{
echo "## Release Promotion"
echo "- Selected target: $TARGET"
echo "- Promoted main SHA: $MAIN_SHA"
} >> "$GITHUB_STEP_SUMMARY"
for BRANCH in $RELEASE_BRANCHES; do
git fetch origin "$BRANCH" || true
if git show-ref --verify --quiet "refs/remotes/origin/$BRANCH"; then
RELEASE_SHA=$(git rev-parse "origin/$BRANCH")
else
RELEASE_SHA=""
fi
if [ -z "$RELEASE_SHA" ]; then
git push origin origin/main:"refs/heads/$BRANCH"
{
echo "- $BRANCH: created from main"
} >> "$GITHUB_STEP_SUMMARY"
continue
fi
if [ "$MAIN_SHA" = "$RELEASE_SHA" ]; then
{
echo "- $BRANCH: already up to date"
} >> "$GITHUB_STEP_SUMMARY"
continue
fi
if ! git merge-base --is-ancestor "origin/$BRANCH" origin/main; then
echo "$BRANCH is not an ancestor of main. Resolve release history before promotion." >&2
exit 1
fi
git push origin origin/main:"refs/heads/$BRANCH"
{
echo "- $BRANCH: updated"
} >> "$GITHUB_STEP_SUMMARY"
done
{
echo "- Note: Vercel production deploy is triggered by corresponding release branch update"
} >> "$GITHUB_STEP_SUMMARY"