name: π CD - Publish to NPM
on:
release:
types: [published]
workflow_dispatch:
inputs:
version:
description: 'Version to publish (if different from package.json)'
required: false
type: string
jobs:
publish:
name: π¦ Publish to NPM
runs-on: ubuntu-latest
if: github.repository_owner == 'nazruden'
steps:
- name: π₯ Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: π’ Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm'
registry-url: 'https://registry.npmjs.org'
- name: π¦ Install dependencies
run: npm ci
- name: π Security audit
run: npm audit --audit-level high
- name: π§ͺ Run tests
run: npm test
- name: ποΈ Build project
run: npm run build
- name: π Verify build output
run: |
ls -la dist/
node -e "console.log('Build verification:', require('./package.json').name)"
- name: π·οΈ Extract version
id: version
run: |
if [ "${{ github.event.inputs.version }}" != "" ]; then
echo "version=${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT
else
echo "version=$(node -pe "require('./package.json').version")" >> $GITHUB_OUTPUT
fi
- name: π·οΈ Verify version consistency
run: |
PACKAGE_VERSION=$(node -pe "require('./package.json').version")
TAG_VERSION=${GITHUB_REF#refs/tags/v}
echo "Package version: $PACKAGE_VERSION"
echo "Tag version: $TAG_VERSION"
if [ "$PACKAGE_VERSION" != "$TAG_VERSION" ] && [ "${{ github.event_name }}" == "release" ]; then
echo "β Version mismatch between package.json ($PACKAGE_VERSION) and tag ($TAG_VERSION)"
exit 1
fi
- name: π Check if version exists on NPM
run: |
VERSION="${{ steps.version.outputs.version }}"
if npm view @nazruden/clickup-server@$VERSION version >/dev/null 2>&1; then
echo "β Version $VERSION already exists on NPM"
exit 1
else
echo "β
Version $VERSION is available"
fi
- name: π¦ Publish to NPM
run: npm publish --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
- name: π Success notification
run: |
echo "π Successfully published @nazruden/clickup-server@${{ steps.version.outputs.version }} to NPM!"
echo "π¦ Package: https://www.npmjs.com/package/@nazruden/clickup-server"
github-release:
name: π Update GitHub Release
runs-on: ubuntu-latest
needs: publish
if: github.event_name == 'release'
steps:
- name: π₯ Checkout code
uses: actions/checkout@v4
- name: π Update release notes
uses: actions/github-script@v7
with:
script: |
const { owner, repo } = context.repo;
const release = await github.rest.repos.getReleaseByTag({
owner,
repo,
tag: context.ref.replace('refs/tags/', '')
});
const npmUrl = `https://www.npmjs.com/package/@nazruden/clickup-server`;
const updatedBody = `${release.data.body}\n\n---\n\nπ¦ **NPM Package:** ${npmUrl}\nπ **Installation:** \`npm install @nazruden/clickup-server\``;
await github.rest.repos.updateRelease({
owner,
repo,
release_id: release.data.id,
body: updatedBody
});