¡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
- Haces merge de Pull Requests con labels apropiadas (
feature,bug,docs, etc.). - Creas un tag de versión:
git tag v1.2.0 git push --tags - El workflow de GitHub Actions se dispara automáticamente.
- Se genera el changelog agrupando los PRs por categoría.
- 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 👋🏻!
