diff --git a/.github/workflows/publish_github.yml b/.github/workflows/publish_github.yml index 666654b..2267878 100644 --- a/.github/workflows/publish_github.yml +++ b/.github/workflows/publish_github.yml @@ -4,6 +4,12 @@ on: push: tags: - "v*" + workflow_dispatch: + inputs: + release_tag: + description: Existing tag to publish (must match package.json version, e.g. v1.1.0) + required: true + type: string permissions: id-token: write # Required for OIDC @@ -14,13 +20,48 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 + with: + ref: ${{ inputs.release_tag || github.ref }} + + - uses: pnpm/action-setup@v4 - uses: actions/setup-node@v6 with: node-version: "24" registry-url: "https://registry.npmjs.org" - package-manager-cache: false # never use caching in release builds - - run: npm ci - - run: npm run build --if-present - - run: npm test - - run: npm publish # Or: npm stage publish + scope: "@warkypublic" + cache: pnpm + + - name: Verify release tag + env: + EVENT_NAME: ${{ github.event_name }} + TRIGGER_REF: ${{ github.ref }} + RELEASE_TAG: ${{ inputs.release_tag }} + run: | + node --input-type=module <<'JS' + import { readFileSync } from 'node:fs'; + const { version } = JSON.parse(readFileSync('package.json', 'utf8')); + const tag = process.env.EVENT_NAME === 'workflow_dispatch' + ? process.env.RELEASE_TAG + : process.env.TRIGGER_REF.replace(/^refs\/tags\//, ''); + if (tag !== `v${version}`) { + throw new Error(`Release tag must be v${version}; received ${tag || '(empty)'}`); + } + JS + + - run: pnpm install --frozen-lockfile + - run: pnpm test + - run: pnpm check:bundle + + - name: Publish to npm + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + run: | + set -eu + : "${NODE_AUTH_TOKEN:?Set the NPM_TOKEN Actions secret with npm publish access}" + version=$(node -p "require('./package.json').version") + case "$version" in + *-*) dist_tag=next ;; + *) dist_tag=latest ;; + esac + pnpm publish --no-git-checks --tag "$dist_tag"