Auto versioning + changelog generation is a very real production pattern used in open-source and SaaS teams to avoid messy release notes and manual tagging. We’ll build a clean system using:
commit → push → GitHub Action
↓
analyze commits
↓
bump version (patch/minor/major)
↓
generate changelog
↓
create git tag
↓
create GitHub release
---
We’ll use:
👉 **semantic-release** (industry standard)
``` bash id="inst1"
npm install --save-dev semantic-release @semantic-release/changelog @semantic-release/git @semantic-release/github
Your commits MUST follow this format:
``` bash id="c1"
feat: add user login system
### Fix (patch version bump)
``` bash id="c2"
fix: resolve navbar bug on mobile
``` bash id="c3"
feat!: redesign API structure
or
``` bash id="c4"
BREAKING CHANGE: remove old auth system
.releaserc.json
``` json id="r1"
{
"branches": ["main"],
"plugins": [
"@semantic-release/commit-analyzer",
"@semantic-release/release-notes-generator",
"@semantic-release/changelog",
"@semantic-release/github",
[
"@semantic-release/git",
{
"assets": ["package.json", "CHANGELOG.md"],
"message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
}
]
]
}
---
``` bash id="ch1"
touch CHANGELOG.md
Start empty:
``` md id="ch2"
All notable changes will be documented here.
---
## 📁 `.github/workflows/release.yml`
``` yaml id="w1"
name: Auto Version & Changelog
on:
push:
branches:
- main
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 20
- name: Install dependencies
run: npm install
- name: Run semantic release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: npx semantic-release
When you push to main
:
Decide version bump:
Generate changelog
Create Git tag
Create GitHub Release
Update CHANGELOG.md
``` md id="log1"
GitHub will automatically create:
``` plaintext id="rel1"
v1.2.0 - Production Release
Features:
Fixes:
Make sure this exists:
``` plaintext id="sec1"
GITHUB_TOKEN (auto provided by GitHub Actions)
No extra setup required.
---
### Developer flow:
``` plaintext id="flow1"
git commit -m "feat: add dashboard UI"
git push origin main
feat
)``` yaml id="npm1"
``` yaml id="slack1"
``` json id="branch1"
"branches": ["main", "next"]
---
## 🟣 Changelog formatting customization
You can group commits like:
* Features
* Fixes
* Performance
* Breaking changes
---
### ❌ Not using conventional commits
→ versioning won’t work properly
### ❌ Pushing messy commit messages
``` bash id="bad1"
fix stuff
update
→ release history breaks
``` plaintext id="final1"
Commit (feat/fix/breaking)
↓
GitHub Action triggers
↓
semantic-release analyzes commits
↓
bumps version automatically
↓
updates CHANGELOG.md
↓
creates git tag + GitHub release
---
You now have:
* 🤖 Automated versioning
* 📜 Auto changelog generation
* 🏷️ Git tags + GitHub releases
* 🚀 CI/CD-ready release pipeline