Publish to PyPI workflow (KapJI/capital-gains-calculator)
The Publish to PyPI workflow from KapJI/capital-gains-calculator, explained and optimized by Latchkey.
A
CI health: A - excellent
Point runs-on at Latchkey and get job timeouts, self-healing for flaky steps, and up to 58% lower cost, applied automatically.
What it does
This is the Publish to PyPI workflow from the KapJI/capital-gains-calculator 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
workflow (.yml)
name: Publish to PyPI
on:
release:
types: [published]
env:
PYTHON_VERSION: "3.12"
jobs:
publish:
name: Publish
runs-on: ubuntu-latest
environment:
name: pypi
permissions:
id-token: write
contents: read
steps:
- name: Check out the repository
uses: actions/checkout@v6
- name: Prepare and install deps
uses: ./.github/actions/install-deps
with:
python-version: ${{ env.PYTHON_VERSION }}
- name: Set version from tag
run: uv version "${{ github.event.release.tag_name }}" --frozen
- name: Run tests
run: uv run pytest -q
- name: Build package
run: uv build
- name: Publish to PyPI
run: uv publish
The same workflow, on Latchkey
Removes redundant runs and caps runaway jobs. Added and changed lines are highlighted.
name: Publish to PyPI on: release: types: [published] env: PYTHON_VERSION: "3.12" jobs: publish: timeout-minutes: 30 name: Publish runs-on: latchkey-small environment: name: pypi permissions: id-token: write contents: read steps: - name: Check out the repository uses: actions/checkout@v6 - name: Prepare and install deps uses: ./.github/actions/install-deps with: python-version: ${{ env.PYTHON_VERSION }} - name: Set version from tag run: uv version "${{ github.event.release.tag_name }}" --frozen - name: Run tests run: uv run pytest -q - name: Build package run: uv build - name: Publish to PyPI run: uv 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. - 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.