Publish to npm #24
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 to npm | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| dry_run: | |
| description: > | |
| Dry run — print the version and npm dist-tag that would be used; no commit or publish. | |
| Pick the branch to publish from with the "Use workflow from" dropdown. | |
| Non-default branches publish to the npm dist-tag `beta` (not `latest`). | |
| required: false | |
| default: false | |
| type: boolean | |
| skip_versioning: | |
| description: > | |
| Skip version bump — use the version already in the repo | |
| (e.g. retry after npm publish failed but the release commit is already pushed). | |
| required: false | |
| default: false | |
| type: boolean | |
| version_override: | |
| description: > | |
| Optional. Full semver to publish (e.g. 12.6.0-beta.2). Skips conventional bump when set. | |
| Leave empty for automatic versioning. | |
| required: false | |
| default: '' | |
| type: string | |
| permissions: | |
| contents: write | |
| id-token: write | |
| jobs: | |
| ci: | |
| uses: ./.github/workflows/build.yml | |
| version: | |
| needs: ci | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 30 | |
| outputs: | |
| version: ${{ steps.version.outputs.version }} | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v7 | |
| with: | |
| ref: ${{ github.ref }} | |
| fetch-depth: 0 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v6 | |
| with: | |
| node-version: 24.x | |
| registry-url: 'https://registry.npmjs.org' | |
| - name: Install dependencies | |
| if: ${{ !inputs.skip_versioning }} | |
| run: npm ci | |
| - name: Determine version bump | |
| id: bump | |
| if: ${{ !inputs.skip_versioning && inputs.version_override == '' }} | |
| working-directory: packages/blockly | |
| run: | | |
| RELEASE_TYPE=$(npx conventional-recommended-bump --preset conventionalcommits -t blockly-) | |
| echo "release_type=$RELEASE_TYPE" >> "$GITHUB_OUTPUT" | |
| echo "Recommended bump: $RELEASE_TYPE" | |
| - name: Apply version bump | |
| if: ${{ !inputs.skip_versioning }} | |
| working-directory: packages/blockly | |
| env: | |
| DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} | |
| REF_NAME: ${{ github.ref_name }} | |
| RELEASE_TYPE: ${{ steps.bump.outputs.release_type }} | |
| VERSION_OVERRIDE: ${{ inputs.version_override }} | |
| run: | | |
| set -euo pipefail | |
| if [ -n "${VERSION_OVERRIDE}" ]; then | |
| npm version "${VERSION_OVERRIDE}" --no-git-tag-version | |
| exit 0 | |
| fi | |
| if [ "${REF_NAME}" = "${DEFAULT_BRANCH}" ]; then | |
| npm version "${RELEASE_TYPE}" --no-git-tag-version | |
| exit 0 | |
| fi | |
| VERSION=$(node -p "require('./package.json').version") | |
| if [[ "${VERSION}" == *"-beta."* ]]; then | |
| npm version prerelease --preid=beta --no-git-tag-version | |
| else | |
| case "${RELEASE_TYPE}" in | |
| major) npm version premajor --preid=beta --no-git-tag-version ;; | |
| minor) npm version preminor --preid=beta --no-git-tag-version ;; | |
| patch) npm version prepatch --preid=beta --no-git-tag-version ;; | |
| *) | |
| echo "::error title=Invalid release bump::conventional-recommended-bump returned '${RELEASE_TYPE}' (expected major, minor, or patch). Fix commits/tags or set version_override." >&2 | |
| exit 1 | |
| ;; | |
| esac | |
| fi | |
| - name: Read package version | |
| id: version | |
| working-directory: packages/blockly | |
| run: | | |
| VERSION=$(node -p "require('./package.json').version") | |
| echo "version=$VERSION" >> "$GITHUB_OUTPUT" | |
| echo "Version: $VERSION" | |
| - name: Dry run summary | |
| if: ${{ inputs.dry_run }} | |
| run: | | |
| DIST_TAG="${{ github.ref_name == github.event.repository.default_branch && 'latest' || 'beta' }}" | |
| echo "Dry run: would publish version ${{ steps.version.outputs.version }} to npm dist-tag: ${DIST_TAG}" | |
| if [ "${{ github.ref_name }}" != "${{ github.event.repository.default_branch }}" ]; then | |
| echo "GitHub release would be created as prerelease." | |
| fi | |
| - name: Upload versioned files | |
| if: ${{ !inputs.skip_versioning }} | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| name: versioned-files | |
| path: | | |
| packages/blockly/package.json | |
| package-lock.json | |
| publish: | |
| needs: version | |
| runs-on: ubuntu-latest | |
| if: ${{ !inputs.dry_run }} | |
| environment: release | |
| env: | |
| NPM_DIST_TAG: ${{ github.ref_name == github.event.repository.default_branch && 'latest' || 'beta' }} | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v7 | |
| with: | |
| ref: ${{ github.ref }} | |
| fetch-depth: 0 | |
| ssh-key: ${{ secrets.DEPLOY_PRIVATE_KEY }} | |
| - name: Download versioned files | |
| if: ${{ !inputs.skip_versioning }} | |
| uses: actions/download-artifact@v8 | |
| with: | |
| name: versioned-files | |
| - name: Commit and push version bump | |
| if: ${{ !inputs.skip_versioning }} | |
| run: | | |
| git config user.name "github-actions[bot]" | |
| git config user.email "41898282+github-actions[bot]@users.noreply.github.com" | |
| git add packages/blockly/package.json package-lock.json | |
| git commit -m "release: v${{ needs.version.outputs.version }}" | |
| git push | |
| TAG="blockly-v${{ needs.version.outputs.version }}" | |
| git tag "$TAG" | |
| git push origin "refs/tags/$TAG" | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v6 | |
| with: | |
| node-version: 24.x | |
| registry-url: 'https://registry.npmjs.org' | |
| - name: Install dependencies | |
| run: npm ci | |
| - name: Build package | |
| working-directory: packages/blockly | |
| run: npm run package | |
| - name: Publish to npm | |
| working-directory: packages/blockly/dist | |
| run: npm publish --tag "${NPM_DIST_TAG}" --verbose | |
| - name: Create tarball | |
| working-directory: packages/blockly | |
| run: npm pack ./dist | |
| - name: Create GitHub release | |
| working-directory: packages/blockly | |
| env: | |
| GH_TOKEN: ${{ github.token }} | |
| run: | | |
| TARBALL="blockly-${{ needs.version.outputs.version }}.tgz" | |
| if [ "${{ github.ref_name }}" != "${{ github.event.repository.default_branch }}" ]; then | |
| gh release create "blockly-v${{ needs.version.outputs.version }}" "$TARBALL" \ | |
| --repo "$GITHUB_REPOSITORY" \ | |
| --title "blockly-v${{ needs.version.outputs.version }}" \ | |
| --generate-notes \ | |
| --prerelease | |
| else | |
| gh release create "blockly-v${{ needs.version.outputs.version }}" "$TARBALL" \ | |
| --repo "$GITHUB_REPOSITORY" \ | |
| --title "blockly-v${{ needs.version.outputs.version }}" \ | |
| --generate-notes | |
| fi |