123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- # D: Manual Dispatch
- # M: Merge release PR
- # C: Commit
- # โโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโ
- # โDevelopmentโโโDโโโบRC-Unreleasedโ โโโโบFinal-Unreleasedโ
- # โโโโโโโโโโโโโ โโโฌโโโโโโโโโโฒโโ โ โโโฌโโโโโโโโโโโโโฒโโ
- # โ โ โ โ โ
- # M C D M C
- # โ โ โ โ โ
- # โโผโโโโโโโโโโดโ โ โโผโโโโโโโโโโโโโดโ
- # โRC-Releasedโโโโโ โFinal-Releasedโ
- # โโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ
- name: Release Cycle
- on:
- push:
- branches:
- - release-v*
- workflow_dispatch: {}
- concurrency: ${{ github.workflow }}-${{ github.ref }}
- jobs:
- state:
- name: Check state
- permissions:
- pull-requests: read
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v3
- - name: Set up environment
- uses: ./.github/actions/setup
- - id: state
- name: Get state
- uses: actions/github-script@v6
- env:
- TRIGGERING_ACTOR: ${{ github.triggering_actor }}
- with:
- result-encoding: string
- script: await require('./scripts/release/workflow/state.js')({ github, context, core })
- outputs:
- # Job Flags
- start: ${{ steps.state.outputs.start }}
- changesets: ${{ steps.state.outputs.changesets }}
- promote: ${{ steps.state.outputs.promote }}
- publish: ${{ steps.state.outputs.publish }}
- merge: ${{ steps.state.outputs.merge }}
- # Global variables
- is_prerelease: ${{ steps.state.outputs.is_prerelease }}
- start:
- needs: state
- name: Start new release candidate
- permissions:
- contents: write
- actions: write
- if: needs.state.outputs.start == 'true'
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v3
- - name: Set up environment
- uses: ./.github/actions/setup
- - run: bash scripts/git-user-config.sh
- - id: start
- name: Create branch with release candidate
- run: bash scripts/release/workflow/start.sh
- - name: Re-run workflow
- uses: actions/github-script@v6
- env:
- REF: ${{ steps.start.outputs.branch }}
- with:
- script: await require('./scripts/release/workflow/rerun.js')({ github, context })
- promote:
- needs: state
- name: Promote to final release
- permissions:
- contents: write
- actions: write
- if: needs.state.outputs.promote == 'true'
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v3
- - name: Set up environment
- uses: ./.github/actions/setup
- - run: bash scripts/git-user-config.sh
- - name: Exit prerelease state
- if: needs.state.outputs.is_prerelease == 'true'
- run: bash scripts/release/workflow/exit-prerelease.sh
- - name: Re-run workflow
- uses: actions/github-script@v6
- with:
- script: await require('./scripts/release/workflow/rerun.js')({ github, context })
- changesets:
- needs: state
- name: Update PR to release
- permissions:
- contents: write
- pull-requests: write
- if: needs.state.outputs.changesets == 'true'
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v3
- with:
- fetch-depth: 0 # To get all tags
- - name: Set up environment
- uses: ./.github/actions/setup
- - name: Set release title
- uses: actions/github-script@v6
- with:
- result-encoding: string
- script: await require('./scripts/release/workflow/set-changesets-pr-title.js')({ core })
- - name: Create PR
- uses: changesets/action@v1
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- PRERELEASE: ${{ needs.state.outputs.is_prerelease }}
- with:
- version: npm run version
- title: ${{ env.TITLE }}
- commit: ${{ env.TITLE }}
- body: | # Wait for support on this https://github.com/changesets/action/pull/250
- This is an automated PR for releasing ${{ github.repository }}
- Check [CHANGELOG.md](${{ github.repository }}/CHANGELOG.md)
- publish:
- needs: state
- name: Publish to npm
- environment: npm
- permissions:
- contents: write
- if: needs.state.outputs.publish == 'true'
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v3
- - name: Set up environment
- uses: ./.github/actions/setup
- - id: pack
- name: Pack
- run: bash scripts/release/workflow/pack.sh
- env:
- PRERELEASE: ${{ needs.state.outputs.is_prerelease }}
- - name: Tag
- run: npx changeset tag
- - name: Publish
- run: bash scripts/release/workflow/publish.sh
- env:
- NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
- TARBALL: ${{ steps.pack.outputs.tarball }}
- TAG: ${{ steps.pack.outputs.tag }}
- - name: Push tags
- run: git push --tags
- - name: Create Github Release
- uses: actions/github-script@v6
- env:
- PRERELEASE: ${{ needs.state.outputs.is_prerelease }}
- with:
- script: await require('./scripts/release/workflow/github-release.js')({ github, context })
- merge:
- needs: state
- name: Create PR back to master
- permissions:
- contents: write
- pull-requests: write
- if: needs.state.outputs.merge == 'true'
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v3
- with:
- fetch-depth: 0 # All branches
- - name: Set up environment
- uses: ./.github/actions/setup
- - run: bash scripts/git-user-config.sh
- - name: Create branch to merge
- run: bash scripts/release/workflow/prepare-release-merge.sh
- - name: Create PR back to master
- uses: actions/github-script@v6
- with:
- script: |
- await github.rest.pulls.create({
- owner: context.repo.owner,
- repo: context.repo.repo,
- head: 'merge/${{ github.ref_name }}',
- base: 'master',
- title: '${{ format('Merge {0} branch', github.ref_name) }}'
- });
|