Skip to main content

Template library demonstrating Python package release CI/CD

Project description

test-python-package-release

Template repository demonstrating a complete CI/CD pipeline for Python packages published to PyPI.

Quick start

uv sync --group dev
uv run pytest

Project layout

.
├── .github/workflows/   # CI, Claude review, release-please, publish
├── src/                 # library code (src/ layout)
├── tests/               # pytest tests
├── pyproject.toml       # single source of truth: build, deps, ruff, pytest, tox
├── .pre-commit-config.yaml
├── commitlint.config.js
└── CHANGELOG.md         # managed by release-please

Development

# Install hooks (runs ruff + ty pre-commit, conventional commit-msg)
uv run pre-commit install --hook-type pre-commit --hook-type commit-msg

# Run the full test matrix (3.11, 3.12, 3.13)
uv run tox

# Single env
uv run tox -e py313 -- -k calculator

# Lint / format check / type check
uv run ruff check .
uv run ruff format --check .
uv run ty check src

Commits

Every commit MUST follow the Conventional Commits specification.

Examples:

  • feat: add support for negative numbers
  • fix(calculator): correct divide by zero error
  • chore(deps): bump ruff to 0.9
  • feat!: drop Python 3.10 support (breaking change → major bump)

Enforced locally by conventional-pre-commit (commit-msg hook) and in CI by commitlint.

Release flow

PR opened ──▶ ci.yml (lint, ty, pytest matrix, commitlint)
                │
                └─ optional: comment "@claude" ──▶ claude-review.yml

PR merged ──▶ main ──▶ release-please.yml
                          │
                          └─ creates/updates a "Release PR"
                             (bumps version, regenerates CHANGELOG)

Release PR merged ──▶ release-please tags + creates GitHub Release
                          │
                          └─ publish.yml ──▶ uv build
                                            ──▶ TestPyPI (OIDC)
                                            ──▶ PyPI (OIDC, gated env)

First-time setup after cloning the template

  1. Rename name in pyproject.toml, the package directory under src/, and imports in tests/.
  2. Configure Trusted Publishers on PyPI and TestPyPI for your repo, pointing to the publish.yml workflow and the pypi / testpypi environments.
  3. Create two GitHub Environments named testpypi and pypi (optionally add required reviewers on pypi as a manual prod gate).
  4. Add an ANTHROPIC_API_KEY repository secret (for the Claude review workflow).
  5. Settings → Actions → General → Workflow permissions → "Read and write permissions" so release-please can open PRs and push tags.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

test_python_package_release-0.2.0.tar.gz (45.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

test_python_package_release-0.2.0-py3-none-any.whl (4.9 kB view details)

Uploaded Python 3

File details

Details for the file test_python_package_release-0.2.0.tar.gz.

File metadata

File hashes

Hashes for test_python_package_release-0.2.0.tar.gz
Algorithm Hash digest
SHA256 e856ed63896dceca30f44061355533ec27afe9bf0dc14d734bda5b37dd36f7ab
MD5 3d6b90bea4ded930534b9cc7abbee499
BLAKE2b-256 b00f890aba0a50d8106ba1c6769ed41485110b82692e9948da587318e6a156d6

See more details on using hashes here.

Provenance

The following attestation bundles were made for test_python_package_release-0.2.0.tar.gz:

Publisher: publish.yml on wozniakos10/test_python_package_release

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file test_python_package_release-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for test_python_package_release-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 25a63ba4a42b103029f4362864642e0e89591a4f83cb54b96bb8f8d3da84b61e
MD5 0e7cd52617e6d25982b6a3cd7087295e
BLAKE2b-256 0c65af363b3ba5f4cd87ad9b454bfd7aafb84107e68d1b4f395a173c7fcc71a7

See more details on using hashes here.

Provenance

The following attestation bundles were made for test_python_package_release-0.2.0-py3-none-any.whl:

Publisher: publish.yml on wozniakos10/test_python_package_release

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page