You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
178 lines
5.4 KiB
178 lines
5.4 KiB
2 years ago
|
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: Changesets PR
|
||
|
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: Release 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) }}'
|
||
|
});
|