← ubon
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