name: Deploy Stack (Dev) on: push: branches: - dev paths: - 'backend/**' - 'backoffice/**' - 'frontend/**' jobs: # Job 1: Testes do Backend (Padrão GoHorse) test-backend: runs-on: docker if: contains(github.event.head_commit.modified, 'backend/') || contains(github.event.head_commit.added, 'backend/') steps: - name: Checkout code uses: https://github.com/actions/checkout@v4 - name: Setup Go uses: https://github.com/actions/setup-go@v5 with: go-version: '1.24' cache-dependency-path: backend/go.sum - name: Install dependencies run: | cd backend go mod download - name: Run tests run: | cd backend go test -v ./internal/services/... go test -v ./internal/core/usecases/... # Job 2: Deploy com Proteção de I/O e RAM deploy-dev: runs-on: docker needs: [test-backend] # Executa se o teste passar OU se o teste foi pulado (mudança só no front/backoffice) if: always() && (needs.test-backend.result == 'success' || needs.test-backend.result == 'skipped') steps: - name: Executar Deploy via SSH na Apolo uses: https://github.com/appleboy/ssh-action@v1.0.3 with: host: ${{ secrets.HOST }} username: ${{ secrets.USERNAME }} key: ${{ secrets.SSH_KEY }} port: ${{ secrets.PORT || 22 }} script: | cd /mnt/data/gohorsejobs git fetch origin git checkout dev git pull origin dev # --- PREPARAÇÃO DO AMBIENTE --- # 1. Cria diretório temporário na RAM para evitar escritas no SSD (vda3) mkdir -p /tmp/podman-build export TMPDIR=/tmp/podman-build # 2. Força o kernel a liberar cache e finalizar escritas pendentes para baixar o Load sync; echo 3 | sudo tee /proc/sys/vm/drop_caches # --- DEPLOY DO BACKEND --- if git diff --name-only HEAD@{1} HEAD | grep -q "^backend/"; then echo "Iniciando Build Backend (CPU: 50%)..." nice -n 19 ionice -c 3 podman build \ --cpu-quota 50000 \ --memory 1024m \ -t localhost/gohorsejobs-backend-dev:latest ./backend sudo systemctl restart gohorsejobs-backend-dev fi # --- DEPLOY DO BACKOFFICE --- if git diff --name-only HEAD@{1} HEAD | grep -q "^backoffice/"; then echo "Iniciando Build Backoffice (CPU: 30%)..." nice -n 19 ionice -c 3 podman build \ --cpu-quota 30000 \ --memory 2048m \ -t localhost/gohorsejobs-backoffice-dev:latest ./backoffice sudo systemctl restart gohorsejobs-backoffice-dev fi # --- DEPLOY DO FRONTEND (Foco em sobrevivência do disco) --- if git diff --name-only HEAD@{1} HEAD | grep -q "^frontend/"; then echo "Iniciando Build Frontend (CPU: 20%, RAM: 3G)..." # ionice -c 3 garante que o build não roube I/O do banco de dados # NODE_OPTIONS aumenta a RAM disponível para o build não dar swap # --no-cache garante que o Next.js rebuild com os novos valores de env nice -n 19 ionice -c 3 podman build \ --cpu-quota 20000 \ --memory 3072m \ --no-cache \ --build-arg NODE_OPTIONS="--max-old-space-size=2048" \ --build-arg NEXT_PUBLIC_API_URL="${{ secrets.API_URL || 'http://backend:8080' }}" \ --build-arg NEXT_PUBLIC_BACKOFFICE_URL="${{ secrets.BACKOFFICE_URL || 'http://backoffice:3001' }}" \ -t localhost/gohorsejobs-frontend-dev:latest ./frontend sudo systemctl restart gohorsejobs-frontend-dev fi # --- LIMPEZA FINAL --- echo "Limpando caches e sincronizando disco..." rm -rf /tmp/podman-build/* podman image prune -f podman builder prune -f sync