Como criar um changelog automático a partir do Git para seu servidor de MU Online
Configure um pipeline que gera changelogs automaticamente a partir dos commits do Git do seu servidor de MU Online, usando Conventional Commits, semantic-release e publicação automática no site e no Discord.
Todo servidor de MU Online que evolui com frequência — corrigindo bugs, balanceando itens, adicionando eventos — enfrenta o mesmo problema de comunicação: como avisar a comunidade do que mudou, sem depender de alguém lembrar de escrever manualmente um post de "novidades" a cada atualização? A respos
Todo servidor de MU Online que evolui com frequência — corrigindo bugs, balanceando itens, adicionando eventos — enfrenta o mesmo problema de comunicação: como avisar a comunidade do que mudou, sem depender de alguém lembrar de escrever manualmente um post de "novidades" a cada atualização? A resposta é automatizar o changelog a partir do próprio histórico do Git, usando um padrão de mensagens de commit que o computador consegue interpretar. Este tutorial mostra como adotar Conventional Commits, gerar changelogs automaticamente com semantic-release, e publicar essas notas de versão no site e no Discord sem trabalho manual repetido.
Por que gerar changelog a partir do Git
Escrever changelog manualmente tem dois problemas recorrentes: ou fica esquecido (ninguém lembra de atualizar) ou fica genérico ("correções diversas"). Quando o changelog nasce do histórico de commits, cada mudança já documentada no código vira automaticamente uma linha de changelog, categorizada por tipo (funcionalidade nova, correção, mudança que quebra compatibilidade). O time só precisa escrever uma boa mensagem de commit uma vez — o resto é automático.
O padrão Conventional Commits
Toda mensagem de commit segue um formato fixo que descreve o tipo de mudança e o escopo afetado:
<tipo>(<escopo>): <descrição curta>
<corpo opcional com mais detalhes>
<rodapé opcional, ex: BREAKING CHANGE>
| Tipo | Quando usar | Aparece no changelog como |
|---|---|---|
feat | Nova funcionalidade (ex: novo evento, novo item) | Seção "Novidades" |
fix | Correção de bug | Seção "Correções" |
perf | Melhoria de performance | Seção "Performance" |
docs | Alteração só de documentação | Geralmente omitido do changelog público |
chore | Tarefas de manutenção sem impacto no jogador | Omitido do changelog público |
feat! ou rodapé BREAKING CHANGE | Mudança que quebra compatibilidade | Seção destacada "Mudanças importantes" |
Pré-requisitos
- Repositório Git do servidor (scripts de configuração, banco, painel web) já versionado.
- Node.js 18+ instalado na máquina de build/CI.
- Acesso de escrita ao repositório e às permissões de release (tags).
- Um pipeline de CI configurado (GitHub Actions, GitLab CI ou Gitea Actions).
Passo 1 — Padronizar as mensagens de commit
Instale o commitlint para validar mensagens antes de aceitar o commit:
npm install --save-dev @commitlint/cli @commitlint/config-conventional husky
npx husky init
echo "npx --no -- commitlint --edit \$1" > .husky/commit-msg
Crie o arquivo commitlint.config.js:
module.exports = { extends: ['@commitlint/config-conventional'] };
A partir daqui, um commit como corrigido bug do drop será rejeitado; o time precisa escrever fix(drop): corrige taxa de drop de jewel em Devil Square.
Passo 2 — Instalar e configurar o semantic-release
npm install --save-dev semantic-release @semantic-release/changelog @semantic-release/git
Arquivo .releaserc.json:
{
"branches": ["main"],
"plugins": [
"@semantic-release/commit-analyzer",
"@semantic-release/release-notes-generator",
"@semantic-release/changelog",
"@semantic-release/git"
]
}
O commit-analyzer decide se a próxima versão é patch, minor ou major com base nos tipos de commit desde o último release. O release-notes-generator monta o texto; o @semantic-release/changelog grava em CHANGELOG.md; o @semantic-release/git faz commit do changelog atualizado de volta no repositório.
Passo 3 — Configurar o pipeline de CI
Exemplo de workflow em GitHub Actions (.github/workflows/release.yml):
name: Release
on:
push:
branches: [main]
jobs:
release:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-node@v4
with:
node-version: 18
- run: npm ci
- run: npx semantic-release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Toda vez que um merge cair na branch main, o pipeline analisa os commits novos, decide a versão, gera o changelog e cria a tag e o release automaticamente.
Passo 4 — Publicar o changelog no site do servidor
Adicione um passo extra ao pipeline que envia o conteúdo gerado para o repositório de conteúdo do site (ou dispara um webhook de rebuild), transformando cada release em um post na página de "Novidades" do portal. Isso fecha o ciclo: o desenvolvedor só escreve uma boa mensagem de commit, e o jogador vê a novidade publicada sem intervenção manual.
Passo 5 — Notificar automaticamente no Discord
Um passo adicional no workflow pode enviar o changelog gerado para um webhook do Discord, formatado como embed, assim que a release for publicada:
- name: Notificar Discord
if: success()
run: |
curl -H "Content-Type: application/json" \
-d "{\"content\": \"📦 Nova versão publicada! Confira o changelog no site.\"}" \
${{ secrets.DISCORD_WEBHOOK_URL }}
Categorização de mudanças relevantes para jogadores
Nem toda mudança técnica interessa ao jogador final. Separe o changelog em dois públicos:
| Público | O que aparece | Onde publicar |
|---|---|---|
| Jogadores | Novos eventos, itens, correções de balanceamento, mudanças de drop | Site + Discord (canal de anúncios) |
| Equipe técnica | Refatorações, mudanças de infraestrutura, dependências atualizadas | CHANGELOG.md interno do repositório |
Use escopos de commit (feat(evento), fix(drop), chore(deps)) para automatizar essa separação com um filtro simples no script de publicação.
Versionamento semântico aplicado ao servidor
Adote versões no formato MAJOR.MINOR.PATCH. Um fix sobe o PATCH (ex: 2.4.1 → 2.4.2), um feat sobe o MINOR (2.4.2 → 2.5.0), e um BREAKING CHANGE sobe o MAJOR (2.5.0 → 3.0.0) — por exemplo, uma migração de banco que exige reset de personagens ou uma mudança incompatível na API do painel web.
Erros comuns e soluções
| Sintoma | Causa provável | Solução |
|---|---|---|
| Changelog não é gerado | Commits não seguem Conventional Commits | Ative o commitlint como hook obrigatório |
| Pipeline falha ao criar tag | Token do CI sem permissão de escrita | Ajuste permissions: contents: write no workflow |
| Versão não muda entre releases | Nenhum commit feat/fix desde o último release | Confirme que os commits novos usam o tipo correto |
| Changelog cheio de ruído técnico | Falta de separação por escopo/tipo | Filtre por tipo antes de publicar no site/Discord |
| Notificação no Discord duplicada | Workflow disparando em múltiplos eventos | Restrinja o on: a push na branch de release apenas |
Checklist de lançamento
- Conventional Commits adotado e validado por commitlint.
- semantic-release configurado com os plugins de changelog e git.
- Pipeline de CI criando tags e releases automaticamente.
- Changelog público (jogadores) separado do changelog técnico interno.
- Publicação automática no site testada de ponta a ponta.
- Notificação no Discord configurada e validada.
- Versionamento semântico documentado para a equipe.
Com o changelog automatizado, cada atualização do seu servidor passa a ser rastreável e comunicada sem esforço manual — o próximo passo natural é conectar esse pipeline ao processo de deploy do servidor de MU Online, fazendo com que toda release publicada também dispare a atualização do ambiente de produção.
Perguntas frequentes
Preciso reescrever o histórico de commits que já existe?
Não. O changelog automático passa a valer a partir do momento em que você adota o padrão de mensagens (Conventional Commits). Commits antigos podem ser incluídos manualmente em uma seção 'Histórico' no changelog, sem precisar reescrever nada.
Meu time não segue nenhum padrão de commit hoje, dá pra migrar aos poucos?
Sim. Comece exigindo o padrão apenas em branches de release ou apenas para a equipe núcleo, e use um hook de commit (commitlint) para validar as mensagens antes mesmo de chegarem ao repositório remoto.
O changelog gerado pode ser publicado automaticamente no site do servidor?
Sim, com um passo extra no pipeline que envia o changelog gerado (em Markdown ou JSON) para a API do seu site ou grava direto no repositório de conteúdo, disparando o rebuild da página de novidades.
Isso funciona sem GitHub Actions, usando GitLab ou um servidor Git próprio?
Sim, o conceito (Conventional Commits + semantic-release) é agnóstico de plataforma. GitLab CI e Gitea Actions têm sintaxe de pipeline própria, mas os mesmos pacotes Node.js (semantic-release, conventional-changelog) rodam da mesma forma.
Vale a pena para um servidor pequeno com só uma pessoa mexendo no código?
Vale, principalmente pela disciplina que o padrão de commits impõe e pela transparência que o changelog dá aos jogadores. Mesmo sozinho, você ganha um histórico legível de decisões técnicas e um canal de comunicação de mudanças pronto.