Generate Release Notes from GitLab Merge Requests and Milestones
How to extract clean release notes from GitLab Merge Requests, labels, and Milestones without relying on messy commit messages.
Soobrief Team — Product & Engineering, Sooapps ·
In short
Extracting release notes from GitLab requires querying Merge Requests by `state=merged` and `merged_at` timestamps, mapping GitLab Milestone IDs to release versions, and grouping by scoped labels. This provides a deterministic, audit-ready record of shipped features.
Extracting release notes from GitLab requires querying Merge Requests by state=merged and merged_at timestamps, mapping GitLab Milestone IDs to release versions, and grouping by scoped labels. This provides a deterministic, audit-ready record of shipped features.
Enterprise engineering teams on GitLab frequently operate across self-managed instances and complex multi-repo architectures. Creating a single release summary across multiple GitLab projects is traditionally a painful manual chore.
1. Querying Merged MRs with the GitLab REST API
The GitLab Merge Requests API allows strict filtering on merge state and target branch:
GET /api/v4/projects/:id/merge_requests?state=merged&target_branch=main&updated_after=2026-09-01T00:00:00Z
Critical fields in the payload include:
merged_at: The exact timestamp when the MR was accepted.
milestone.title: Connects the delivery to a named release (e.g. v2.4.0).
labels: Array of assigned labels.
2. Leveraging GitLab Scoped Labels
GitLab's scoped label syntax (key::value) provides first-class support for deterministic taxonomy:
MR !894: "Implement webhook retries with exponential backoff"
├── label: type::reliability ──► Category: Fixes & Stability
├── label: area::webhooks ────► Surface: Developer APIs
└── milestone: 2026.09 ──────► Release Target: September Sprint 2
By locking down categorization via scoped labels, the resulting weekly changelog remains structured, factual, and completely predictable.