Cómo generar changelogs automáticos para tus releases en GitHub

¡Hola developer 👋🏻!¿Te ha pasado que creas una release en GitHub y el cuerpo aparece vacío o con un triste “no changes”? A mí también… y sinceramente queda fatal 😅

Hoy te cuento cómo solucionarlo generando changelogs automáticos a partir de tus Pull Requests usando GitHub Actions.

🛠️ La solución: Release Changelog Builder + GitHub Actions

La idea es combinar dos piezas clave:

✅ Un archivo de configuración que define cómo categorizar los PRs
✅ Un workflow de GitHub Actions que genera la release automáticamente

Así, cada vez que publiques un tag, GitHub creará la release con su changelog listo de forma automática para ti.

1️⃣ Archivo de configuración del changelog

Lo primero que necesitas es crear un archivo como este en la raíz del repo:

👉 release-changelog-builder-config.json

{
  "categories": [
    { "title": "## 🚀 Features", "labels": ["✨ feature", "enhancement", "feature"] },
    { "title": "## 🐛 Bug Fixes", "labels": ["🐛 bug", "bug", "fix"] },
    { "title": "## 🔐 Security", "labels": ["🔐 security", "security"] },
    { "title": "## 🗄️ Database", "labels": ["🗄️ database", "database"] },
    { "title": "## 🚀 Performance", "labels": ["🚀 performance", "performance"] },
    { "title": "## 📖 Documentation", "labels": ["📖 documentation", "documentation"] },
    { "title": "## 🔧 Infrastructure & CI/CD", "labels": ["🔧 infrastructure", "github_actions", "ci", "infrastructure"] },
    { "title": "## 🧪 Tests", "labels": ["🧪 testing", "🧪 unit tests", "test"] },
    { "title": "## ⬆️ Dependencies", "labels": ["dependencies"] },
    { "title": "## 🔄 Refactor", "labels": ["🔄 refactor", "refactor"] },
    { "title": "## ⚠️ Breaking Changes", "labels": ["⚠️ breaking-change", "breaking"] }
  ],
  "ignore_labels": ["skip-changelog"],
  "sort": { "order": "ASC", "on_property": "mergedAt" },
  "template": "#{{CHANGELOG}}\n\n---\n\n**Full Changelog**: #{{RELEASE_DIFF}}\n",
  "pr_template": "- #{{TITLE}} ([##{{NUMBER}}](#{{URL}})) @#{{AUTHOR}}",
  "empty_template": "No changes in this release.",
  "tag_resolver": { "method": "semver" },
  "base_branches": ["main"]
}

👉 Aquí defines cómo se agrupan los PRs por etiquetas (feature, bug, docs, etc.). Tendrás que adaptarlo acorde al tipo de etiquetas que utilices en ese repo. También puedes pedirle a la IA que te adapte de forma automática las labels que tienes en un repo acorde al contenido del mismo 😇

2️⃣ Workflow de GitHub Actions para generar la release

Una vez que ya tienes el archivo anterior, necesitas un flujo que sepa utilizar el mismo. En mi caso, en mi repositorio https://github.com/0GiS0/tour-of-heroes-dotnet-api estoy usando este:

name: 📦 Generate .NET Release
on:
  push:
    tags:
      - "v[0-9]+.[0-9]+.[0-9]+*"
permissions:
  contents: write
jobs:
  release:
    runs-on: ubuntu-latest
    steps:
      - name: 📥 Checkout code
        uses: actions/checkout@v6
        with:
          fetch-depth: 0
      - name: 🔧 Setup .NET
        uses: actions/setup-dotnet@v5
        with:
          dotnet-version: 9.x
      - name: 📦 Restore dependencies
        run: dotnet restore
      - name: 🏗️ Build Release
        run: dotnet build --configuration Release --no-restore
      - name: 🧪 Run tests
        run: dotnet test --configuration Release --no-build --verbosity normal
      - name: 📁 Create release artifact
        run: |
          cd src/bin/Release/net9.0/
          zip -r ../../../../tour-of-heroes-api.zip .
      - name: 📝 Build changelog
        id: build_changelog
        uses: mikepenz/release-changelog-builder-action@v5
        with:
          configuration: "release-changelog-builder-config.json"
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      - name: 🚀 Create GitHub Release
        uses: softprops/action-gh-release@v2
        with:
          name: Release ${{ github.ref_name }}
          body: ${{ steps.build_changelog.outputs.changelog }}
          draft: false
          prerelease: ${{ contains(github.ref_name, '-') }}
          files: tour-of-heroes-api.zip
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

👉 Aquí la acción clave es mikepenz/release-changelog-builder-action, que genera el changelog, y softprops/action-gh-release, que crea la release en GitHub.

Si quieres saber más sobre GitHub Actions tienes un curso totalmente gratuito en español en mi canal de YouTube:

🚀 Flujo completo de trabajo

  1. Haces merge de Pull Requests con labels apropiadas (feature, bug, docs, etc.).
  2. Creas un tag de versión: git tag v1.2.0 git push --tags
  3. El workflow de GitHub Actions se dispara automáticamente.
  4. Se genera el changelog agrupando los PRs por categoría.
  5. Se publica la release en GitHub junto con los artefactos generados 🎉

🎉 Resultado

Releases profesionales, bien documentadas, sin escribir nada a mano.

Adiós al “no changes” para siempre.

Y hola a changelogs súper bonitos:

¡Nos vemos 👋🏻!

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.