← ClaudeAtlas

gitlab-changelog-releaselisted

Manually generate a CHANGELOG.md and cut a GitLab release, using either git-cliff (Conventional Commits) or GitLab's native Changelog API (Git trailers) depending on which convention the repo already uses. Use when the user asks to "generar changelog", "cortar un release", "sacar un tag", "hacer release notes", or wants a CHANGELOG.md set up/updated for a project on GitLab.com. This is the ONLY supported flow — run it by hand every time you cut a release. Do NOT wire this into GitLab CI/CD tag-triggered jobs; see "Why manual, not CI" below.
educlopez/mallard · ★ 3 · Code & Development · score 72
Install: claude install-skill educlopez/mallard
# GitLab Changelog + Release (manual flow) Two valid approaches — **pick based on what the repo's commit history already uses**, don't mix them: | Repo's commit convention | Use | |---|---| | Conventional Commits (`feat:`, `fix:`, `docs:`...) — most Cinetic repos | **Path A — git-cliff** | | `Changelog: added/fixed/changed/...` Git trailers | **Path B — GitLab native Changelog API** | **They are not interchangeable.** GitLab's native Changelog API (`/repository/changelog`) and `glab changelog generate` ONLY read `Changelog:` trailers — they do NOT parse `feat:`/`fix:` prefixes at all. Point either one at a repo that only has Conventional Commits and it silently finds nothing (tested live: returned `"No changes."` on a repo with 187 `feat:`/`fix:` commits and zero trailers). Verified against [GitLab's own Changelogs docs](https://docs.gitlab.com/user/project/changelogs/) — no config exists to make the native API match commit-title prefixes instead of trailers. Check `git log --oneline -20` before picking a path: if you see `feat(...)`/`fix(...)` etc, use Path A; if commits end with a `Changelog: added` line, use Path B. ## Why manual, not CI GitLab.com tag-push pipeline creation was tested exhaustively on a real Cinetic project and found completely non-functional — not a config bug on our side. Proof: a job with **no `rules:` at all** (unconditional, should always run) still produced **zero pipeline objects** on a plain push to the default branch. That rules out YAML, `ru