155 lines
No EOL
6.1 KiB
YAML
155 lines
No EOL
6.1 KiB
YAML
name: Deploy Stack (Dev)
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- dev
|
|
paths:
|
|
- 'backend/**'
|
|
- 'backoffice/**'
|
|
- 'frontend/**'
|
|
|
|
env:
|
|
REGISTRY: rg.fr-par.scw.cloud
|
|
NAMESPACE: gohorsejobs
|
|
|
|
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: Build e Push das Imagens para Scaleway Registry
|
|
build-and-push:
|
|
runs-on: docker
|
|
needs: [test-backend]
|
|
if: always() && (needs.test-backend.result == 'success' || needs.test-backend.result == 'skipped')
|
|
outputs:
|
|
backend_updated: ${{ steps.check.outputs.backend }}
|
|
frontend_updated: ${{ steps.check.outputs.frontend }}
|
|
backoffice_updated: ${{ steps.check.outputs.backoffice }}
|
|
steps:
|
|
- name: Checkout code
|
|
uses: https://github.com/actions/checkout@v4
|
|
with:
|
|
fetch-depth: 2
|
|
|
|
- name: Check changed files
|
|
id: check
|
|
run: |
|
|
if git diff --name-only HEAD~1 HEAD | grep -q "^backend/"; then
|
|
echo "backend=true" >> $GITHUB_OUTPUT
|
|
else
|
|
echo "backend=false" >> $GITHUB_OUTPUT
|
|
fi
|
|
if git diff --name-only HEAD~1 HEAD | grep -q "^frontend/"; then
|
|
echo "frontend=true" >> $GITHUB_OUTPUT
|
|
else
|
|
echo "frontend=false" >> $GITHUB_OUTPUT
|
|
fi
|
|
if git diff --name-only HEAD~1 HEAD | grep -q "^backoffice/"; then
|
|
echo "backoffice=true" >> $GITHUB_OUTPUT
|
|
else
|
|
echo "backoffice=false" >> $GITHUB_OUTPUT
|
|
fi
|
|
|
|
- name: Login to Scaleway Registry
|
|
run: |
|
|
echo "${{ secrets.SCW_SECRET_KEY }}" | docker login ${{ env.REGISTRY }} -u nologin --password-stdin
|
|
|
|
- name: Build and Push Backend
|
|
if: steps.check.outputs.backend == 'true'
|
|
run: |
|
|
docker build -t ${{ env.REGISTRY }}/${{ env.NAMESPACE }}/backend:dev-${{ github.sha }} \
|
|
-t ${{ env.REGISTRY }}/${{ env.NAMESPACE }}/backend:dev-latest \
|
|
./backend
|
|
docker push ${{ env.REGISTRY }}/${{ env.NAMESPACE }}/backend:dev-${{ github.sha }}
|
|
docker push ${{ env.REGISTRY }}/${{ env.NAMESPACE }}/backend:dev-latest
|
|
|
|
- name: Build and Push Frontend
|
|
if: steps.check.outputs.frontend == 'true'
|
|
run: |
|
|
docker build \
|
|
--build-arg NODE_OPTIONS="--max-old-space-size=2048" \
|
|
--build-arg NEXT_PUBLIC_API_URL="${{ secrets.API_URL }}" \
|
|
--build-arg NEXT_PUBLIC_BACKOFFICE_URL="${{ secrets.BACKOFFICE_URL }}" \
|
|
-t ${{ env.REGISTRY }}/${{ env.NAMESPACE }}/frontend:dev-${{ github.sha }} \
|
|
-t ${{ env.REGISTRY }}/${{ env.NAMESPACE }}/frontend:dev-latest \
|
|
./frontend
|
|
docker push ${{ env.REGISTRY }}/${{ env.NAMESPACE }}/frontend:dev-${{ github.sha }}
|
|
docker push ${{ env.REGISTRY }}/${{ env.NAMESPACE }}/frontend:dev-latest
|
|
|
|
- name: Build and Push Backoffice
|
|
if: steps.check.outputs.backoffice == 'true'
|
|
run: |
|
|
docker build \
|
|
-t ${{ env.REGISTRY }}/${{ env.NAMESPACE }}/backoffice:dev-${{ github.sha }} \
|
|
-t ${{ env.REGISTRY }}/${{ env.NAMESPACE }}/backoffice:dev-latest \
|
|
./backoffice
|
|
docker push ${{ env.REGISTRY }}/${{ env.NAMESPACE }}/backoffice:dev-${{ github.sha }}
|
|
docker push ${{ env.REGISTRY }}/${{ env.NAMESPACE }}/backoffice:dev-latest
|
|
|
|
# Job 3: Deploy no Servidor (Pull das imagens do Scaleway)
|
|
deploy-dev:
|
|
runs-on: docker
|
|
needs: [build-and-push]
|
|
if: always() && needs.build-and-push.result == 'success'
|
|
steps:
|
|
- name: Deploy via SSH
|
|
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: |
|
|
# Login no Scaleway Registry
|
|
echo "${{ secrets.SCW_SECRET_KEY }}" | podman login ${{ env.REGISTRY }} -u nologin --password-stdin
|
|
|
|
# --- DEPLOY DO BACKEND ---
|
|
if [ "${{ needs.build-and-push.outputs.backend_updated }}" == "true" ]; then
|
|
echo "Pulling e reiniciando Backend..."
|
|
podman pull ${{ env.REGISTRY }}/${{ env.NAMESPACE }}/backend:dev-latest
|
|
podman tag ${{ env.REGISTRY }}/${{ env.NAMESPACE }}/backend:dev-latest localhost/gohorsejobs-backend-dev:latest
|
|
sudo systemctl restart gohorsejobs-backend-dev
|
|
fi
|
|
|
|
# --- DEPLOY DO FRONTEND ---
|
|
if [ "${{ needs.build-and-push.outputs.frontend_updated }}" == "true" ]; then
|
|
echo "Pulling e reiniciando Frontend..."
|
|
podman pull ${{ env.REGISTRY }}/${{ env.NAMESPACE }}/frontend:dev-latest
|
|
podman tag ${{ env.REGISTRY }}/${{ env.NAMESPACE }}/frontend:dev-latest localhost/gohorsejobs-frontend-dev:latest
|
|
sudo systemctl restart gohorsejobs-frontend-dev
|
|
fi
|
|
|
|
# --- DEPLOY DO BACKOFFICE ---
|
|
if [ "${{ needs.build-and-push.outputs.backoffice_updated }}" == "true" ]; then
|
|
echo "Pulling e reiniciando Backoffice..."
|
|
podman pull ${{ env.REGISTRY }}/${{ env.NAMESPACE }}/backoffice:dev-latest
|
|
podman tag ${{ env.REGISTRY }}/${{ env.NAMESPACE }}/backoffice:dev-latest localhost/gohorsejobs-backoffice-dev:latest
|
|
sudo systemctl restart gohorsejobs-backoffice-dev
|
|
fi
|
|
|
|
# --- LIMPEZA ---
|
|
echo "Limpando imagens antigas..."
|
|
podman image prune -f |