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) }}' });