Publish to JSR workflow (i18next/i18next)
The Publish to JSR workflow from i18next/i18next, explained and optimized by Latchkey.
CI health: D - needs work
Point runs-on at Latchkey and get caching, run de-duplication, job timeouts, self-healing for flaky steps, and up to 58% lower cost, applied automatically.
What it does
This is the Publish to JSR workflow from the i18next/i18next 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 JSR
on:
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+'
jobs:
publish:
name: Publish to JSR
runs-on: ubuntu-latest
if: github.repository == 'i18next/i18next'
permissions:
contents: read
id-token: write
steps:
- uses: actions/checkout@v6
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version-file: '.nvmrc'
- name: Verify tag matches package.json version
run: |
TAG_VERSION="${GITHUB_REF_NAME#v}"
PKG_VERSION=$(node -p "require('./package.json').version")
if [ "$TAG_VERSION" != "$PKG_VERSION" ]; then
echo "::error::Tag $TAG_VERSION does not match package.json version $PKG_VERSION"
exit 1
fi
- name: Generate jsr.json from package.json
run: |
node -e '
const pkg = require("./package.json");
const jsr = {
name: "@i18next/i18next",
version: pkg.version,
license: pkg.license,
exports: "./src/index.js",
publish: {
include: [
"src/*.js",
"index.d.ts",
"index.d.mts",
"typescript/*.d.ts",
"README.md"
]
}
};
require("fs").writeFileSync("jsr.json", JSON.stringify(jsr, null, 2) + "\n");
'
- name: Publish
run: npx --yes jsr@0.14.3 publish
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 JSR on: push: tags: - 'v[0-9]+.[0-9]+.[0-9]+' concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: publish: timeout-minutes: 30 name: Publish to JSR runs-on: latchkey-small if: github.repository == 'i18next/i18next' permissions: contents: read id-token: write steps: - uses: actions/checkout@v6 - name: Setup Node.js uses: actions/setup-node@v6 with: cache: 'npm' node-version-file: '.nvmrc' - name: Verify tag matches package.json version run: | TAG_VERSION="${GITHUB_REF_NAME#v}" PKG_VERSION=$(node -p "require('./package.json').version") if [ "$TAG_VERSION" != "$PKG_VERSION" ]; then echo "::error::Tag $TAG_VERSION does not match package.json version $PKG_VERSION" exit 1 fi - name: Generate jsr.json from package.json run: | node -e ' const pkg = require("./package.json"); const jsr = { name: "@i18next/i18next", version: pkg.version, license: pkg.license, exports: "./src/index.js", publish: { include: [ "src/*.js", "index.d.ts", "index.d.mts", "typescript/*.d.ts", "README.md" ] } }; require("fs").writeFileSync("jsr.json", JSON.stringify(jsr, null, 2) + "\n"); ' - name: Publish run: npx --yes jsr@0.14.3 publish
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. - Cancel superseded runs when a branch or PR gets a newer push.
- 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 1 job per trigger. On Latchkey the same minutes cost up to 58% less than GitHub-hosted, with zero queue time.