Add homepage to core packages #132
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Run `pnpm changeset` before running this workflow | |
name: Release – Stable | |
permissions: | |
contents: write | |
packages: write | |
pull-requests: write | |
id-token: write | |
deployments: write | |
on: | |
push: | |
branches: | |
- main | |
concurrency: ${{ github.workflow }}-${{ github.ref }} | |
jobs: | |
release: | |
name: Release – Stable | |
runs-on: ubuntu-22.04 | |
environment: stable | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: ./.github/actions/setup | |
with: | |
node-version: '18' | |
- name: Build and test | |
run: | | |
pnpm turbo run compile | |
pnpm turbo run test | |
- name: Publish packages to npm | |
id: changesets | |
uses: changesets/action@v1 | |
with: | |
publish: pnpm -r --filter ./programs/cli --filter ./programs/create --filter ./programs/develop publish --access public --provenance --no-git-checks | |
commit: "chore: version packages" | |
title: "chore: version packages" | |
createGithubReleases: true | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
NPM_TOKEN: ${{ secrets.NPM_TOKEN }} | |
- name: Debug npm auth (stable) | |
if: steps.changesets.outputs.published != 'true' | |
env: | |
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} | |
run: | | |
echo "Registry: $(npm config get registry)" | |
npm whoami || true | |
test -n "$NODE_AUTH_TOKEN" || (echo "NODE_AUTH_TOKEN missing" && exit 1) | |
- name: Collect versions | |
id: versions | |
run: | | |
node -e "const fs=require('fs');function v(p){return JSON.parse(fs.readFileSync(p,'utf8')).version;}const obj={'extension':v('programs/cli/package.json'),'extension-create':v('programs/create/package.json'),'extension-develop':v('programs/develop/package.json')};process.stdout.write('versions='+JSON.stringify(obj));" >> $GITHUB_OUTPUT | |
- name: Promote next version to latest dist-tag (fallback) | |
if: steps.changesets.outputs.published != 'true' | |
env: | |
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} | |
V_EXT: ${{ fromJson(steps.versions.outputs.versions).extension }} | |
V_CREATE: ${{ fromJson(steps.versions.outputs.versions)['extension-create'] }} | |
V_DEV: ${{ fromJson(steps.versions.outputs.versions)['extension-develop'] }} | |
run: | | |
set -e | |
echo "Promoting dist-tags to latest if versions exist on registry..." | |
npm dist-tag add extension@${V_EXT} latest || true | |
npm dist-tag add extension-create@${V_CREATE} latest || true | |
npm dist-tag add extension-develop@${V_DEV} latest || true | |
# Note: We now append aggregated changelog to the GitHub Release body instead of committing root CHANGELOG. | |
- name: Render aggregated changelog | |
if: steps.changesets.outputs.published == 'true' | |
id: agg | |
run: | | |
node ./scripts/render-aggregated-changelog.cjs > aggregated.md || true | |
echo "body<<EOF" >> $GITHUB_OUTPUT | |
echo "### Aggregated package changelog" >> $GITHUB_OUTPUT | |
cat aggregated.md >> $GITHUB_OUTPUT | |
echo "EOF" >> $GITHUB_OUTPUT | |
- name: Append to latest GitHub Release body | |
if: steps.changesets.outputs.published == 'true' | |
uses: actions/github-script@v7 | |
env: | |
AGG_BODY: ${{ steps.agg.outputs.body }} | |
with: | |
script: | | |
const { owner, repo } = context.repo; | |
const latest = await github.rest.repos.getLatestRelease({ owner, repo }); | |
const current = latest.data.body || ''; | |
const agg = process.env.AGG_BODY || ''; | |
const toName = (tag) => { | |
const version = (tag || '').replace(/^v/, ''); | |
const d = new Date(); | |
const month = d.toLocaleString('en-US', { month: 'long' }); | |
const day = String(d.getDate()).padStart(2, '0'); | |
const year = d.getFullYear(); | |
return `${version} (${month} ${day}, ${year})`; | |
}; | |
const releaseName = toName(latest.data.tag_name || latest.data.name || ''); | |
await github.rest.repos.updateRelease({ | |
owner, repo, | |
release_id: latest.data.id, | |
body: current ? `${current}\n\n${agg}` : agg, | |
name: releaseName, | |
draft: false, | |
prerelease: false | |
}); | |
- name: Create deployment (stable) | |
if: steps.changesets.outputs.published == 'true' | |
uses: actions/github-script@v7 | |
env: | |
VERSIONS: ${{ steps.versions.outputs.versions }} | |
with: | |
script: | | |
const { owner, repo } = context.repo; | |
const payload = { channel: 'stable', versions: JSON.parse(process.env.VERSIONS || '{}') }; | |
const ref = context.sha; | |
const dep = await github.rest.repos.createDeployment({ | |
owner, repo, ref, | |
environment: 'stable', | |
auto_merge: false, | |
required_contexts: [], | |
transient_environment: false, | |
description: `Published to npm (stable)`, | |
payload: JSON.stringify(payload) | |
}); | |
const ext = payload.versions['extension']; | |
const envUrl = ext ? `https://www.npmjs.com/package/extension/v/${ext}` : undefined; | |
const desc = `extension ${payload.versions['extension']}, extension-create ${payload.versions['extension-create']}, extension-develop ${payload.versions['extension-develop']}`; | |
await github.rest.repos.createDeploymentStatus({ | |
owner, repo, deployment_id: dep.data.id, | |
state: 'success', | |
log_url: `${context.serverUrl}/${owner}/${repo}/actions/runs/${context.runId}`, | |
environment_url: envUrl, | |
description: desc | |
}) |