Promote Main to Release Branches #47
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Promote Main to Release | |
| permissions: | |
| contents: write | |
| on: | |
| workflow_dispatch: | |
| 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 | |
| runs-on: ubuntu-latest | |
| needs: create_release | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - name: Promote main branch to release branch | |
| run: | | |
| set -euo pipefail | |
| git fetch origin main | |
| git fetch origin release || true | |
| MAIN_SHA=$(git rev-parse origin/main) | |
| if git show-ref --verify --quiet refs/remotes/origin/release; then | |
| RELEASE_SHA=$(git rev-parse origin/release) | |
| else | |
| RELEASE_SHA="" | |
| fi | |
| if [ -z "$RELEASE_SHA" ]; then | |
| git push origin origin/main:refs/heads/release | |
| { | |
| echo "## Release Promotion" | |
| echo "- Status: success (release branch created)" | |
| echo "- Promoted main SHA: $MAIN_SHA" | |
| echo "- Target branch: release" | |
| echo "- Note: Vercel production deploy is triggered by release branch update" | |
| } >> "$GITHUB_STEP_SUMMARY" | |
| exit 0 | |
| fi | |
| if [ "$MAIN_SHA" = "$RELEASE_SHA" ]; then | |
| { | |
| echo "## Release Promotion" | |
| echo "- Status: skipped (release is already up to date)" | |
| echo "- main: $MAIN_SHA" | |
| } >> "$GITHUB_STEP_SUMMARY" | |
| exit 0 | |
| fi | |
| if ! git merge-base --is-ancestor origin/release origin/main; then | |
| echo "release branch is not an ancestor of main. Resolve release history before promotion." >&2 | |
| exit 1 | |
| fi | |
| git push origin origin/main:refs/heads/release | |
| { | |
| echo "## Release Promotion" | |
| echo "- Status: success" | |
| echo "- Promoted main SHA: $MAIN_SHA" | |
| echo "- Target branch: release" | |
| echo "- Note: Vercel production deploy is triggered by release branch update" | |
| } >> "$GITHUB_STEP_SUMMARY" |