Chapter 11Lesson 03~100 minutes

Tags, Signed Releases, Semantic Versioning, Changelogs, and Support Lines: Configuration, Design Choices, and Tradeoffs

Design release configuration and policy for signing backends, key selection, version naming, SemVer fit, changelog curation, support-branch naming, backports, and server-enforced protection of release refs.

Release policygpg.formatChangelog designBackports

Learning objectives

  • Inspect and reason about tag.gpgSign, user.signingKey, and gpg.format configuration.
  • Compare OpenPGP, X.509, and SSH signing as different trust ecosystems.
  • Choose a version/tag naming scheme and decide whether Semantic Versioning fits the product's compatibility contract.
  • Define support-line and backport policy with explicit provenance.
  • Separate local Git conventions from server-enforced release authorization.

1. Release policy begins where tag syntax ends

Git can create a tag named v1.4.0, sign it, and push it. Git cannot decide whether the software has a stable public API, whether the change is breaking, who is authorized to release, how long version 1.4 is supported, or which fixes must be backported. Those decisions belong to project/release governance.

2. Signing configuration: separate backend, key selection, and verification trust

git config --show-origin --show-scope --get gpg.format
git config --show-origin --show-scope --get user.signingKey
git config --show-origin --show-scope --get tag.gpgSign

Current Git defaults gpg.format to openpgp; supported alternatives include x509 and ssh. user.signingKey selects the signing identity/key for tag/commit signing when automatic selection is unsuitable. tag.gpgSign=true requests signing of tags by default.

3. OpenPGP, X.509, and SSH are different trust ecosystems

Format Typical local backend Trust/config consideration
openpgp GnuPG-compatible program Key ownership/trust model and key distribution
x509 gpgsm by default Certificate chain / organizational PKI
ssh ssh-keygen by default Trusted principals/keys via allowed-signers configuration

Format choice is infrastructure policy. Do not turn on tag.gpgSign globally before verifying that every repository and automation environment has the required key access and non-interactive signing behavior.

4. SSH signing illustrates validity versus trust explicitly

For SSH verification, Git can use gpg.ssh.allowedSignersFile to map trusted principals to public keys. Current Git distinguishes a cryptographically valid signature from one whose key is trusted by that configuration. This is an important model for every signing backend: “signature math passed” and “our release policy trusts this identity” are separate questions.

5. Decide whether signing should be explicit or defaulted

Policy Strength Operational cost
Explicit git tag -s only in release procedure Clear intent at release time Procedure must be followed consistently
tag.gpgSign=true repository-local Harder to accidentally create unsigned tags locally All tag creation needs available signing key/agent
Server accepts only authorized release refs/signatures Central enforcement Platform-specific configuration and key lifecycle

6. Choose one version/tag naming rule and make automation parse it explicitly

Examples include v1.2.3, release/1.2.3, or product-prefixed tags such as api-v1.2.3. The choice should optimize unambiguous automation, not aesthetics. Document pre-release conventions such as v2.0.0-rc.1 and whether build metadata appears in tags.

Remember: SemVer itself describes version precedence/meaning around a public API; a Git prefix or product namespace is repository naming policy.

7. Use SemVer only when its public-API model fits

Semantic Versioning is strong when consumers need compatibility promises around a public API. It can be awkward for internal deployment snapshots, data pipelines, continuously deployed services with no versioned consumer API, or products whose compatibility boundary is not represented by one package API.

If SemVer does not fit, choose another documented versioning scheme rather than incrementing MAJOR/MINOR/PATCH mechanically. Git tags can carry any valid ref name; the release convention defines meaning.

8. Support-branch names should express the maintenance promise

Examples such as support/1.4 or release/2026.08 can communicate the maintained line. Define:

  • how a support branch is created—from which released tag;
  • which bug/security classes qualify for backport;
  • whether fixes are developed on trunk then backported, or developed on oldest line then merged/forward-ported;
  • how conflicts are reviewed/tested;
  • when the line reaches end of support.

9. Backport policy must account for new commit IDs

A cherry-picked fix on support/1.0 is not the same commit object as the original fix on trunk. Preserve the relationship in issue/review/release records and test each support-line result. “Same patch intent” does not guarantee identical behavior against an older codebase.

10. Changelog generation should start from release questions, not command availability

Source Useful for Why insufficient alone
Commit subjects Developer provenance, candidate list May include refactors/fixups/internal wording
Review/issue metadata User-facing intent, approvals, references Platform-specific and may omit direct commits
Manual changelog entries Curated consumer impact Needs discipline/review
Diff/API tooling Detect structural changes Cannot infer all compatibility or operational meaning

A production pipeline can combine these sources but should retain human review for externally meaningful release notes.

11. Release-ref protection is server governance

Core Git permits local tag deletion/replacement. A hosting/server platform can restrict who creates/deletes/updates release tags or require signed objects. Those controls are not portable Git objects. This course describes the Git facts; GitHub/GitLab/Azure-specific configuration belongs in their platform courses.

12. Configuration scope and precedence

git config --list --show-origin --show-scope | grep -E '(tag\.gpgSign|user\.signingKey|gpg\.format|push\.followTags)'

Signing-key paths and agent availability are machine/user concerns, while a repository may define stricter release defaults. CI may inject configuration/environment at runtime. Inspect the effective value on the exact release runner rather than assuming a developer workstation configuration is reproduced there.

13. Decision table — a small library with two supported lines

Decision Selected policy Reason
Release tags Annotated vX.Y.Z Tagger/message metadata and stable convention
Signing Signed only on release runner; verification in release check Central key lifecycle and reproducible policy
Support branches support/1.4, support/2.0 Clear compatibility promise
Backports Fix trunk first, cherry-pick reviewed fix to supported lines Keeps forward history canonical while making backports explicit
Changelog Curated entries plus commit/review links Consumer meaning is not identical to commit subjects
Published tag correction New version; never silent retag Preserves distributed provenance

14. Knowledge check

Question 1. What does tag.gpgSign=true change?

Question 2. Which current gpg.format values does Git document?

Question 3. Why can a valid SSH signature still fail a trust policy?

Question 4. Why can commit messages alone produce a poor changelog?

Question 5. Which layer should enforce “only release managers may create v* tags” if bypass must be prevented?

15. Summary

Release configuration should make signing/key/trust behavior explicit, version names predictable, support-line maintenance testable, and published tag immutability enforceable. Git supplies refs and signatures; release semantics and authorization come from project/server policy.

Next

Diagnose release provenance failures

Lesson 4 examines missing remote tags, silently moved version names, signature/trust confusion, wrong-commit tagging, SemVer misuse, and support-line drift using an evidence-first release runbook.

Authoritative references

 git-config
 git-tag
 gitformat-signature
 Semantic Versioning 2.0.0

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.