Loading page...Загружаем страницу...正在加载页面...
AtlasRepo

Stop Generating Changelogs from Git Commits: How I Fixed the 'WHY' Problem in ChangelogBot

Description and use

Automated changelog generators based on commit messages produce noisy entries lacking rationale. The article explains how ChangelogBot, leveraging LLMs to extract the "WHY" and bounded concurrency for GitHub API calls, delivers clear changelogs for large repositories.

Problem

Automated changelog generators that use raw git commit messages produce noisy, intent‑missing release notes, forcing consumers to hunt through PR history for context.

Outcome

By re‑engineering the metadata pipeline with bounded concurrency and explicit error handling, ChangelogBot now reliably generates clear, intent‑rich changelogs for large repositories without hitting GitHub rate limits or silently degrading CI output.

Workflow

  • Audit existing changelog for noise and lack of context
  • Identify shortcomings of commit‑based changelog generators
  • Introduce ChangelogBot to map commits to PRs and extract PR bodies
  • Implement bounded concurrency (mapConcurrent) to avoid GitHub secondary rate limits
  • Replace broad try/catch with explicit error handling to surface failures
  • Run ChangelogBot against large production releases to validate robustness
  • Publish improved changelog format to release page

Evidence

Generating release notes directly from raw git commits or PR titles is one of the most widespread anti‑patterns in modern DevOps.

Source

The original commit resolver fetched pull request metadata for every commit in parallel… If a release contained 60 commits, this line fired 60 HTTPS requests to api.github.com in the exact same millisecond.

Source

To prevent crashes, previous code wrapped API lookups in broad try/catch blocks and returned empty arrays on failure… CI exits 0, but changelog loses all PR context!

Source

I avoided pulling heavy external dependencies like p-limit and instead implemented a native, lightweight bounded concurrency worker directly in TypeScript…

Source

  • Record date: 2026-11-03T17:14:03.993Z