diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml new file mode 100644 index 0000000..64334fe --- /dev/null +++ b/.github/actions/setup/action.yml @@ -0,0 +1,15 @@ +name: Setup project +description: Sets up the repo code, Node.js, and npm dependencies + +runs: + using: composite + steps: + - name: Set up Node.js + uses: actions/setup-node@v3 + with: + node-version: '16.x' + cache: npm + registry-url: https://registry.npmjs.org + - name: Install npm dependencies + run: npm ci + shell: bash diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml deleted file mode 100644 index c1b229d..0000000 --- a/.github/workflows/publish.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: Publish - -on: - release: - types: [created] - -jobs: - publish-npm: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: 14 - registry-url: https://registry.npmjs.org/ - cache: npm - - run: npm ci - - run: npm test - - run: npm version ${TAG_NAME} --git-tag-version=false - env: - TAG_NAME: ${{ github.event.release.tag_name }} - - run: npm whoami; npm --ignore-scripts publish - env: - NODE_AUTH_TOKEN: ${{secrets.npm_token}} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..9aca792 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,85 @@ +name: Release and publish + +# Inspired by https://github.com/MylesBorins/node-osc/blob/959b9c83972a67390a351d333b23db3972ca7b46/.github/workflows/bump-version.yml and +# https://github.com/MylesBorins/node-osc/blob/74b563c83736a04c4a37acbff9d7bb1f01a00f57/.github/workflows/create-release.yml + +on: + workflow_dispatch: + inputs: + version: + description: Semver descriptor for new version ("major", "minor", or "patch") + required: true + +jobs: + bump-version: + name: Bump package version + runs-on: ubuntu-latest + outputs: + new-tag: ${{ steps.new-tag.outputs.new-tag }} + steps: + - name: Checkout ref + uses: actions/checkout@v2 + - name: Preparation + uses: ./.github/actions/setup + - name: Perform last-minute tests + run: npm test + - name: Configure Git + run: | + git config user.name "GitHub Actions" + git config user.email "actions@github.com" + - name: Bump package version + run: npm version ${{ github.event.inputs.version }} + - name: Push back to GitHub + run: git push origin main --follow-tags + - name: Set output to new version + id: new-tag + run: | + version=$(jq -r .version < package.json) + echo "::set-output name=new-tag::v$version" + create-release: + name: Create GitHub release + runs-on: ubuntu-latest + needs: bump-version + steps: + - name: Checkout ref + uses: actions/checkout@v2 + with: + ref: ${{ needs.bump-version.outputs.new-tag }} + - name: Preparation + uses: ./.github/actions/setup + - name: Create release + uses: actions/github-script@v5 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + await github.request(`POST /repos/${{ github.repository }}/releases`, { + tag_name: "${{ needs.bump-version.outputs.new-tag }}", + generate_release_notes: true + }) + publish: + name: Publish + runs-on: ubuntu-latest + needs: [bump-version, create-release] + steps: + - name: Checkout ref + uses: actions/checkout@v3 + with: + ref: ${{ needs.bump-version.outputs.new-tag }} + - name: Preparation + uses: ./.github/actions/setup + - name: Setup npm registry + uses: actions/setup-node@v3 + with: + registry-url: 'https://registry.npmjs.org' + - name: Publish to npm + run: npm publish + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + - name: Setup GHPR + uses: actions/setup-node@v2 + with: + registry-url: 'https://npm.pkg.github.com' + - name: Publish to GHPR + run: npm publish + env: + NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}