Skip to content

fix(ci): point latest at the newest release, publish dev builds as edge - #143

Merged
emmanuel merged 1 commit into
mainfrom
fix/latest-tracks-releases
Aug 8, 2026
Merged

fix(ci): point latest at the newest release, publish dev builds as edge#143
emmanuel merged 1 commit into
mainfrom
fix/latest-tracks-releases

Conversation

@emmanuel

@emmanuel emmanuel commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator

ghcr.io/pelotech/xapi-lrs:latest points at a dev build, not the newest release:

latest = sha256:f015b011…   org.opencontainers.image.version = 6507454   ← a commit sha
0.9.5  = sha256:a6e6c5fb…

publish-dev applied latest on every non-release push to main, while publish-tag only applied the version tag — so docker pull ghcr.io/pelotech/xapi-lrs gives you unreleased code. That's the inverse of the convention.

Fix

tag before after
latest tip of main (unreleased) newest release
edge tip of main
<version> that release unchanged

The subtle part

publish-dev didn't just set latest — it also inspected and captured the digest of :latest by name, to sign and attest it:

docker buildx imagetools inspect …/xapi-lrs:latest
DIGEST=$(docker buildx imagetools inspect "…:latest" --format '{{json .Manifest}}' | jq -r .digest)

Had I only changed the tags: inputs, those lookups would have resolved to the release image after this change, and the dev job would have signed and attested a release build. Both now follow :edge.

The manifest-list step already applies every tag metadata-action emits (jq '.tags | map("-t " + .)'), so the release path needed nothing else.

Docs

README now states the contract, since consumers can rely on it:

Tag Points at
latest the most recent release
<version> that exact release, e.g. 0.9.5 (immutable)
edge current tip of main — unreleased, moves often

Nothing in the repo depended on the old meaning — docker-compose.yml builds locally and the README's cosign examples pin explicit versions.

Note: latest only becomes correct on the next release. If you want 0.9.5 tagged now, crane tag ghcr.io/pelotech/xapi-lrs:0.9.5 latest is safe here — it's a pure retag of an existing digest, so signatures and attestations carry over.

`latest` was applied by the dev path, so `docker pull ghcr.io/pelotech/xapi-lrs`
returned an unreleased build off main rather than the current release — the
opposite of what the tag conventionally promises. Right now it resolves to a
build whose org.opencontainers.image.version label reads 6507454, a commit sha,
while 0.9.5 sits untagged as far as `latest` is concerned.

Moves `latest` onto the release path and republishes dev builds as `edge`.

publish-dev also inspected and captured the digest of `:latest` by name, which
after this change would have resolved to the RELEASE image — so the dev job
would have signed and attested the release build. Those now follow `:edge`.

The manifest-list step already applies every tag metadata-action emits, so the
release path needed no other change. Documents the three tags in the README,
since consumers now have a real contract to rely on: latest = newest release,
<version> = immutable, edge = tip of main.
@emmanuel
emmanuel merged commit 22ed5c7 into main Aug 8, 2026
16 checks passed
@emmanuel
emmanuel deleted the fix/latest-tracks-releases branch August 8, 2026 02:21
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