Chapter 11Lesson 03~135 minutes

Tags, Releases, Release Notes, Assets, Changelogs, and Release Governance: Configuration, Design Choices, and Tradeoffs

Choose tag, note-generation, release-state, mutability, and support-line policies deliberately instead of inheriting accidental defaults from the release form.

Release policyGenerated notesSemVerImmutability

Learning objectives

  • Choose annotated/signed versus lightweight tags for release identities.
  • Choose manual, generated, or hybrid release notes based on governance needs.
  • Design draft/prerelease/latest semantics without treating them as Git history states.
  • Choose correction/new-version strategies instead of silently mutating consumed versions.
  • Separate custom release-note taxonomy from labels/milestones and support-line policy.
  • Use a decision table balancing maintainability, security, governance, reliability, compatibility, and cost.
No-paid path: all decision exercises apply to a GitHub Free public repository. Signed tags require local signing configuration but no paid GitHub plan. Immutable releases can be enabled as a repository control; the live enablement step is optional because it deliberately changes future release mutability.

1. Annotated, signed, and lightweight tags communicate different intent

A lightweight tag is only a ref name pointing to an object. An annotated tag creates a tag object with message and tagger metadata. A signed annotated tag adds a cryptographic signature that GitHub can display as verified when the signing identity is recognized.

Choice Strength Tradeoff Good fit
Lightweight tag Minimal pointer No tag message/tagger object Ephemeral/internal markers where release governance is elsewhere
Annotated tag Explicit tag object + message Still depends on account/repository authorization Normal human-created releases
Signed tag Annotated identity + cryptographic signature Requires key/signing lifecycle High-trust releases where signer identity matters

Signing answers “who signed this tag with a verifiable key?” It does not prove that uploaded assets were built reproducibly or passed tests. Keep signer identity, build provenance, and artifact integrity as separate evidence.

# Example only after configuring an approved signing key
git tag -s v2.0.0 -m "Release v2.0.0" COMMIT_SHA
git tag -v v2.0.0

2. Manual versus generated notes is a governance choice, not a tooling preference

Manual notes are strongest for migration steps, operational risk, rollback instructions, deprecation policy, and curated narrative. Generated notes scale well for enumerating merged pull requests and contributors. A hybrid model often works best: generated change inventory plus manually authored operational sections.

# Example generated-note release after the remote tag already exists
gh release create v2.1.0 --verify-tag --generate-notes --title "v2.1.0"

# Optional comparison start when generation should not infer the previous tag
gh release create v2.2.0 --verify-tag --generate-notes --notes-start-tag v2.1.0

If the generated output is wrong, fix the metadata model or edit the draft/notes before publication rather than assuming generation is authoritative.

3. .github/release.yml turns label taxonomy into changelog categories

Generated release notes can use labels to group changes. This creates a contract between triage/review metadata from Chapters 05–08 and release communication. Keep categories small enough that contributors can classify PRs consistently.

# .github/release.yml
changelog:
  exclude:
    labels:
      - skip-changelog
  categories:
    - title: Breaking changes
      labels:
        - breaking-change
    - title: Features
      labels:
        - enhancement
    - title: Fixes
      labels:
        - bug
    - title: Other changes
      labels:
        - "*"

The catch-all prevents unlabeled work from disappearing completely; reviewers can then improve taxonomy rather than silently omitting the change.

4. Draft, prerelease, and latest should have written entry/exit criteria

State Meaning to encode Policy question
Draft Not yet published; assemble final notes/assets Who may edit and who approves publication?
Prerelease Published but not recommended as the stable production version Who should consume it and what support guarantee exists?
Latest full release Current recommended full release How is latest chosen when multiple support lines publish?

The REST API does not allow drafts or prereleases to be marked latest. The “latest” designation should not replace your own SemVer/support policy; it is a hosted convenience that downstream automation may read.

5. Corrections: mutate metadata carefully; do not silently redefine a consumed artifact

Correcting a typo in notes is different from replacing a binary under the same version. For a consumed production version, artifact replacement or tag movement breaks the meaning of caches, checksums, SBOMs, deployment records, and incident evidence. Prefer publishing a new patch version such as v1.4.1.

Immutable releases enforce the strongest form of this policy for tag/assets. Even without the feature, adopt the operating rule: published tag target and artifact bytes do not change. Metadata corrections should be documented and bounded.

6. Multiple support lines require explicit release targeting

Suppose main is v3 development while release/2.x receives security fixes. A v2.7.4 release must tag the validated commit on the support branch, not whatever happens to be on the default branch. Tag first and verify the SHA; the branch is only the moving line from which that commit was selected.

7. Worked decision table: choose a policy, not a button sequence

Decision Small internal tool Public library Regulated/critical service
Tag Annotated Signed annotated where practical Signed annotated + protected tag rules
Notes Manual short summary Generated inventory + manual migration notes Curated template + generated evidence appendix
Assets Optional Hashed packages/binaries Hashed + provenance/attestation/SBOM as applicable
Mutability Social immutability Prefer immutable releases Enforced immutability + controlled publisher role
Prerelease Optional Beta/RC channel Explicit qualification environment and approval
Bad release New patch New patch + advisory/deprecation note New patch + incident/yank record + rollback evidence

The “critical” column costs more operational discipline, not necessarily more GitHub subscription. The important cost is governance: key management, provenance generation, reviewers, and long-term evidence retention.

8. Latest designation and automation consumers

Automations that download /releases/latest trade convenience for indirection: their input can change when a new stable release is designated. Production automation should usually pin a version/tag or digest and perform explicit promotion rather than silently following latest.

9. Lesson summary

Release policy is a set of explicit decisions: tag identity, note generation, state transitions, artifact provenance, support lines, and correction strategy. Annotated/signed tags strengthen release intent; generated notes accelerate inventory but require taxonomy; immutable releases can enforce the no-redefinition rule for published tags/assets.

Knowledge check

Does a signed tag prove the binary asset was built from that tag?

Why use a catch-all category in .github/release.yml?

Can a prerelease be marked latest through the current REST release model?

A published v1.4.0 binary has a defect. Why prefer v1.4.1 over replacing the v1.4.0 asset?

What does a release branch identify?

Next lesson

Next: Tags, Releases, Release Notes, Assets, Changelogs, and Release Governance: Diagnostics, Failure Modes, Security, and Performance

Further reading — current official GitHub sources

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
0x716c4Ab160C4B66F31a28AE2448BfF68fc3a2ef0 Send only Ethereum/ERC-20 compatible assets to this address.