Staging de PRs
O Runner permite criar ambientes efemeros para testar Pull Requests antes do merge.
Conceito
Pull Request #42
|
| runner stage deploy --pr 42
v
Ambiente Staging
URL: pr-42.staging.meusite.com.br
TTL: 48 horas
|
| Testes, review
v
Merge ou Close
|
| Cleanup automatico
v
Ambiente destruidoConfiguracao
1. Configurar DNS Wildcard
Configure um registro wildcard no seu DNS:
*.staging.meusite.com.br → IP_DO_SERVIDOR2. Configurar .deploy.yml
Adicione a secao de staging:
instances:
production:
domain: app.meusite.com.br
source:
type: dist
pr:
domain_pattern: "pr-${PR_NUMBER}.staging.meusite.com.br"
source:
type: pr
ephemeral: true
ttl_hours: 48
staging:
enabled: true
max_instances: 5
ttl_hours: 483. Configurar config.yml (Global)
staging:
enabled: true
base_path: /opt/runner/staging
network: public
default_ttl_hours: 48
max_total_instances: 204. Instalar GitHub CLI
O staging usa gh para clonar branches de PRs:
# Instalar
apt install gh
# Autenticar
gh auth loginUso
Criar Staging
runner stage deploy --repo usuario/meu-app --pr 42Output:
Staging deployed:
ID: staging_meu-app_pr42
URL: https://pr-42.staging.meusite.com.br
TTL: 48h (expira em 2026-02-14 10:30)Listar Stagings
runner stage listOutput:
Stagings ativos:
staging_meu-app_pr42
URL: pr-42.staging.meusite.com.br
Status: healthy
TTL: 46h restantes
staging_outro-app_pr15
URL: pr-15.staging.outrosite.com.br
Status: healthy
TTL: 12h restantesDestruir Staging
runner stage destroy --id staging_meu-app_pr42Cleanup Automatico
runner stage cleanupRemove todos os stagings que passaram do TTL.
Variaveis de Template
| Variavel | Descricao | Exemplo |
|---|---|---|
${PR_NUMBER} |
Numero da PR | 42 |
${PROJECT} |
Nome do projeto | meu-app |
${BRANCH} |
Branch da PR | feature/login |
${DOMAIN} |
Dominio base | meusite.com.br |
${DATETIME} |
Data/hora | 20260212-1030 |
${HASH} |
Hash curto do commit | abc123 |
Cron de Cleanup
Configure cleanup automatico:
# crontab -e
0 * * * * /opt/runner/runner stage cleanup --json >> /var/log/runner-staging-cleanup.json 2>&1Limites
Por Projeto
Configurado em staging.max_instances no .deploy.yml:
staging:
max_instances: 5Global
Configurado em staging.max_total_instances no config.yml:
staging:
max_total_instances: 20Quando Limite e Atingido
$ runner stage deploy --repo usuario/meu-app --pr 43
Error: max instances reached (5/5). Destroy an existing staging first.Fluxo de Trabalho
Desenvolvedor
- Cria PR no GitHub
- Executa
runner stage deploy --pr 42 - Testa em
pr-42.staging.meusite.com.br - Faz ajustes, commits
- Redeploya staging (automatico ou manual)
- Merge da PR
- Staging destruido no cleanup
Automacao via CI
Adicione ao workflow do GitHub:
# .github/workflows/staging.yml
name: Staging
on:
pull_request:
types: [opened, synchronize]
jobs:
deploy:
runs-on: self-hosted
steps:
- name: Deploy staging
run: |
runner stage deploy --repo ${{ github.repository }} --pr ${{ github.event.pull_request.number }} --jsonRedeploy de PR
Se fizer novos commits na PR:
# Destroi e recria
runner stage deploy --repo usuario/meu-app --pr 42O Runner detecta staging existente e recria automaticamente.
Troubleshooting
DNS nao resolve
Verifique wildcard DNS:
dig pr-42.staging.meusite.com.brGitHub CLI nao autenticado
gh auth status
gh auth loginContainer unhealthy
docker logs staging_meu-app_pr42 --tail 100Max instances atingido
# Listar todos
runner stage list
# Destruir antigos
runner stage destroy --id staging_meu-app_pr35
runner stage destroy --id staging_meu-app_pr38
# Ou cleanup automatico
runner stage cleanupBoas Praticas
TTL Adequado
- PRs rapidas: 24h
- Features grandes: 72h
- Reviews demorados: 168h (1 semana)
Naming Convention
Use domain_pattern consistente:
pr-${PR_NUMBER}.staging.${DOMAIN}- Padrao${BRANCH}.staging.${DOMAIN}- Por branch${PR_NUMBER}-${HASH}.staging.${DOMAIN}- Com hash
Recursos
Stagings consomem recursos. Monitore:
- Numero de containers
- Uso de memoria/CPU
- Espaco em disco
By Borlot.com.br on 12/02/2026