ci: use package.json version, skip if already published #23
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 Package and Create Release | |
| on: | |
| push: | |
| branches: | |
| - main | |
| workflow_dispatch: | |
| jobs: | |
| publish: | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: write | |
| packages: write | |
| id-token: write | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: '18' | |
| registry-url: 'https://registry.npmjs.org' | |
| - name: Install dependencies | |
| run: npm ci | |
| - name: Get package version | |
| id: package-version | |
| run: echo "version=$(node -p "require('./package.json').version")" >> $GITHUB_OUTPUT | |
| - name: Check if version already published | |
| id: check-version | |
| run: | | |
| PUBLISHED=$(npm view claude-code-usage@${{ steps.package-version.outputs.version }} version 2>/dev/null || echo "") | |
| if [ "$PUBLISHED" = "${{ steps.package-version.outputs.version }}" ]; then | |
| echo "skip=true" >> $GITHUB_OUTPUT | |
| echo "Version ${{ steps.package-version.outputs.version }} already published, skipping..." | |
| else | |
| echo "skip=false" >> $GITHUB_OUTPUT | |
| echo "Version ${{ steps.package-version.outputs.version }} not published yet, will publish..." | |
| fi | |
| - name: Test package | |
| if: steps.check-version.outputs.skip == 'false' | |
| run: npm test || echo "No tests specified" | |
| - name: Publish to npm (Trusted Publishing) | |
| if: steps.check-version.outputs.skip == 'false' | |
| run: npm publish --provenance --access public | |
| - name: Setup Node.js for GitHub Packages | |
| if: steps.check-version.outputs.skip == 'false' | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: '18' | |
| registry-url: 'https://npm.pkg.github.com' | |
| - name: Configure package for GitHub Packages | |
| if: steps.check-version.outputs.skip == 'false' | |
| run: | | |
| cp package.json package.json.backup | |
| node -e " | |
| const pkg = require('./package.json'); | |
| pkg.name = '@evanlong-me/claude-code-usage'; | |
| pkg.publishConfig = { registry: 'https://npm.pkg.github.com' }; | |
| require('fs').writeFileSync('package.json', JSON.stringify(pkg, null, 2)); | |
| " | |
| - name: Publish to GitHub Packages | |
| if: steps.check-version.outputs.skip == 'false' | |
| run: npm publish | |
| env: | |
| NODE_AUTH_TOKEN: ${{ github.token }} | |
| - name: Restore original package.json | |
| if: steps.check-version.outputs.skip == 'false' | |
| run: mv package.json.backup package.json | |
| - name: Create Git tag | |
| if: steps.check-version.outputs.skip == 'false' | |
| run: | | |
| git config --local user.email "action@github.com" | |
| git config --local user.name "GitHub Action" | |
| git tag -a "v${{ steps.package-version.outputs.version }}" -m "Release v${{ steps.package-version.outputs.version }}" || true | |
| git push origin "v${{ steps.package-version.outputs.version }}" || true | |
| - name: Generate changelog | |
| if: steps.check-version.outputs.skip == 'false' | |
| id: changelog | |
| run: | | |
| echo "changelog<<EOF" >> $GITHUB_OUTPUT | |
| PREV_TAG=$(git describe --tags --abbrev=0 HEAD~1 2>/dev/null || echo "") | |
| if [ -n "$PREV_TAG" ]; then | |
| git log --pretty=format:"- %s" $PREV_TAG..HEAD >> $GITHUB_OUTPUT | |
| else | |
| git log --pretty=format:"- %s" -10 >> $GITHUB_OUTPUT | |
| fi | |
| echo "" >> $GITHUB_OUTPUT | |
| echo "EOF" >> $GITHUB_OUTPUT | |
| - name: Create GitHub Release | |
| if: steps.check-version.outputs.skip == 'false' | |
| uses: softprops/action-gh-release@v1 | |
| with: | |
| tag_name: v${{ steps.package-version.outputs.version }} | |
| name: Release v${{ steps.package-version.outputs.version }} | |
| body: | | |
| ## Changes in v${{ steps.package-version.outputs.version }} | |
| ${{ steps.changelog.outputs.changelog }} | |
| ## Installation | |
| ```bash | |
| # From npm | |
| npm install -g claude-code-usage | |
| # From GitHub Packages | |
| npm install -g @evanlong-me/claude-code-usage --registry=https://npm.pkg.github.com | |
| ``` | |
| ## Usage | |
| ```bash | |
| ccu | |
| ``` | |
| draft: false | |
| prerelease: false |