Files
blockly/.github/workflows/publish.yml
T
Maribeth Moffatt cdcdaf3286 chore: add ability to publish prereleases (#9687)
* chore: add ability to publish prereleases

* chore: error if release version is not valid
2026-04-07 16:59:00 -04:00

197 lines
6.7 KiB
YAML

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@v5
with:
ref: ${{ github.ref }}
fetch-depth: 0
- name: Setup Node.js
uses: actions/setup-node@v5
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@v4
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@v5
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@v4
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
- name: Setup Node.js
uses: actions/setup-node@v5
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