Skip to content

docs(node): verify Docker images with build provenance attestations - #1130

Merged
jenpaff merged 1 commit into
mainfrom
docs/image-provenance-verify
Nov 12, 2026
Merged

jenpaff merged 1 commit into
mainfrom
docs/image-provenance-verify

Conversation

@kuyziss

@kuyziss kuyziss commented Nov 12, 2026

Copy link
Copy Markdown
Contributor

Docker images now get GitHub build provenance attestations (tempoxyz/tempo#9087), and Cosign signing is being retired (tempoxyz/tempo#9286). This switches the node installation guide from cosign verify to gh attestation verify, covers multi-platform and platform-pinned digests, and keeps the Cosign command for older images.

Land together with tempoxyz/tempo#9087, before tempoxyz/tempo#9286 removes Cosign signing.

@vercel

vercel Bot commented Nov 12, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
tempo-docs Ready Ready Preview Nov 12, 2026 1:09pm UTC

Request Review

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nothing blocking. The comments below are optional suggestions. There is no need to push a fix for them before merging.

Comment on lines +153 to +156
```bash
# Install the GitHub CLI: https://cli.github.com/
gh attestation verify oci://ghcr.io/tempoxyz/tempo:<tag> \
--repo tempoxyz/tempo

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 (optional) Readers who only install gh and paste the new verify command will see it fail with a login prompt rather than a verification result. The snippet's comment only says to install the GitHub CLI. Without --bundle-from-oci, gh attestation verify fetches attestations from the GitHub API and needs gh auth login first. Fix: tell readers to run gh auth login, as line 106 already does for tempoup. Or, if the attestations really are pushed to the registry, add --bundle-from-oci to both examples (lines 155 and 164).

Why this was flagged

A node operator follows the Docker Image Provenance section at installation.mdx:153-156. They install the GitHub CLI as the comment says and run gh attestation verify oci://ghcr.io/tempoxyz/tempo:<tag> --repo tempoxyz/tempo. Without --bundle-from-oci, gh gets the attestation from the GitHub attestations API, which needs an authenticated gh. The command stops and asks the user to run gh auth login without verifying anything. On the base branch, the cosign verify example needed no account. The same section, at line 106, does say to "Install and authenticate gh" for tempoup, but the new snippet and the pinned-digest example at line 164 leave that step out. The text says the attestation is "stored next to the image in the registry", but the commands never read it from the registry.

Verification: nit. The snippet at installation.mdx:153-157 is only # Install the GitHub CLI: https://cli.github.com/ followed by gh attestation verify oci://ghcr.io/tempoxyz/tempo:<tag> --repo tempoxyz/tempo. Neither example passes --bundle or --bundle-from-oci, and nothing near them mentions authentication. Line 106 tells readers to "Install and authenticate gh". The base's cosign verify example needed no GitHub account.

@jenpaff
jenpaff merged commit 460f8f7 into main Nov 12, 2026
16 checks passed
@jenpaff
jenpaff deleted the docs/image-provenance-verify branch November 12, 2026 13:52
opensource-fork-sync Bot pushed a commit to cla7aye15I4nd/opensource-tempoxyz__tempo that referenced this pull request Nov 12, 2026
Attests images this repository publishes from trusted runs with
`actions/attest-build-provenance` (`push-to-registry: true`), so the
INF-405 Kyverno policy in tempoxyz/k8s#2494
admits them. Private and internal repositories sign in GitHub's private
Sigstore instance; this public one uses public-good Sigstore. Existing
cosign signing is unchanged.

The reusable `attest-images.yml` attests a list of `repository@digest`
refs, one matrix job each, and expands each multi-platform index into
its platform manifests (`linux/amd64`, `linux/arm64`) so a
platform-pinned digest verifies as well as the index or a tag;
`docker.yml` and the zones companion images use it. Because a reusable
workflow signs as itself whoever calls it, a fail-closed guard runs
before every attest step: the run must be in `tempoxyz/tempo`, triggered
by push, schedule or workflow_dispatch, on `main`, an `rc/*` branch or a
`tempo/v*`, `zones/v*` or `prover/v*` tag, from `docker.yml`,
`zones-docker.yml` or `prover-release.yml` at that same ref. Profiling
builds attest only from `main`.

**Published but unattested**, intentionally: they build unreviewed or
non-release code. They keep their cosign signature until
tempoxyz#9286, and keep working while Kyverno is in Audit; plan
for them before Deny:
- `reth-auto-bump` builds and merge-group Network E2E builds.
- `/docker` PR builds, including `/docker nightly`, which moves
`nightly` to an unattested PR-head image and still fires the nightly
event.
- Selected-ref zones and profiling dispatches from refs other than
`main` or a release tag.

**Tag order:** on runs that attest, images are first published only
under their per-commit `sha-` tag. The tags deployments follow (`edge`,
`latest`, `nightly`, `stable`, semver) move to the digest only after it
is attested (`tag-images` in `docker.yml`, `tag-companion-images` and
the promote job in `zones-docker.yml`, via
`.github/scripts/move-image-tags.sh`), as a same-repository carbon copy
checked against the attested digest. If attestation fails, those tags
stay where they were. Unattested flows above still tag at publish time.

**EIF toolchain:** reuse requires a main-run attestation with a matching
`recipe_sha`; the first main or tag run after merge rebuilds the
toolchain once. Only `main` writes the shared `inputs-<sha>` tag; other
runs that rebuild push a run-scoped tag.

**rc/\***: release-candidate pushes are attested, like their cosign
signature before. `rc/*` branches are protected by a ruleset, and the
attestation records `refs/heads/rc/...`, so the prod Kyverno policy
(main and tags only) still keeps rc images out of prod.

**Migration:** `cosign verify` keeps working on every image while cosign
signing stays. Consumers move to `gh attestation verify
oci://ghcr.io/tempoxyz/tempo:<tag> --repo tempoxyz/tempo` (tag, index
digest or platform digest), documented in
tempoxyz/docs#1130. Images published before this
change carry only a cosign signature.
opensource-fork-sync Bot pushed a commit to cla7aye15I4nd/opensource-tempoxyz__tempo that referenced this pull request Nov 12, 2026
…ployment tags (tempoxyz#9286)

Stacked on tempoxyz#9087. Removes the cosign signing steps from `docker.yml` and
the `sign-prover-images` job from `zones-docker.yml`; GitHub
build-provenance attestations become the only image signature. The
digest list the attest job needs is now collected without signing.

Keep as a draft until consumers that verify with `cosign verify` have
moved to `gh attestation verify`, and land
tempoxyz/docs#1130 first: the node installation
guide still tells operators to run `cosign verify`, which fails for
every image published after this merges.

**Builds left with no signature** once this lands, intentionally (they
build unreviewed or non-release code): `/docker` PR builds (including
`/docker nightly`), merge-group Network E2E builds, `reth-auto-bump`
builds, and zones or profiling dispatches from refs other than `main` or
a release tag. `rc/*` builds stay covered: tempoxyz#9087 attests them.

**Migration note:**
- Verify with `gh attestation verify oci://ghcr.io/tempoxyz/tempo:<tag>
--repo tempoxyz/tempo`, or a Kyverno or Sigstore policy on the
build-provenance attestation.
- Platform-pinned digests (`linux/amd64`, `linux/arm64`) verify too:
tempoxyz#9087 attests each platform manifest as well as the index. cosign signed
them with `--recursive`.
- Images published before tempoxyz#9087 have only a cosign signature, and
`cosign verify` still works for them.

**Also (folded in from tempoxyz#9302):** reusable callers of `docker.yml`
(`build-reth-bump-image.yml`, `network-e2e.yml`) run with the caller's
ref and event, so a reth-bump dispatch on `main` would push
`edge`/`latest` unattested and, after this PR, unsigned. When
`docker.yml` runs as another workflow's reusable call, it now keeps only
per-build tags (`sha-`, `ci-`, `pr-`), so only an attested `docker.yml`
run moves the tags deployments follow.

This branch was successfully deployed

1 active deployment
Preview — 7d4bddbd Deployed Nov 12, 2026 by vercel[bot]
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.

2 participants