Publish Release #2
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
| name: Publish Release | |
| on: | |
| push: | |
| tags: | |
| - 'v[0-9]+.[0-9]+.[0-9]+*' | |
| workflow_dispatch: | |
| permissions: | |
| contents: read | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.ref }} | |
| cancel-in-progress: true | |
| # This workflow will perform a publish whenever it is triggered | |
| # If you are using a fork, and want to push tags you can disable this workflow in the github ui | |
| jobs: | |
| test: | |
| name: Test | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 15 | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| node-version: [20.x, 22.x, 24.x] | |
| steps: | |
| - name: Git checkout | |
| uses: actions/checkout@v5 | |
| with: | |
| persist-credentials: false | |
| - name: Use Node.js ${{ matrix.node-version }} | |
| uses: actions/setup-node@v6 | |
| with: | |
| node-version: ${{ matrix.node-version }} | |
| - name: Prepare Environment | |
| run: | | |
| corepack enable | |
| yarn install | |
| env: | |
| CI: true | |
| - name: Run tests | |
| run: | | |
| yarn unit | |
| env: | |
| CI: true | |
| prepare: | |
| name: Prepare package | |
| runs-on: ubuntu-latest | |
| outputs: | |
| tag: ${{ steps.do-publish.outputs.tag }} | |
| prerelease: ${{ steps.do-publish.outputs.prerelease }} | |
| timeout-minutes: 15 | |
| permissions: | |
| contents: write | |
| steps: | |
| - uses: actions/checkout@v5 | |
| with: | |
| fetch-depth: 0 | |
| persist-credentials: false | |
| - name: Use Node.js 22.x | |
| uses: actions/setup-node@v6 | |
| with: | |
| node-version: 22.x | |
| - name: Enable corepack | |
| run: corepack enable | |
| - name: Determine publish info | |
| id: do-publish | |
| run: | | |
| # If this run was started manually, choose nightly for main and experimental otherwise. | |
| if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then | |
| if [[ "${{ github.ref }}" == "refs/heads/main" ]]; then | |
| echo "Publishing nightly" | |
| echo "tag=nightly" >> $GITHUB_OUTPUT | |
| else | |
| echo "Publishing experimental" | |
| echo "tag=experimental" >> $GITHUB_OUTPUT | |
| fi | |
| HASH=$(git rev-parse --short HEAD) | |
| TIMESTAMP=$(date +"%Y%m%d-%H%M%S") | |
| PRERELEASE_TAG=nightly-$(echo "${{ github.ref_name }}" | sed -r 's/[^a-z0-9]+/-/gi') | |
| echo "prerelease=${PRERELEASE_TAG}-${TIMESTAMP}-${HASH}" >> $GITHUB_OUTPUT | |
| else | |
| # Otherwise (push by tag), keep the previous logic: compare published vs package.json | |
| PUBLISHED_VERSION=$(yarn npm info --json . | jq -c '.version' -r) | |
| THIS_VERSION=$(node -p "require('./package.json').version") | |
| # Simple bash helper to compare version numbers | |
| verlte() { | |
| [ "$1" = "`echo -e "$1\n$2" | sort -V | head -n1`" ] | |
| } | |
| verlt() { | |
| [ "$1" = "$2" ] && return 1 || verlte $1 $2 | |
| } | |
| if verlt $PUBLISHED_VERSION $THIS_VERSION | |
| then | |
| echo "Publishing latest" | |
| echo "tag=latest" >> $GITHUB_OUTPUT | |
| else | |
| echo "Publishing hotfix" | |
| echo "tag=hotfix" >> $GITHUB_OUTPUT | |
| fi | |
| fi | |
| - name: Prepare build | |
| run: | | |
| yarn install | |
| # Bump to prerelease version if needed | |
| if [ "${{ steps.do-publish.outputs.prerelease }}" != "" ]; then | |
| OLD_VERSION=$(node -p "require('./package.json').version") | |
| yarn version ${OLD_VERSION}-${{ steps.do-publish.outputs.prerelease }} | |
| fi | |
| yarn build | |
| env: | |
| CI: true | |
| - name: Upload release artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: publish-dist | |
| path: | | |
| dist | |
| package.json | |
| retention-days: 1 | |
| if-no-files-found: error | |
| publish: | |
| name: Publish to NPM | |
| needs: | |
| - prepare | |
| - test | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| id-token: write # scoped for as short as possible, as this gives write access to npm | |
| steps: | |
| - uses: actions/checkout@v5 | |
| with: | |
| fetch-depth: 0 | |
| persist-credentials: false | |
| - name: Use Node.js 22.x | |
| uses: actions/setup-node@v6 | |
| with: | |
| node-version: 22.x | |
| - name: Download release artifact | |
| uses: actions/download-artifact@v5 | |
| with: | |
| name: publish-dist | |
| - name: Publish to NPM | |
| run: | | |
| corepack enable | |
| yarn install | |
| # Publish from the extracted release (build output present) | |
| yarn npm publish --access=public --provenance --tag ${{ needs.prepare.outputs.tag }} | |
| NEW_VERSION=$(node -p "require('./package.json').version") | |
| echo "**Published:** $NEW_VERSION" >> $GITHUB_STEP_SUMMARY | |
| env: | |
| CI: true |