Skip to content

Pin the sigstore action so release signing cannot break on an upstream resolve — Closes #230 - #231

Merged
conradbzura merged 1 commit into
masterfrom
230-pin-sigstore-action
Sep 2, 2026
Merged

Pin the sigstore action so release signing cannot break on an upstream resolve — Closes #230#231
conradbzura merged 1 commit into
masterfrom
230-pin-sigstore-action

Conversation

@conradbzura

@conradbzura conradbzura commented Sep 2, 2026

Copy link
Copy Markdown
Collaborator

Summary

Bump the signing action from revision v3.0.0 to v3.5.0 so the release pipeline resolves its signing environment once, at the pinned revision, rather than against the package index on every run.

A commit-SHA reference fixes the action's revision, not the dependency closure that revision installs. The existing pin is well formed — a 40-character SHA with a version comment, matching every other action reference in this repository — and it leaves the closure unconstrained, because at that revision the action installs from a requirements file carrying only sigstore ~= 3.0 and requests ~= 2.28 without hashes. Pinning more strictly does not narrow it: the unconstrained resolution is a property of the pinned code rather than of the reference that selects it.

The exposure is live. securesystemslib 1.5.0 declares its cryptography >= 48 requirement through an extra that the tufsigstore chain does not select, so the resolver admits that release alongside an earlier cryptography, signature verification degrades without raising, and the TUF trust root verifies against 0 of 3 keys. The failure is confined to the signing step and precedes any artifact read, so the surrounding jobs complete and a release reaches both channels carrying no .sigstore bundles. Tracked upstream as sigstore/sigstore-python#1887.

No published release is affected retroactively. v0.5, cut 2026-07-15, predates the break and carries both bundles. The next cut is what this protects.

Closes #230

Proposed changes

Fix the closure at the action revision

Change the single uses: reference in .github/actions/publish-github-release/action.yaml to 790bc6befb9d733738f18d8f895854b453640ec9, the tag object for v3.5.0.

v3.5.0 differs in construction rather than in version alone. It installs from requirements/main.txt, which pins 31 distributions by exact version under sha256 hashes, among them sigstore==4.5.0, cryptography==49.0.0, securesystemslib==1.4.0 and tuf==7.0.0. The closure is fixed at the revision, so no subsequent upload to the index can perturb it.

The interface is unchanged. v3.5.0 declares a strict superset of v3.0.0's inputs, adding rekor-version and removing none, and the single input this action passes is identical. The changelog records no breaking entries across the range.

Verification

The YAML parses to four steps with the signing step resolving and its single input intact, the new SHA matches the v3.5.0 tag object, and sigstore/gh-action-sigstore-python appears exactly once across .github/ with the prior SHA absent from the tree. End-to-end confirmation requires a release run, which is the argument for landing this before the next cut rather than during it.

@conradbzura conradbzura self-assigned this Sep 2, 2026
A commit-SHA pin fixes the action's revision, not the dependency closure
that revision installs. At the pinned revision the action resolves its
Python environment from a requirements file constraining only
sigstore ~= 3.0 and requests ~= 2.28, without hashes, so the transitive
closure is recomputed against the package index on every invocation.
Pinning more strictly does not narrow it, because the unconstrained
resolution is a property of the pinned code rather than of the reference
that selects it.

securesystemslib 1.5.0 declares its cryptography 48 requirement through
an extra that the tuf to sigstore chain does not select, so the resolver
admits that release alongside an earlier cryptography. Signature
verification degrades without raising, and the TUF trust root verifies
against 0 of 3 keys. The failure is confined to the signing step and
precedes any artifact read, so the surrounding jobs complete:
distributions build, the GitHub release is created, and the PyPI upload
succeeds. A release reaches both channels carrying no sigstore bundles,
and no job reports a failure.

Revision v3.5.0 installs from a requirements file pinning 31
distributions by exact version under sha256 hashes, among them sigstore
4.5.0, cryptography 49.0.0, securesystemslib 1.4.0 and tuf 7.0.0. The
closure is fixed at the revision rather than at the index, so no
subsequent upload can perturb it.

The interface is unchanged. v3.5.0 declares a strict superset of
v3.0.0's inputs and removes none, and the single input this action
passes is identical.
@conradbzura
conradbzura force-pushed the 230-pin-sigstore-action branch from 6fce7a1 to 1a574ae Compare September 2, 2026 15:46
@conradbzura
conradbzura marked this pull request as ready for review September 2, 2026 15:50
@conradbzura
conradbzura merged commit 84a6f7e into master Sep 2, 2026
3 checks passed
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.

1 participant