Chapter 25Lesson 03~180 minutes

Release Automation, Tags, GitHub Releases, Packages, and Container Registries: Configuration, Design Patterns, and Trade-Offs

Choose triggers, version identities, publication targets, mutable aliases, attestation, and rollback strategies from explicit provenance and governance trade-offs.

SemVerGHCRImmutabilityAttestationsRollback

Learning objectives

  • Choose tag-triggered versus manual release initiation based on authorization and reproducibility needs.
  • Contrast build-once promotion with rebuild-per-environment and GitHub Release with package registries.
  • Use semantic versions and commit SHAs for different purposes without confusing them.
  • Treat mutable aliases such as latest as convenience pointers rather than evidence.
  • Design rollback, superseding and immutability policy before a failed release occurs.

1. Release design starts from identity and consumer behavior

A release pipeline has two audiences: operators who need understandable version labels and machines that need exact content identity. Semantic versions communicate compatibility intent; commit SHAs identify source; artifact or OCI digests identify bytes. Good design records all three instead of trying to make one identifier do every job.

2. Tag-triggered versus manual release

Choice Strength Risk / prerequisite Observable evidence
Tag-triggered push.tags Simple source-to-version event; tag is already present Who can create/move tag becomes critical; workflow selection semantics must be understood event ref, tag target SHA, workflow SHA, run ID
Manual workflow_dispatch Explicit operator action; can expose bounded inputs Do not let free-form input select arbitrary unreviewed source without validation actor, selected ref/SHA, input values, run ID
Release-published event Separate GitHub release management from package publication Avoid loops/duplicate publication; release may already be externally visible release ID/tag/assets plus publishing run

3. Build once/promote versus rebuild per environment

Build-once promotion means the tested subject digest remains the same as it moves into a Release, package registry, staging and production. Rebuild-per-environment may be necessary for some ecosystems, but then each rebuild is a new artifact identity and requires new provenance/verification. Calling those outputs “the same binary” because they share a version string is inaccurate.

Pattern Reliability Auditability Typical use
Build once, promote digest Strongest identity continuity One digest can be traced end-to-end Binaries, archives, OCI images
Rebuild from same source Toolchain/network may drift Must prove each output independently Source packages or unavoidable environment-specific builds
Retag existing OCI digest No byte rebuild Record old/new aliases and same digest Promoting image from staging alias to production alias

4. GitHub Release versus package/container registry

Surface Best fit Identity Access/lifecycle
GitHub Release human-facing release notes plus downloadable binaries/archives tag + release ID + asset digest repository release permissions; immutable release can lock tag/assets
GitHub Packages ecosystem-native install/restore package name + version + package metadata registry-specific scopes/access; package may inherit or define granular permissions
GHCR OCI/container distribution image name + manifest digest; tags are aliases granular package permissions; public pulls may be anonymous
Actions artifact workflow/run evidence and job transfer artifact ID/digest tied to run not a public product release surface; retention-oriented

5. Semantic version, commit SHA and digest are complementary

v2.4.1 says something about release lineage and compatibility policy. 8c0… identifies source. sha256:… identifies artifact/image content. A production record should allow a consumer to traverse version → tag → commit → build run → subject digest → distribution record.

6. Mutable aliases are useful only when bounded by verification

latest, stable or a floating major tag such as v2 can improve usability, but they are aliases. Promotion systems should resolve the alias to a digest and record that digest. Rollback should select a known-good digest/version, not assume the alias still points to yesterday’s content.

Production rule: never use a mutable alias as the only evidence of what reached an environment. Record the resolved package/image digest and the release/source identity.

7. Immutable releases change the safe publishing sequence

Current GitHub immutable releases lock the associated Git tag and release assets after publication and automatically create a release attestation. Because those assets cannot be replaced, prepare the release as a draft, upload all final files, then publish. If a defect is discovered later, supersede with a new version rather than changing old bytes.

8. Permissions should follow the target surface

Operation Minimum authority concept Notes
Build/test read-only repository access No release/package permission needed.
Create tag/release contents: write Confine to guarded release job.
Publish repository-associated GHCR/package packages: write Use GITHUB_TOKEN where supported instead of long-lived registry token.
Generate artifact provenance id-token: write, attestations: write, current artifact metadata permission Only after final subject bytes exist.
Delete package/release destructive/admin-capable permission Keep out of ordinary release path; exact disposable guards only.

9. Rollback, yank, deprecate and supersede are not synonyms

A deployment rollback selects an older known-good artifact for an environment. A package deprecation tells consumers not to choose a version. A yank removes or hides availability in ecosystems that support it. Superseding publishes a newer version. Deleting a release or package removes evidence and may be irreversible. Decide which semantics your ecosystem supports before an incident.

10. Worked selection scenarios

Scenario Recommended design Why
CLI binary download Immutable GitHub Release asset + digest/provenance Human release notes and direct downloadable asset fit the consumer.
Container service OCI registry with immutable digest; optional human release record Deployment systems consume image digests and registry metadata.
Library consumed by package manager Native package registry version + source/release link Consumers need ecosystem dependency resolution.
Staging→prod Promote same digest under environment records/aliases Prevents rebuild drift.
Emergency defect Publish superseding version and redeploy known-good digest Preserves historical evidence; avoids rewriting an existing version.

11. Availability, cost and portability

GitHub Releases are repository features; GitHub Packages/GHCR storage and transfer are subject to plan and billing rules that can change. Keep mandatory course work to a small prerelease and local simulation. If your organization uses another registry, preserve the same contract—version, digest, credentials, publication record and rollback handle—even when the API differs.

12. Lesson summary

Choose release mechanisms by identity and consumer needs. Tags name source, releases organize distributable assets, registries serve ecosystem-native packages, and digests/provenance let machines verify exact content.

Next lesson

Release Automation, Tags, GitHub Releases, Packages, and Container Registries: Diagnostics, Failure Modes, and Production Practices

Continue with the next lesson to build on the current concepts, evidence, security boundaries, and operational practices.

Knowledge check

When is rebuilding during promotion a problem?

Why keep both semantic version and digest?

Is latest useless?

What changes when immutable releases are enabled?

A package version is bad but evidence is needed. What is preferable to immediate deletion?

Official references and version notes

  • About releases — GitHub Releases are based on Git tags and add release metadata/assets around a versioned source point.
  • Managing releases — Current release creation, editing and deletion behavior.
  • Immutable releases — Current tag/asset immutability and automatic release-attestation behavior.
  • GHCR — Current GitHub Container Registry authentication, package linking and digest guidance.
  • GitHub Packages permissions — Repository/granular package permissions and GitHub Actions access.
  • GITHUB_TOKEN authentication — Least-privilege token use in workflows.
  • gh release create — Current CLI release creation, --verify-tag and immutable-release handling.
  • gh release verify — Verification of cryptographically signed immutable-release attestations.
  • gh release verify-asset — Verify a local asset against the release attestation and digest.
  • actions/attest v4.2.2 — Immutable attestation action revision referenced by optional provenance examples.

Keep the academy open

Support free, practical DevOps education.

Every lesson is designed to remain readable in a browser, downloadable from GitHub, and usable without a paid learning platform. Contributions help expand and maintain the curriculum.

Ethereum / ERC-20
0x716c4Ab160C4B66F31a28AE2448BfF68fc3a2ef0Send only Ethereum/ERC-20 compatible assets to this address.