use-m
Version:
use-m: dynamically import any JavaScript module
140 lines (123 loc) • 4.6 kB
YAML
name: CI/CD
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
check-version:
name: Check if version needs publishing
runs-on: ubuntu-latest
outputs:
should-publish: ${{ steps.npm_check.outputs.exists == 'false' }}
version: ${{ steps.package_version.outputs.version }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20.x
- name: Get package version
id: package_version
run: |
VERSION=$(node -p "require('./package.json').version")
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "Package version: $VERSION"
- name: Check if version exists on npm
id: npm_check
run: |
if npm view use-m@${{ steps.package_version.outputs.version }} version 2>/dev/null; then
echo "exists=true" >> $GITHUB_OUTPUT
echo "Version ${{ steps.package_version.outputs.version }} already exists on npm - skipping tests and publish"
else
echo "exists=false" >> $GITHUB_OUTPUT
echo "Version ${{ steps.package_version.outputs.version }} does not exist on npm - will run tests and publish"
fi
test:
name: Run Tests
needs: check-version
if: needs.check-version.outputs.should-publish == 'true'
uses: ./.github/workflows/test.yml
publish:
name: Publish to npm
needs: [check-version, test]
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main' && github.event_name == 'push' && needs.check-version.outputs.should-publish == 'true'
outputs:
published: ${{ needs.check-version.outputs.should-publish }}
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.x
registry-url: 'https://registry.npmjs.org'
- name: Install dependencies
run: npm ci
- name: Publish to npm
run: npm publish --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
- name: Create git tag
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
git tag -a v${{ needs.check-version.outputs.version }} -m "Release v${{ needs.check-version.outputs.version }}"
git push origin v${{ needs.check-version.outputs.version }}
create-release:
name: Create GitHub Release
needs: [check-version, publish]
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main' && github.event_name == 'push' && needs.publish.outputs.published == 'true'
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Check if tag exists
id: check_tag
run: |
if git rev-parse v${{ needs.check-version.outputs.version }} >/dev/null 2>&1; then
echo "exists=true" >> $GITHUB_OUTPUT
else
echo "exists=false" >> $GITHUB_OUTPUT
fi
- name: Generate release notes
if: steps.check_tag.outputs.exists == 'true'
id: release_notes
run: |
VERSION=${{ needs.check-version.outputs.version }}
echo "# Release v${VERSION}" > release_notes.md
echo "" >> release_notes.md
echo "[](https://www.npmjs.com/package/use-m/v/${VERSION})" >> release_notes.md
echo "" >> release_notes.md
echo "## What's Changed" >> release_notes.md
# Get commits since last tag
LAST_TAG=$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || echo "")
if [ -n "$LAST_TAG" ]; then
git log --pretty=format:"- %s (%h)" ${LAST_TAG}..HEAD >> release_notes.md
else
git log --pretty=format:"- %s (%h)" -10 >> release_notes.md
fi
echo "" >> release_notes.md
echo "## Installation" >> release_notes.md
echo '```bash' >> release_notes.md
echo "npm install use-m@${VERSION}" >> release_notes.md
echo '```' >> release_notes.md
- name: Create GitHub Release
if: steps.check_tag.outputs.exists == 'true'
uses: actions/create-release@v1
with:
tag_name: v${{ needs.check-version.outputs.version }}
release_name: v${{ needs.check-version.outputs.version }}
body_path: release_notes.md
draft: false
prerelease: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}