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