From 9037f2dd69eb2806791b51ab79f0f9bd11673f7e Mon Sep 17 00:00:00 2001 From: bruno Date: Tue, 3 Nov 2026 08:44:08 -0500 Subject: [PATCH] =?UTF-8?q?fix(ci):=20e2e=20joint=20l'app=20par=20DNS=20de?= =?UTF-8?q?=20r=C3=A9seau=20(DinD),=20plus=20de=20port=20publi=C3=A9=20ni?= =?UTF-8?q?=20curls=20sans=20timeout?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Le step 'Start ObsiGate' pendait : boucle de health curls sans --max-time vers l'IP passerelle:2029 (injoignable/port fuité par un run antérieur) = 150 s de blocage par tentative. L'app est désormais rattachée au réseau du job et jointe par nom (obsigate-e2e:8080), avec timeout partout et dump des logs container à l'échec. --- .gitea/workflows/ci.yml | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) 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()