CI/CD — GitHub Actions¶
Pipeline automatizado de integração e deploy contínuo.
Visão Geral¶
develop ──PR──→ main ──push──→ CI ──ok──→ CD (deploy)
│
Ruff lint/format
pip-audit
Docker build
Fluxo de trabalho¶
- Desenvolver na branch
develop - Abrir PR de
develop→main - CI roda automaticamente (lint + build)
- Após merge no
main, CD faz deploy automático no servidor
CI — .github/workflows/ci.yml¶
Dispara em: push para main/develop + PRs para main
| Step | Ferramenta | Descrição |
|---|---|---|
| Lint | ruff check . |
Verifica erros de código |
| Format | ruff format --check . |
Verifica formatação |
| Audit | pip-audit --strict |
Vulnerabilidades em dependências (não bloqueia) |
| Build | docker build |
Valida que a imagem Docker compila |
Rodar lint localmente¶
# Instalar ruff
pip install ruff
# Verificar
ruff check .
ruff format --check .
# Corrigir automaticamente
ruff check --fix .
ruff format .
Configuração do Ruff em ruff.toml.
CD — .github/workflows/deploy.yml¶
Dispara em: push para main (após CI passar)
Como funciona¶
- Runner Ubuntu conecta-se à Tailnet via OAuth
- SSH para
laser@100.88.89.90usando deploy key git pull+ rebuild + migrate + restart
Proteções¶
- Concurrency group:
deploy-production— impede deploys simultâneos cancel-in-progress: false— deploy em andamento não é cancelado- CI como dependência: deploy só roda se CI passar
Secrets necessários (GitHub → Settings → Secrets)¶
| Secret | Descrição |
|---|---|
SSH_PRIVATE_KEY |
Chave SSH para acessar laser@100.88.89.90 |
TS_OAUTH_CLIENT_ID |
Client ID do Tailscale OAuth |
TS_OAUTH_SECRET |
Secret do Tailscale OAuth |
Configurar Tailscale OAuth¶
- Acessar Tailscale Admin Console
- Criar OAuth client com permissão de escrita em devices
- Criar tag
cinas ACLs:"tagOwners": { "tag:ci": ["autogroup:admin"] } - Adicionar os secrets no repositório GitHub
Deploy key no servidor¶
A deploy key permite que o servidor clone/pull o repositório privado:
# No servidor, gerar chave (se não existir)
ssh-keygen -t ed25519 -C "laser-estoque-deploy" -f ~/.ssh/deploy_key -N ""
# Adicionar ao ssh config
cat >> ~/.ssh/config << 'EOF'
Host github.com
IdentityFile ~/.ssh/deploy_key
IdentitiesOnly yes
EOF
# Copiar a chave pública e adicionar em:
# GitHub → Repo → Settings → Deploy keys
cat ~/.ssh/deploy_key.pub
Troubleshooting¶
CI falha no ruff¶
ruff check --fix .
ruff format .
git commit -am "fix: lint errors"
CD falha no SSH¶
- Verificar se o secret
SSH_PRIVATE_KEYestá correto - Verificar se Tailscale OAuth está válido
- Testar manualmente:
ssh laser@100.88.89.90
CD falha no docker build¶
- Verificar logs do CI (step "Build Docker image")
- Testar local:
docker build -f Dockerfile.prod -t test .