gohorsejobs/.forgejo/workflows/deploy.yaml

108 lines
No EOL
4.1 KiB
YAML

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