Skip to content

feat(release): attest the Docker image and PyPI launcher - #430

Merged
debugmcpdev merged 2 commits into
mainfrom
feat/422-attestations
Aug 22, 2026
Merged

feat(release): attest the Docker image and PyPI launcher#430
debugmcpdev merged 2 commits into
mainfrom
feat/422-attestations

Conversation

@debugmcpdev

Copy link
Copy Markdown
Collaborator

Fixes #422

What

Every distributed artifact becomes independently verifiable back to the tagged commit and workflow — previously only the npm tarballs were attested (SUPPLY-CHAIN-SECURITY.md called this gap out explicitly). Closes the remaining OpenSSF Best Practices signed_releases gap.

Docker (docker-publish)

  • The docker/build-push-action step gets an id so the pushed image digest is captured.
  • A new step attests that digest with actions/attest-build-provenance (subject-name: index.docker.io/debugmcp/mcp-debugger, push-to-registry: true) — the same pinned action and composite-action-in-a-normal-job approach as the existing provenance job (slsa-github-generator's reusable workflows remain unusable in this org; see the comment in release.yml).
  • Job permissions gain id-token: write + attestations: write.
  • Deliberately not enabling BuildKit provenance:/sbom: on build-push-action — that rewrites the pushed index with attestation manifests and can confuse older clients; the digest attestation alone closes the gap.

Verification: gh attestation verify oci://index.docker.io/debugmcp/mcp-debugger:<tag> --repo debugmcp/mcp-debugger

PyPI (pypi-publish)

  • Migrates from twine+PYPI_TOKEN to trusted publishing via SHA-pinned pypa/gh-action-pypi-publish (v1.14.2) with id-token: write — mirroring the npm OIDC setup. The action generates and uploads PEP 740 attestations automatically.
  • twine check stays as a metadata lint; the validate-pypi job in validate-secrets.yml, the release checklist's token item, and release-dry-run.sh's PYPI_TOKEN check are retired.

Docs

  • SUPPLY-CHAIN-SECURITY.md: "Verifying a Release" now covers all three artifact types (with the "do not yet carry their own attestations" caveat removed), PyPI/Docker publishing sections updated, access-continuity table updated.
  • Release-notes template gains the Docker verify command and a PyPI attestation pointer.

⚠️ Action required before the next tag (v0.25.0)

  1. Add the PyPI trusted publisher for debug-mcp-server-launcher: pypi.org → project → Settings → Publishing → Add GitHub publisher with owner debugmcp, repository mcp-debugger, workflow release.yml, environment blank. Without this, the PyPI publish fails (invalid-publisher).
  2. After the first successful OIDC publish, delete the PYPI_TOKEN secret (same dance as the npm OIDC rollout).

Both attestations prove out live at the v0.25.0 tag push — flagged on the release-execution ticket.

🤖 Generated with Claude Code

Closes the remaining gap in the release-signing story: previously only
the npm tarballs carried attestations.

Docker: the build-push step now captures the image digest and a new
step attests it with actions/attest-build-provenance (same pinned
action and composite-action-in-normal-job approach as the existing
provenance job), pushing the attestation to the registry. Verify with:
gh attestation verify oci://index.docker.io/debugmcp/mcp-debugger:<tag>
--repo debugmcp/mcp-debugger.

PyPI: the launcher migrates from twine+token to trusted publishing via
pypa/gh-action-pypi-publish (id-token: write), which generates and
uploads PEP 740 attestations automatically. twine remains for the
metadata check only. The validate-pypi secrets job, the release
checklist's token item, and release-dry-run's PYPI_TOKEN check are
retired accordingly.

Docs: SUPPLY-CHAIN-SECURITY.md's "Verifying a Release" now covers all
three artifact types, and the release-notes template gains the Docker
verify command and a PyPI attestation pointer.

Requires (before the next tag): a trusted publisher for
debug-mcp-server-launcher on pypi.org (owner debugmcp, repo
mcp-debugger, workflow release.yml, environment blank). PYPI_TOKEN can
be deleted after the first successful OIDC publish.

Fixes #422

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@codecov

codecov Bot commented Aug 22, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@debugmcpdev
debugmcpdev merged commit 0e73344 into main Aug 22, 2026
10 checks passed
@debugmcpdev
debugmcpdev deleted the feat/422-attestations branch August 22, 2026 19:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Supply chain: attest the Docker image and PyPI launcher (npm tarballs already carry provenance)

2 participants