DevOps Engineer
Release Automation β From Tag to Changelog to GitLab Release in 60 Seconds
Key Takeaway
One command in Telegram β "release learn-my-way v2.3.0" β and the agent creates a tag, generates a categorized changelog from merge commits, publishes a GitLab release, notifies the team, and updates the README. 60 seconds.
The Problem
Releases are important. They're also annoying.
The ceremony goes like this: decide on a version number. Create a git tag. Write a changelog β scroll through merge commits, categorize them (features, fixes, breaking changes), format them nicely, mention contributors. Create the release on GitLab. Copy the release notes. Notify the team on Telegram. Update the README badge or version reference.
That's 30-60 minutes of work. Most of it is reading commit messages and formatting text. It's the kind of work that makes you procrastinate releases β and when you procrastinate releases, deployments pile up, and you get big scary releases instead of small safe ones.
We ship fast at PyratzLabs. We need releases to cost nothing.
The Solution
One Telegram message to Thom. That's the entire release process.
View details
Me: @thom release learn-my-way v2.3.0
60 seconds later: tag created, changelog generated, release published, team notified, README updated. Done.
The Process
The agent receives the command and kicks off the full release pipeline:
bashShow code
# Step 1: Determine the previous version
prev_tag=$(git describe --tags --abbrev=0 HEAD~1 2>/dev/null || echo "v0.0.0")
# Step 2: Create the new tag
git tag -a v2.3.0 -m "Release v2.3.0"
git push origin v2.3.0
Changelog generation is where the intelligence lives. The agent reads all merge commits since the last tag and categorizes them:
bashShow code
# Get merge commits since last tag
commits=$(git log "${prev_tag}..v2.3.0" --merges --pretty=format:"%s|%an|%h")
The agent parses each commit, looking for conventional commit prefixes and MR references:
pythonShow code
CATEGORIES = {
"feat": "β¨ Features",
"fix": "π Bug Fixes",
"breaking": "β οΈ Breaking Changes",
"perf": "β‘ Performance",
"docs": "π Documentation",
"refactor": "β»οΈ Refactoring"
}
def categorize_commit(message: str) -> str:
for prefix, category in CATEGORIES.items():
if message.lower().startswith(prefix):
return category
return "π§ Other Changes"
The generated changelog looks like this:
markdownShow code
## v2.3.0 β March 10, 2026
### β¨ Features
- Add real-time notification preferences (!138) β @thom-backend
- Implement course progress export to PDF (!141) β @jack-ui
### π Bug Fixes
- Fix timezone handling in session scheduler (!139) β @thom-backend
- Resolve image upload CORS issue on Safari (!140) β @jack-ui
### β‘ Performance
- Cache user preferences in Redis β 40% faster profile loads (!137) β @thom-backend
### Migration Notes
- Run `python manage.py migrate` β new `notification_preferences` table
- Update environment: add `REDIS_CACHE_URL` variable
Then the agent publishes the release:
bashShow code
# Create GitLab release with the generated notes
glab release create v2.3.0 \
--name "v2.3.0" \
--notes-file /tmp/changelog_v2.3.0.md \
--ref v2.3.0
The README gets updated with the new version:
bashShow code
# Update version badge in README
sed -i "s/version-v[0-9]*\.[0-9]*\.[0-9]*/version-v2.3.0/" README.md
git add README.md
git commit -m "docs: update version to v2.3.0"
git push origin main
Finally, the team notification in Telegram:
View details
π Released: learn-my-way v2.3.0
β¨ 2 new features
π 2 bug fixes
β‘ 1 performance improvement
π Full changelog: https://gitlab.com/pyratzlabs/learn-my-way/-/releases/v2.3.0
β οΈ Migration required: new table + env variable. See release notes.
The Results
| Metric | Before (Manual) | After (Agent) | Improvement |
|---|---|---|---|
| Release creation time | 30-60 min | 60 seconds | 98% faster |
| Changelog completeness | ~70% (missed commits) | 100% (all MR commits) | Complete |
| Release frequency | 1-2x/month (procrastinated) | 3-4x/week (low friction) | 4x more frequent |
| Team notification delay | 5-30 min after release | Instant | Zero delay |
| Forgotten migration notes | ~30% of releases | 0% (auto-detected) | Eliminated |
Try It Yourself
You need glab CLI, conventional commit prefixes (or consistent MR titles), and a structured release notes template. The categorization logic is simple pattern matching. The real win is removing the friction that makes you delay releases.
Releases should be boring. Now they are.
Related case studies
DevOps Engineer
GitHub Release Automation β Version Bump to Published Release in One Command
Learn how PyratzLabs uses AI agents to automate GitHub releases β from version bump to published release notes with contributor credits in one command. No manual changelog writing.
DevOps Engineer
CI/CD Pipeline Monitoring β The Agent That Never Sleeps
How an AI agent monitors CI/CD pipelines 24/7 across 5+ GitLab repos, auto-retries flaky jobs, and delivers failure alerts to Telegram β so developers never context-switch to check builds again.
Software Engineer
Creating Merge Requests From Telegram β One Message, Full CI Pipeline
Learn how PyratzLabs creates GitLab merge requests from Telegram in 15 seconds using AI agents. One message triggers MR creation, CI pipeline, and code review β replacing 10 minutes of manual work.
Want results like these?
Start free with your own AI team. No credit card required.