Publish to npm and GitHub Packages workflow (rohitg00/kubectl-mcp-server)
The Publish to npm and GitHub Packages workflow from rohitg00/kubectl-mcp-server, explained and optimized by Latchkey.
CI health: C - fair
Point runs-on at Latchkey and get caching, job timeouts, self-healing for flaky steps, and up to 58% lower cost, applied automatically.
What it does
This is the Publish to npm and GitHub Packages workflow from the rohitg00/kubectl-mcp-server repository, a real project running GitHub Actions. It is shown here with attribution under its MIT license.
Below, Latchkey shows a faster, safer version produced by its optimization engine.
The workflow
name: Publish to npm and GitHub Packages
on:
release:
types: [published]
jobs:
publish-npm:
runs-on: ubuntu-latest
environment: npm
permissions:
contents: read
id-token: write
steps:
- uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
registry-url: 'https://registry.npmjs.org'
- name: Update package version from release tag
run: |
VERSION=${GITHUB_REF_NAME#v}
npm version $VERSION --no-git-tag-version --allow-same-version
- name: Check if version exists
id: check
run: |
VERSION=${GITHUB_REF_NAME#v}
if npm view kubectl-mcp-server@$VERSION version 2>/dev/null; then
echo "exists=true" >> $GITHUB_OUTPUT
echo "Version $VERSION already exists on npm, skipping publish"
else
echo "exists=false" >> $GITHUB_OUTPUT
echo "Version $VERSION not found, will publish"
fi
- name: Publish to npm
if: steps.check.outputs.exists != 'true'
run: npm publish --provenance --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
publish-github-packages:
runs-on: ubuntu-latest
needs: publish-npm
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@v4
- name: Set up Node.js for GitHub Packages
uses: actions/setup-node@v4
with:
node-version: '20'
registry-url: 'https://npm.pkg.github.com'
scope: '@rohitg00'
- name: Update package version from release tag
run: |
VERSION=${GITHUB_REF_NAME#v}
npm version $VERSION --no-git-tag-version --allow-same-version
- name: Publish to GitHub Packages
run: |
# Update package.json for GitHub Packages
node -e "
const fs = require('fs');
const pkg = require('./package.json');
pkg.name = '@rohitg00/kubectl-mcp-server';
pkg.publishConfig = { registry: 'https://npm.pkg.github.com' };
fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2));
"
npm publish
env:
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
The same workflow, on Latchkey
Estimated ~20% faster on cache hits, plus fewer wasted runs and a safer supply chain. Added and changed lines are highlighted.
name: Publish to npm and GitHub Packages on: release: types: [published] jobs: publish-npm: timeout-minutes: 30 runs-on: latchkey-small environment: npm permissions: contents: read id-token: write steps: - uses: actions/checkout@v4 - name: Set up Node.js uses: actions/setup-node@v4 with: cache: 'npm' node-version: '20' registry-url: 'https://registry.npmjs.org' - name: Update package version from release tag run: | VERSION=${GITHUB_REF_NAME#v} npm version $VERSION --no-git-tag-version --allow-same-version - name: Check if version exists id: check run: | VERSION=${GITHUB_REF_NAME#v} if npm view kubectl-mcp-server@$VERSION version 2>/dev/null; then echo "exists=true" >> $GITHUB_OUTPUT echo "Version $VERSION already exists on npm, skipping publish" else echo "exists=false" >> $GITHUB_OUTPUT echo "Version $VERSION not found, will publish" fi - name: Publish to npm if: steps.check.outputs.exists != 'true' run: npm publish --provenance --access public env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} publish-github-packages: timeout-minutes: 30 runs-on: latchkey-small needs: publish-npm permissions: contents: read packages: write steps: - uses: actions/checkout@v4 - name: Set up Node.js for GitHub Packages uses: actions/setup-node@v4 with: cache: 'npm' node-version: '20' registry-url: 'https://npm.pkg.github.com' scope: '@rohitg00' - name: Update package version from release tag run: | VERSION=${GITHUB_REF_NAME#v} npm version $VERSION --no-git-tag-version --allow-same-version - name: Publish to GitHub Packages run: | # Update package.json for GitHub Packages node -e " const fs = require('fs'); const pkg = require('./package.json'); pkg.name = '@rohitg00/kubectl-mcp-server'; pkg.publishConfig = { registry: 'https://npm.pkg.github.com' }; fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2)); " npm publish env: NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
What changed
- Run on Latchkey managed runners with one line (
runs-on), which apply the fixes below automatically and self-heal transient failures. This example useslatchkey-small; pick the runner size that fits the job. - Cache dependency installs on the setup step so they are served from cache.
- Add a job timeout so a hung step cannot burn hours of runner time.
This workflow runs 2 jobs per trigger. On Latchkey the same minutes cost up to 58% less than GitHub-hosted, with zero queue time.