lsd/.github/workflows/release-pr.yml

145 lines
5.2 KiB
YAML

name: Release PR
on:
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+-beta.[0-9]+'
- 'v[0-9]+.[0-9]+.[0-9]+-alpha.[0-9]+'
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}
cancel-in-progress: true
jobs:
delete-release-prs:
runs-on: ubuntu-latest
steps:
- uses: actions/github-script@v6
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const { data: pullRequests } = await github.rest.pulls.list({
owner: context.repo.owner,
repo: context.repo.repo,
state: "open",
});
for (const pr of pullRequests) {
if (
(pr.head.ref === "release-beta" || pr.head.ref === "release-stable") &&
pr.user.login.includes("github-actions")
) {
await github.rest.pulls.update({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: pr.number,
state: "closed",
});
console.log(`Closed PR #${pr.number}`);
}
}
create-release-pr:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
fetch-tags: 1
ref: main
- name: Extract version from lerna.json
run: echo "value=$(jq .version lerna.json -r)" >> $GITHUB_OUTPUT
id: current_version
- name: Determine Release type
run: echo "value=$([[ ${{ steps.current_version.outputs.value }} =~ alpha ]] && echo "beta" || echo "stable")" >> $GITHUB_OUTPUT
id: release_type
- uses: actions/setup-node@v3
with:
node-version: '18'
cache: 'yarn'
- name: Install dependencies
run: |
yarn install --frozen-lockfile
yarn lerna link
- name: Bump versions
id: bump
run: |
git config --global user.name 'github-actions';
git config --global user.email 'github-actions@users.noreply.github.com';
echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > .npmrc;
mkdir ${{ runner.temp }}/main;
export type='${{ steps.release_type.outputs.value }}';
export branch=release-$type;
echo "RELEASE_BRANCH=$branch" >> $GITHUB_ENV;
git switch -C $branch;
if [[ $type == 'beta' ]]; then
out=$(yarn -s lerna version prerelease --no-private --conventional-commits --conventional-prerelease --preid=beta --no-git-tag-version --force-publish --yes);
else
out=$(yarn -s lerna version --conventional-commits --conventional-graduate --no-git-tag-version --yes);
fi;
changes=$(echo "$out" | sed -n '/Changes:/,$p' | sed -n '/^ - .* => .*$/p');
echo "changes<<EOF" >> $GITHUB_OUTPUT;
echo "$changes" >> $GITHUB_OUTPUT;
echo "EOF" >> $GITHUB_OUTPUT;
env:
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
- name: Extract version from lerna.json
run: echo "value=$(jq .version lerna.json -r)" >> $GITHUB_OUTPUT
id: next_version
- name: Commit changes
run: |
git add .;
git restore --staged .npmrc;
git commit -m "chore: release v${{ steps.next_version.outputs.value }}";
git push origin $RELEASE_BRANCH --force;
- name: Get release commit
run: |
COMMIT_HASH=$(git rev-parse --verify HEAD);
COMMIT_MESSAGE=$(git log --format=%B -n 1 $COMMIT_HASH);
echo "sha=$COMMIT_HASH" >> $GITHUB_OUTPUT
echo "head=$RELEASE_BRANCH" >> $GITHUB_OUTPUT
echo "message=$COMMIT_MESSAGE" >> $GITHUB_OUTPUT
id: release_commit
- name: Find latest stable release
id: latest_stable_release
run: |
echo "tag=$(git tag | grep -v -- "-alpha" | grep -v -- "-beta" | sort -V | tail -2 | head -1)" > $GITHUB_OUTPUT;
- name: Generate changelog
id: changelog
run: |
# TODO
env:
GITHUB_AUTH: ${{ secrets.GITHUB_TOKEN }}
- uses: actions/github-script@v6
id: pr
env:
CHANGES: ${{ steps.bump.outputs.changes }}
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const type = "${{ steps.release_type.outputs.value }}";
const head = "${{ steps.release_commit.outputs.head }}";
const title = "${{ steps.release_commit.outputs.message }}";
const body = `This PR will bump the following packages:\n\`\`\`\n${process.env.CHANGES}\n\`\`\`\n\nPlease review and test the code, before merging this PR. You can also check the changelog for more details on what has changed.\n\n**Warning**: Once you merge this PR, the changes will be published to the npm registry and cannot be undone. Please make sure you are confident about the quality and stability of the code before publishing.`;
const res = await github.rest.pulls.create({
body,
head,
title,
base: "main",
repo: context.repo.repo,
owner: context.repo.owner,
});