Pular para conteúdo

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

  1. Desenvolver na branch develop
  2. Abrir PR de developmain
  3. CI roda automaticamente (lint + build)
  4. 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

  1. Runner Ubuntu conecta-se à Tailnet via OAuth
  2. SSH para laser@100.88.89.90 usando deploy key
  3. 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

  1. Acessar Tailscale Admin Console
  2. Criar OAuth client com permissão de escrita em devices
  3. Criar tag ci nas ACLs:
    "tagOwners": {
      "tag:ci": ["autogroup:admin"]
    }
    
  4. 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_KEY está 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 .