O maior portal de MU Online do Brasil — desde 2003
Tutorial Avançado Infra

Como montar um pipeline de CI para mudanças no servidor de MU Online

Estruture um pipeline de integração contínua (CI) para configurações e scripts do seu servidor de MU Online, com controle de versão, ambiente de staging, testes automatizados e deploy controlado para produção.

GA Gabriel · Atualizado em 16 abr 2025 · ⏱ 17 min de leitura
Resposta rápida

Mudar arquivos de configuração de um servidor de MU Online em produção sem processo — editando direto no servidor via RDP, sem backup, sem teste prévio — é a receita mais comum para incidentes: GameServer que não sobe, evento que não dispara, item duplicado por uma condição mal configurada. Um pipel

Mudar arquivos de configuração de um servidor de MU Online em produção sem processo — editando direto no servidor via RDP, sem backup, sem teste prévio — é a receita mais comum para incidentes: GameServer que não sobe, evento que não dispara, item duplicado por uma condição mal configurada. Um pipeline de CI (integração contínua) traz para a operação de servidores privados a mesma disciplina usada em desenvolvimento de software: toda mudança passa por controle de versão, validação automatizada e um ambiente de teste antes de chegar à produção. Este tutorial mostra como estruturar esse pipeline especificamente para as particularidades de um servidor de MU (arquivos de configuração, scripts SQL, binários de cliente).

Por que tratar configuração de servidor como código

Os arquivos que definem o comportamento do seu servidor — Item.txt, MonsterSetBase.txt, configurações de drop, scripts de evento, procedures SQL — são, na prática, código: eles determinam comportamento, têm dependências entre si e podem quebrar o sistema se editados incorretamente. Tratá-los como código significa aplicar as mesmas práticas: versionamento, revisão antes de aplicar, ambiente de teste isolado e histórico auditável de quem mudou o quê e quando.

Estrutura de repositório recomendada

Organize um repositório Git (privado) espelhando a estrutura de pastas do servidor, separando claramente o que é configuração versionável do que é gerado/binário grande demais para versionar diretamente:

mu-server-config/
├── GameServer/
│   ├── Data/ItemList.xml
│   ├── Data/MonsterSetBase.txt
│   └── GameServerInfo.dat
├── ConnectServer/
│   └── ConnectServerInfo.dat
├── sql/
│   ├── migrations/
│   │   ├── 001_add_socket_columns.sql
│   │   └── 002_add_event_log_table.sql
│   └── procedures/
├── scripts/
│   ├── deploy_staging.ps1
│   └── deploy_production.ps1
└── .github/workflows/
    └── ci.yml

Arquivos binários grandes (modelos BMD de itens/asas customizadas, texturas) vão em um repositório separado ou usando Git LFS, para não inchar o histórico do repositório principal de configuração.

Ambientes: local, staging e produção

Um pipeline de CI só funciona com pelo menos dois ambientes além da máquina de desenvolvimento: staging (réplica fiel da produção, mas isolada, sem jogadores reais) e produção (o servidor que os jogadores acessam). Toda mudança percorre o mesmo caminho: editar localmente → commit → deploy automático em staging → validação → aprovação manual → deploy em produção.

AmbientePropósitoQuem acessa
Local/devEdição e teste inicial isoladoDesenvolvedor/admin
StagingRéplica de produção para validação completaEquipe interna, GMs de teste
ProduçãoServidor real, jogadores conectadosJogadores

Definindo o pipeline no GitHub Actions

Um workflow básico de CI para este cenário cobre três estágios: validação de sintaxe, deploy em staging e, mediante aprovação, deploy em produção.

name: CI Servidor MU

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  validar:
    runs-on: windows-latest
    steps:
      - uses: actions/checkout@v4
      - name: Validar sintaxe dos arquivos de configuração
        run: powershell -File scripts/validate_config.ps1
      - name: Validar scripts SQL (dry-run)
        run: powershell -File scripts/validate_sql.ps1

  deploy-staging:
    needs: validar
    if: github.ref == 'refs/heads/main'
    runs-on: self-hosted
    steps:
      - uses: actions/checkout@v4
      - name: Deploy em staging
        run: powershell -File scripts/deploy_staging.ps1
      - name: Smoke test (login, criar personagem)
        run: powershell -File scripts/smoke_test.ps1

  deploy-producao:
    needs: deploy-staging
    if: github.ref == 'refs/heads/main'
    runs-on: self-hosted
    environment:
      name: producao
    steps:
      - name: Deploy em produção (com aprovação manual)
        run: powershell -File scripts/deploy_production.ps1

O job deploy-producao usa um environment protegido no GitHub, exigindo aprovação manual de um responsável antes de executar — isso evita que qualquer merge dispare deploy direto em produção sem revisão humana final.

Runners self-hosted: por que são necessários aqui

Diferente de um pipeline de aplicação web comum, o deploy de um servidor de MU precisa rodar em uma máquina Windows com acesso direto ao MuServer e ao SQL Server — normalmente a própria máquina do servidor ou uma intermediária na mesma rede. Por isso, os estágios de deploy usam runners self-hosted (agentes do GitHub Actions instalados na sua própria infraestrutura), enquanto a validação de sintaxe, que não depende do ambiente real, pode rodar em runners hospedados (windows-latest).

Testes automatizados possíveis nesse contexto

