mirror of
https://github.com/CopilotKit/CopilotKit.git
synced 2026-09-14 16:26:20 +08:00
177 lines
5.8 KiB
YAML
177 lines
5.8 KiB
YAML
name: publish / release
|
|
|
|
on:
|
|
workflow_dispatch:
|
|
push:
|
|
branches:
|
|
- main
|
|
|
|
concurrency: ${{ github.workflow }}-${{ github.ref }}
|
|
|
|
permissions:
|
|
contents: write
|
|
pull-requests: write
|
|
|
|
env:
|
|
NX_VERBOSE_LOGGING: true
|
|
|
|
jobs:
|
|
release:
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 20
|
|
steps:
|
|
- name: Checkout Repo
|
|
uses: actions/checkout@v4
|
|
with:
|
|
fetch-depth: 0
|
|
|
|
- name: Setup pnpm
|
|
uses: pnpm/action-setup@v4
|
|
with:
|
|
version: "10.13.1"
|
|
|
|
- name: Setup Node
|
|
uses: actions/setup-node@v4
|
|
with:
|
|
node-version: 20.x
|
|
registry-url: https://registry.npmjs.org
|
|
env:
|
|
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
|
|
- name: Configure npm auth
|
|
run: |
|
|
npm config set "//registry.npmjs.org/:_authToken" "${NPM_TOKEN}"
|
|
env:
|
|
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
|
|
- name: Install Dependencies
|
|
run: pnpm install --frozen-lockfile
|
|
|
|
- name: Validate release package allowlist
|
|
run: pnpm ci:check-release-plan
|
|
|
|
- name: Create Release PR or Publish
|
|
id: changesets
|
|
uses: changesets/action@v1
|
|
with:
|
|
version: pnpm changeset version
|
|
publish: pnpm ci:publish-release
|
|
commit: "chore: version packages"
|
|
title: "chore: version packages"
|
|
createGithubReleases: false
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
|
|
|
|
- name: Get published version
|
|
if: steps.changesets.outputs.published == 'true'
|
|
id: release-version
|
|
run: |
|
|
VERSION=$(node -p "require('./packages/react-core/package.json').version")
|
|
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
|
|
if [[ "$VERSION" == *-* ]]; then
|
|
echo "is_stable=false" >> "$GITHUB_OUTPUT"
|
|
else
|
|
echo "is_stable=true" >> "$GITHUB_OUTPUT"
|
|
fi
|
|
|
|
- name: Configure git user for tagging
|
|
if: steps.changesets.outputs.published == 'true' && steps.release-version.outputs.is_stable == 'true'
|
|
run: |
|
|
git config --global user.email "github-actions[bot]@users.noreply.github.com"
|
|
git config --global user.name "github-actions[bot]"
|
|
|
|
- name: Generate release changelog
|
|
if: steps.changesets.outputs.published == 'true' && steps.release-version.outputs.is_stable == 'true'
|
|
run: |
|
|
node -p "require('./scripts/release/generate-changelog')('${{ steps.release-version.outputs.version }}')" > changelog.txt
|
|
|
|
- name: Ensure stable release tag
|
|
if: steps.changesets.outputs.published == 'true' && steps.release-version.outputs.is_stable == 'true'
|
|
id: release-tag
|
|
run: |
|
|
TAG="v${{ steps.release-version.outputs.version }}"
|
|
if git ls-remote --exit-code --tags origin "refs/tags/$TAG" >/dev/null 2>&1; then
|
|
echo "created=false" >> "$GITHUB_OUTPUT"
|
|
else
|
|
git tag -a "$TAG" -m "Release ${{ steps.release-version.outputs.version }}"
|
|
git push origin "$TAG"
|
|
echo "created=true" >> "$GITHUB_OUTPUT"
|
|
fi
|
|
|
|
- name: Create or update GitHub release
|
|
if: steps.changesets.outputs.published == 'true' && steps.release-version.outputs.is_stable == 'true'
|
|
uses: actions/github-script@v7
|
|
env:
|
|
RELEASE_TAG: v${{ steps.release-version.outputs.version }}
|
|
RELEASE_NAME: v${{ steps.release-version.outputs.version }}
|
|
with:
|
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
script: |
|
|
const fs = require("fs");
|
|
const { owner, repo } = context.repo;
|
|
const tag = process.env.RELEASE_TAG;
|
|
const name = process.env.RELEASE_NAME;
|
|
const body = fs.readFileSync("./changelog.txt", "utf8");
|
|
|
|
try {
|
|
const existing = await github.rest.repos.getReleaseByTag({
|
|
owner,
|
|
repo,
|
|
tag,
|
|
});
|
|
|
|
await github.rest.repos.updateRelease({
|
|
owner,
|
|
repo,
|
|
release_id: existing.data.id,
|
|
tag_name: tag,
|
|
name,
|
|
body,
|
|
draft: false,
|
|
prerelease: false,
|
|
});
|
|
} catch (error) {
|
|
if (error.status !== 404) {
|
|
throw error;
|
|
}
|
|
|
|
await github.rest.repos.createRelease({
|
|
owner,
|
|
repo,
|
|
tag_name: tag,
|
|
name,
|
|
body,
|
|
draft: false,
|
|
prerelease: false,
|
|
});
|
|
}
|
|
|
|
- name: Re-enter next prerelease mode
|
|
if: steps.changesets.outputs.published == 'true' && steps.release-version.outputs.is_stable == 'true'
|
|
run: |
|
|
if [[ -f .changeset/pre.json ]]; then
|
|
echo "Changesets prerelease mode is already enabled."
|
|
exit 0
|
|
fi
|
|
|
|
pnpm changeset pre enter next
|
|
|
|
- name: Create or update prerelease mode PR
|
|
if: steps.changesets.outputs.published == 'true' && steps.release-version.outputs.is_stable == 'true'
|
|
id: prerelease-pr
|
|
uses: peter-evans/create-pull-request@v8
|
|
with:
|
|
token: ${{ secrets.GITHUB_TOKEN }}
|
|
branch: changeset-release/re-enter-next
|
|
delete-branch: true
|
|
add-paths: .changeset/pre.json
|
|
commit-message: "chore: re-enter next prerelease mode"
|
|
title: "chore: re-enter next prerelease mode"
|
|
body: |
|
|
This PR was created automatically after publishing a stable release.
|
|
|
|
It re-enters Changesets prerelease mode for `next` so future release PRs continue on the `next` channel.
|