Publish packages to NPM #3
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 packages to NPM | |
| permissions: | |
| id-token: write | |
| contents: write | |
| pull-requests: write | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| release_type: | |
| description: 'Release type: "minor" increments the minor version (e.g., 1.53.0 → 1.54.0), "patch" increments the patch version (e.g., 1.54.0 → 1.54.1), "next" publishes a pre-release version (e.g., 1.55.0-next.17).' | |
| required: true | |
| type: choice | |
| options: | |
| - 'minor' | |
| - 'patch' | |
| - 'next' | |
| default: 'next' | |
| is_patch_to_previous: | |
| description: 'Patch a previous release branch: Enable this to publish a patch to an older version branch (e.g., patching 1.53.x when 1.54.x is the latest). Must be used with release_type="patch". Leave disabled for publishing to the current latest or next version.' | |
| required: true | |
| type: boolean | |
| default: false | |
| schedule: | |
| - cron: "0 0 * * 1" # Publish next version (default) every monday at midnight | |
| jobs: | |
| publish: | |
| name: Perform Publishing | |
| runs-on: ubuntu-22.04 | |
| timeout-minutes: 60 | |
| steps: | |
| - name: Validate Inputs | |
| shell: bash | |
| run: | | |
| if [[ "${{ inputs.is_patch_to_previous }}" == "true" && "${{ inputs.release_type }}" != "patch" ]]; then | |
| echo "Error: When 'is_patch_to_previous' is enabled, release_type must be 'patch'" | |
| exit 1 | |
| fi | |
| echo "Input validation passed" | |
| - name: Checkout | |
| uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0 | |
| with: | |
| # To fetch all history for all branches and tags. | |
| # Required for lerna to determine the version of the next package. | |
| fetch-depth: 0 | |
| - name: Use Node.js 22.x | |
| uses: actions/setup-node@1a4442cacd436585916779262731d5b162bc6ec7 # v3.8.2 | |
| with: | |
| node-version: 22.x | |
| registry-url: "https://registry.npmjs.org" | |
| - name: Use Python 3.13 | |
| uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 | |
| with: | |
| python-version: "3.13" | |
| - name: Install and build | |
| shell: bash | |
| run: | | |
| npm ci | |
| npm run build | |
| env: | |
| NODE_OPTIONS: --max_old_space_size=4096 | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # https://github.com/microsoft/vscode-ripgrep/issues/9 | |
| - name: Publish to NPM (Latest) | |
| # We only publish minor or patch releases for the current version as latest, never for older patches or next versions. | |
| if: ${{ (inputs.release_type == 'patch' || inputs.release_type == 'minor') && !inputs.is_patch_to_previous }} | |
| shell: bash | |
| run: | | |
| npm run publish:latest ${{ inputs.release_type }} | |
| npm run publish:check | |
| env: | |
| NPM_CONFIG_PROVENANCE: "true" | |
| - name: Publish to NPM (Patch - To Previous Version) | |
| if: ${{ inputs.release_type == 'patch' && inputs.is_patch_to_previous }} | |
| shell: bash | |
| run: | | |
| npm run publish:patch ${{ inputs.release_type }} | |
| npm run publish:check | |
| env: | |
| NPM_CONFIG_PROVENANCE: "true" | |
| - name: Publish to NPM (Next) | |
| if: ${{ inputs.release_type == 'next' }} | |
| shell: bash | |
| run: | | |
| npm run publish:next | |
| env: | |
| NPM_CONFIG_PROVENANCE: "true" | |
| - name: Submit PR for package updates | |
| if: ${{ inputs.release_type != 'next' }} | |
| shell: bash | |
| env: | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| run: | | |
| # Configure git | |
| git config --local user.email "[email protected]" | |
| git config --local user.name "eclipse-theia-bot" | |
| # Get the version from lerna.json after publishing | |
| VERSION=$(node -p "require('./lerna.json').version") | |
| echo "Lerna Version: $VERSION" | |
| # First commit: Update packages/core/README.md | |
| if git diff --name-only | grep -q "packages/core/README.md"; then | |
| git add packages/core/README.md | |
| git commit -m "core: update re-exports for v${VERSION}" | |
| echo "First commit created for packages/core/README.md" | |
| else | |
| echo "No changes to packages/core/README.md" | |
| fi | |
| # Second commit: Add all other changes | |
| git add . | |
| if git diff --staged --quiet; then | |
| echo "No other changes to commit" | |
| else | |
| git commit -m "v${VERSION}" | |
| echo "Second commit created for remaining changes" | |
| fi | |
| # Submit PR | |
| if git log origin/${{ github.ref_name }}..HEAD | grep -q "commit"; then | |
| # Define PR body | |
| PR_BODY="Automated package updates for release v${VERSION} | |
| To complete the release: | |
| - Update all remaining package versions locally | |
| - Amend the commits with your author details (to ensure the ECA check passes) | |
| - Keep the commits split (the re-export commit on the readme needs to be separate) | |
| - Force push the branch | |
| - Verify that all checks pass, and then \`rebase and merge\`" | |
| # Create a new branch for the PR | |
| BRANCH_NAME="${{ github.ref_name }}-package-updates" | |
| git checkout -b "$BRANCH_NAME" | |
| git push origin "$BRANCH_NAME" | |
| # Create PR using GitHub CLI | |
| gh pr create \ | |
| --title "Release v${VERSION} - Package updates" \ | |
| --body "$PR_BODY" \ | |
| --base "${{ github.ref_name }}" \ | |
| --head "$BRANCH_NAME" | |
| echo "PR created for branch $BRANCH_NAME" | |
| else | |
| echo "No commits to push" | |
| fi |