Tipo de testeO que validaQuando roda
Validação de sintaxeArquivo de config é bem formado (XML/INI válido)A cada commit
Dry-run de SQLMigração SQL roda sem erro em banco de testeA cada commit que mexe em sql/
Smoke testGameServer sobe, login funciona, personagem cria e equipa item básicoApós deploy em staging
Teste de regressão de sistemas customSockets, asas customizadas, eventos continuam funcionandoAntes de deploy em produção, quando o PR mexe nesses arquivos

Smoke tests podem ser scriptados com um cliente de teste automatizado ou, no mínimo, um checklist manual rápido executado por um GM antes da aprovação de produção.

Gerenciando migrações de banco de dados com versionamento

Scripts SQL que alteram schema (novas colunas, tabelas de log, procedures) devem seguir numeração sequencial e ser idempotentes sempre que possível — ou seja, seguros para rodar mais de uma vez sem duplicar efeito:

-- 002_add_event_log_table.sql
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'EventLog')
BEGIN
    CREATE TABLE EventLog (
        EventLogID INT IDENTITY PRIMARY KEY,
        EventName VARCHAR(100),
        CreateDate DATETIME DEFAULT GETDATE()
    );
END

Mantenha uma tabela de controle (SchemaVersion) registrando quais migrações já rodaram em cada ambiente, evitando reaplicar scripts já executados.

Rollback: planejando a saída antes da entrada

Todo deploy precisa de um plano de rollback documentado antes de ser executado, não improvisado depois de um incidente. Para arquivos de configuração, isso significa manter a versão anterior sempre disponível (o próprio Git já cobre isso via git revert); para mudanças de schema SQL, cada migração deveria ter um script de reversão correspondente (002_add_event_log_table_rollback.sql) testado em staging antes de ir para produção.

Aprovação e trilha de auditoria

Use pull requests como o mecanismo formal de revisão: nenhuma mudança de configuração vai para a branch principal sem pelo menos uma aprovação de outro membro da equipe (ou, em times menores, uma segunda checagem própria em outro dia, para reduzir viés de "parece certo porque acabei de escrever"). O histórico do Git, combinado ao log de aprovações do GitHub, vira a trilha de auditoria: quem mudou o quê, quando, e quem aprovou.

Erros comuns e soluções

SintomaCausa provávelSolução
Deploy quebra produção sem avisoAusência de staging antes do deploy realSempre passar por staging com smoke test antes de produção
Migração SQL falha em produção mas passou em stagingDiferença de dados/schema entre ambientesSincronize periodicamente um snapshot de produção para staging
Ninguém sabe reverter uma mudançaFalta de script de rollback documentadoExija rollback testado como parte do PR de toda migração de schema
Pipeline trava por falta de runnerRunner self-hosted offlineMonitore a máquina do runner e configure alerta de disponibilidade
Mudança crítica aplicada sem revisãoDeploy direto na branch principal sem PRProteja a branch principal exigindo PR e aprovação

Checklist de pipeline de CI

  • Repositório Git criado com estrutura espelhando as pastas do servidor.
  • Ambiente de staging isolado configurado como réplica de produção.
  • Workflow de CI com validação de sintaxe em todo commit.
  • Smoke tests automatizados ou checklist manual pós-deploy em staging.
  • Aprovação manual obrigatória antes de deploy em produção.
  • Scripts de migração SQL numerados, idempotentes e com rollback testado.
  • Branch principal protegida, exigindo pull request e revisão.
  • Trilha de auditoria (quem mudou o quê, quando) acessível pelo histórico do Git.

Com o pipeline funcionando, cada mudança de configuração, sistema custom ou script SQL passa a ser rastreável e reversível — uma base sólida para evoluir com segurança os sistemas mais avançados do servidor, como os descritos no tutorial de criação de servidor de MU Online.

Perguntas frequentes

Vale a pena montar CI para um servidor pequeno/hobby?

Uma versão simplificada vale a pena mesmo em projetos pequenos: no mínimo controle de versão (Git) das configurações e um ambiente de staging para testar antes de aplicar em produção. O pipeline completo com testes automatizados compensa mais em servidores com equipe e mudanças frequentes.

Como faço controle de versão de arquivos binários do MuServer (como .bmd de itens)?

Git não lida bem com diffs de binários, mas ainda vale versionar — use Git LFS (Large File Storage) para arquivos grandes/binários, mantendo o histórico sem inchar o repositório principal com blobs completos a cada mudança.

É seguro automatizar o deploy direto em produção?

Não sem um staging intermediário. O fluxo recomendado é sempre commit → staging → validação (manual ou automatizada) → aprovação → produção. Pular o staging é a causa mais comum de quebrar o servidor em horário de pico por uma mudança de configuração não testada.

Que tipo de teste automatizado faz sentido para configuração de servidor de MU?

Testes de sintaxe (o arquivo de configuração é válido e o GameServer sobe sem erro), testes de smoke (login, criar personagem, equipar item básico) e testes de regressão em sistemas customizados (sockets, asas, eventos) antes de cada deploy que mexe nesses arquivos.

Preciso de um servidor de CI dedicado (Jenkins, GitHub Actions) para isso?

Não necessariamente do zero. GitHub Actions ou GitLab CI (com runners próprios, já que o build/deploy provavelmente roda em uma máquina Windows com o MuServer) resolvem bem a maioria dos casos sem custo de infraestrutura adicional além do próprio runner.

GA
Editor de guias e builds

Gabriel cobre gameplay, builds de classes, PvP e progressão. Testa cada estratégia em servidor antes de publicar.

Continue lendo

Artigos relacionados