diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index fa03077..7df7f81 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -272,7 +272,13 @@ jobs: - name: Start ObsiGate run: | docker rm -f obsigate-e2e 2>/dev/null || true - docker create --name obsigate-e2e -p 2029:8080 \ + # DinD robuste : PAS de port publié (les ports 2029 fuités par des + # runs antérieurs font échouer « docker start », et l'IP passerelle + # du job n'est pas toujours joignable → boucle de health curls sans + # timeout qui pendaient 150 s chacun). À la place, l'app est + # rattachée au réseau du job et jointable par nom DNS embarqué. + JOBNET=$(docker inspect -f '{{range $k, $v := .NetworkSettings.Networks}}{{$k}} {{end}}' "$(hostname)" 2>/dev/null | awk '{print $1}') + docker create --name obsigate-e2e \ -v $(pwd)/test_vault:/vaults/TestVault \ -v $(pwd)/test_dir:/vaults/TestDir \ -e VAULT_1_NAME=TestVault \ @@ -288,17 +294,22 @@ jobs: # fixtures avant le démarrage (l'indexeur scanne au démarrage). docker cp test_vault/. obsigate-e2e:/vaults/TestVault docker cp test_dir/. obsigate-e2e:/vaults/TestDir + if [ -n "$JOBNET" ]; then docker network connect "$JOBNET" obsigate-e2e || true; fi docker start obsigate-e2e - # Le port publié est joignable via l'IP de la passerelle (localhost - # du job container ne voit pas le port publié sur l'hôte). - GW=$(ip route show default | awk '{print $3}' || echo 172.17.0.1) - echo "Gateway IP: $GW" - # Wait for health check - for i in $(seq 1 30); do - if curl -sf "http://$GW:2029/api/health"; then echo "Health OK"; break; fi + if [ -n "$JOBNET" ]; then + APP_URL="http://obsigate-e2e:8080" + else + echo "Réseau du job introuvable (JOBNET vide) — impossible de localiser l'app sans port publié" + exit 1 + fi + echo "APP_URL: $APP_URL" + # --max-time : ne JAMAIS pendre sans timeout (bug d'origine : curls + # sans timeout = 150 s × 31 tentatives, job « bloqué »). + for i in $(seq 1 40); do + if curl -sf --max-time 3 "$APP_URL/api/health"; then echo "Health OK"; break; fi sleep 1 done - curl -sf "http://$GW:2029/api/health" >/dev/null || { echo "App not reachable at $GW:2029"; exit 1; } + curl -sf --max-time 5 "$APP_URL/api/health" >/dev/null || { echo "App not reachable at $APP_URL"; docker logs --tail 40 obsigate-e2e; exit 1; } # Les fixtures sont copiées via `docker cp` en root → rendre le vault # inscriptible par l'utilisateur non-root de l'app (UID 1000), sinon # toute création/édition de fichier renvoie 403 « Vault is read-only ». @@ -306,9 +317,10 @@ jobs: - name: Run E2E tests run: | - GW=$(ip route show default | awk '{print $3}' || echo 172.17.0.1) - echo "Using BASE_URL=http://$GW:2029" - BASE_URL="http://$GW:2029" npx playwright test --project=chromium-desktop --reporter=list + BASE_URL="http://obsigate-e2e:8080" + docker exec obsigate-e2e true >/dev/null 2>&1 || { echo "obsigate-e2e n'est pas en marche"; exit 1; } + echo "Using BASE_URL=$BASE_URL" + BASE_URL="$BASE_URL" npx playwright test --project=chromium-desktop --reporter=list - name: Upload test results if: always()