DevOps Engineer

Release Automation β€” From Tag to Changelog to GitLab Release in 60 Seconds

30-60 min release process β†’ 60 secondsEngineering & DevOps4 min read

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

MetricBefore (Manual)After (Agent)Improvement
Release creation time30-60 min60 seconds98% faster
Changelog completeness~70% (missed commits)100% (all MR commits)Complete
Release frequency1-2x/month (procrastinated)3-4x/week (low friction)4x more frequent
Team notification delay5-30 min after releaseInstantZero delay
Forgotten migration notes~30% of releases0% (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.

GitLabRelease AutomationChangelogCI/CDTelegram

Want results like these?

Start free with your own AI team. No credit card required.

Release Automation β€” From Tag to Changelog to GitLab Release in 60 Seconds β€” Mr.Chief