diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 453cc6f..6e3e714 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -46,7 +46,7 @@ jobs: -Dsonar.javascript.lcov.reportPaths=coverage/lcov.info - name: 5. Dynamic Security Scan (OWASP ZAP) - if: github.event_name == 'push' + # REMOVIDO o "if: github.event_name == 'push'". Agora o ZAP corre SEMPRE (nos PRs e nos Merges)! run: | echo ">>> 1. Limpeza profunda do ambiente..." docker rm -f apex-sandbox zap-scanner || true @@ -64,10 +64,8 @@ jobs: docker volume create zap-data echo ">>> 4. Executar OWASP ZAP (FULL SCAN + AJAX SPIDER)..." - # Desligamos a paragem automática do Linux set +e - # Adicionámos o -J report.json para criar um ficheiro legível por máquina docker run --user root --name zap-scanner \ --network zap-net \ -v zap-data:/zap/wrk/:rw \ @@ -77,11 +75,9 @@ jobs: -J report.json \ -j - # Voltamos a ligar a paragem de segurança set -e echo ">>> 5. Recolher os relatórios..." - # Agora extraímos os dois ficheiros (HTML para humanos, JSON para a pipeline) docker cp zap-scanner:/zap/wrk/report.html qatests/report.html || true docker cp zap-scanner:/zap/wrk/report.json qatests/report.json || true @@ -91,10 +87,9 @@ jobs: docker volume rm zap-data || true echo ">>> 7. Veredicto Final da Segurança (Gatekeeper Policy)..." - # Lemos os relatórios gerados. O -i ignora maiúsculas/minúsculas e o -E permite múltiplas procuras. if grep -qi 'Cross Site Scripting (Reflected)' qatests/report.html || grep -iE '"riskcode"\s*:\s*"3"|"risk"\s*:\s*"High"' qatests/report.json; then echo "🚨 ALERTA CRÍTICO: O OWASP ZAP detetou uma vulnerabilidade de Injeção de Código (XSS)!" - echo "🛑 Pipeline BLOQUEADA para proteger o ambiente de Produção." + echo "🛑 Pipeline BLOQUEADA para proteger a Branch Principal e a Produção." exit 1 else echo "✅ ZAP Scan concluído. Nenhuma falha Crítica ou Alta encontrada." @@ -102,6 +97,7 @@ jobs: fi - name: 6. Production Deployment + # MANTIDO: O deploy para a Produção SÓ pode acontecer num push/merge direto para a main! if: github.event_name == 'push' run: | docker rm -f portal-corporativo || true @@ -110,7 +106,8 @@ jobs: docker cp qatests/report.html portal-corporativo:/usr/src/app/frontend/zap-report.html || true - name: 7. Archive ZAP Report - if: always() && github.event_name == 'push' + # ALTERADO: Usamos apenas always(). Queremos ver o relatório independentemente de ser PR ou Push. + if: always() uses: actions/upload-artifact@v3 with: name: owasp-zap-report