epic(ci): Automated release notes for GitHub releases
@sfreudenthaler is already working on this.
Since Mar 17, 2026.
- Dominant language
- Java
- Stars
- 970
- Forks
- 486
- Avg merge
- 3d 33m
- Merged PRs (30d)
- 170
Description
User Story
As a developer or technical buyer evaluating or operating dotCMS, I want every GitHub release to have a populated description with categorized changelogs, so that I can quickly understand what changed, what broke, and what I need to do — without waiting for someone to manually write the notes.
Problem
Every dotCMS release requires someone to manually read through GitHub issues, review PRs, and write a changelog for dev.dotcms.com/docs/changelogs. Meanwhile, GitHub release descriptions at github.com/dotCMS/core/releases are created empty (generate_release_notes: false in the release prepare workflow). With near-daily releases, this manual process doesn't scale.
Solution
An automated pipeline that generates developer-facing release notes for every dotCMS release:
- TypeScript data-gathering script extracts PR details, labels, and categorization from GitHub API
- Claude AI writes polished changelog prose from the structured data
- GitHub Actions orchestrates the pipeline as a non-blocking job in the existing release workflow
Architecture:
release-prepare → build → deployment → release → release-notes (non-blocking)
↘ ↘
finalize (always) report (always)
Pipeline flow (within release-notes job):
1. Idempotency check (skip if notes exist)
2. TS script gathers data → structured JSON
3. Prompt assembled (template + JSON)
4. Claude writes /tmp/release-notes.md (Write tool only)
5. gh release edit updates the release (deterministic shell step)
Key design decisions:
- Separation of concerns: Claude only writes prose (Write tool access). The
gh release editruns as a plain shell step for auditability - Non-blocking:
release-notesjob usesif: success()and doesn't blockfinalizeorreport - Idempotent: Checks if release body already has content before running — safe for job reruns
- Tag filtering: Skips CLI (
dotcms-cli-*) and LTS (*_lts_*) releases automatically - Reusable: Same component used by both the release pipeline and a standalone backfill workflow
Changelog format:
- 4 sections: Features & Enhancements, Fixes and Known Issues, Deprecations/EOL/Reminders, Infrastructure & Security
[!CAUTION]rollback warning whenNot Safe To Rollbacklabels detectedChangelog: Skiplabel support to omit internal changes- Every bullet links to its PR for traceability
Phases
| Phase | Description | Status |
|---|---|---|
| 1 | Claude Code skill for local changelog generation | ✅ Complete |
| 2 | GitHub Actions pipeline (TS script + workflows) | 🔧 In Progress |
| 3 | dev.dotcms.com changelog publishing via MCP | 📋 Planned |
| 4 | Hardening (Slack notifications, fallback, backfill) | 📋 Planned |
Files
| Purpose | Path |
|---|---|
| TS data-gathering script | .github/scripts/gather-release-data/ |
| Prompt template | .github/scripts/gather-release-data/prompt-template.md |
| Reusable workflow component | .github/workflows/cicd_comp_ai-release-notes-phase.yml |
| Backfill workflow | .github/workflows/cicd_ai-release-notes-backfill.yml |
| Release pipeline integration | .github/workflows/cicd_6-release.yml (new release-notes job) |
| Test harness script | .github/scripts/gather-release-data/test/create-test-harness.sh |
| Claude Code skill | ~/.claude/skills/dotcms-release-notes/SKILL.md |
References
- Test PR in core-workflow-test: dotCMS/core-workflow-test#451
- Existing release workflow:
.github/workflows/cicd_6-release.yml - Claude action reference:
anthropics/claude-code-action@v1
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.