CI/CD & GitOps Practical By Samson Tanimawo, PhD Published Dec 16, 2025 4 min read

Changelog Automation

Auto-generate changelogs from commits.

Conventional commits

Standard commit message format: type(scope): subject. Types include feat, fix, docs, refactor, test, chore.

Tools parse these conventions. semantic-release, conventional-changelog, release-please all expect this format.

Adoption requires team discipline. Linting hooks (commitlint) catch deviations at commit time. CI rejects PRs with malformed messages.

Generation tools

semantic-release: full automation. Determines version bump from commit types, generates changelog, publishes release.

conventional-changelog: changelog only. Suitable when version bumping is manual or version comes from another source.

release-please: GitHub native. Creates a release PR that accumulates changes; merge to release. Good middle ground.

Release process integration

On main merge: tool computes version, generates changelog entry, creates GitHub release. All automatic.

Tag follows semver: MAJOR for breaking changes (BREAKING CHANGE: footer), MINOR for features, PATCH for fixes.

Changelog committed to CHANGELOG.md or only in releases. Either works; commit-to-file is more searchable.

Audience-specific changelogs

Internal changelog: full detail, every change. Useful for engineering teams and support.

Customer-facing changelog: filtered. Only customer-relevant changes; plain language; grouped by feature area.

Two artifacts; same source. Internal is full conventional-changelog output; customer version is curated by product or marketing.

Pitfalls

Inconsistent commit conventions. The tool produces nonsense if commits don't follow the format. Linting at commit time is mandatory.

Missing breaking-change footers. Tool can't detect a breaking change; semver versioning gets it wrong; downstream breaks unexpectedly.

Over-detailed customer changelogs. Customers don't care about refactors. Curate aggressively; show only what matters to them.