Advertisement

← ubon

.github/workflows/release.yml

1.9 KB Download file
name: Release

on:
  push:
    tags:
      - 'v*'

jobs:
  publish:
    runs-on: ubuntu-latest
    permissions:
      # `id-token: write` is required for `npm publish --provenance`.
      # See https://docs.npmjs.com/generating-provenance-statements
      contents: write
      id-token: write
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22
          registry-url: 'https://registry.npmjs.org'
      - run: npm ci
      - run: npm run verify:release
      - name: Check npm publication
        id: npm_package
        run: |
          VERSION="${GITHUB_REF_NAME#v}"
          NAME="$(node -p "require('./package.json').name")"
          if npm view "$NAME@$VERSION" version >/dev/null 2>&1; then
            echo "published=true" >> "$GITHUB_OUTPUT"
          else
            echo "published=false" >> "$GITHUB_OUTPUT"
          fi
      - run: npm publish --access public --provenance
        if: steps.npm_package.outputs.published != 'true'
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
      - name: Create GitHub release
        env:
          GH_TOKEN: ${{ github.token }}
        run: |
          if gh release view "$GITHUB_REF_NAME" >/dev/null 2>&1; then
            echo "Release $GITHUB_REF_NAME already exists; skipping."
            exit 0
          fi
          VERSION="${GITHUB_REF_NAME#v}"
          awk -v version="$VERSION" '
            $0 ~ "^## (\\[" version "\\]|" version ")([[:space:]]|$)" { flag=1; next }
            /^## / { flag=0 }
            flag
          ' CHANGELOG.md > release-notes.md
          if [ ! -s release-notes.md ]; then
            printf 'Release %s\n' "$GITHUB_REF_NAME" > release-notes.md
          fi
          gh release create "$GITHUB_REF_NAME" --title "$GITHUB_REF_NAME" --notes-file release-notes.md