OSVauco/docs/LEARNINGS_CICD_2026-06-10.md
Chris Christiansen 9fcb9c354a
Some checks are pending
Check Python Version Consistency / Check Python Version (push) Waiting to run
feat(core): Fresh initialization - Deploy v3.6.1 Singularity Architecture
2026-09-03 04:03:09 +00:00

3.3 KiB

Cloud Build Smoke-Test Post-Mortem — 10. juni 2026

Lagt til av Perplexity AI etter halv dag med debugging. Ikke gjenta disse feilene.

Symptom

Cloud Build smoke-test returnerte HTTP 404 på /health for alle forsøk, selv etter at Cloud Run-tjenesten var bekreftet live og svarte 200 fra utvikler-VM.

Root Causes (i kronologisk rekkefølge)

1. --audiences flagg på identity token

# FEIL — returnerer tomt token for service accounts:
TOKEN=$(gcloud auth print-identity-token --audiences="$BASE_URL")

# RIKTIG:
TOKEN=$(gcloud auth print-identity-token)

Konsekvens: Token var tom streng. Authorization-header ble sendt uten gyldig token.

2. Tom BASE_URL fra udefinert substitusjon

# FEIL — $_CLOUD_RUN_URL var ikke definert i cloudbuild.yaml:
BASE_URL="https://${_CLOUD_RUN_URL}"
# → curl https:///health → feil host

Konsekvens: curl traff feil URL fullstendig.

3. gcloud run services describe returnerer feil URL

# FEIL — returnerer intern URL (f.eks. zjbqp3prqq-uc.a.run.app), ikke kanonisk:
BASE_URL=$(gcloud run services describe osvauco-agent \
  --format='value(status.url)')

# RIKTIG — hardkod kanonisk URL:
BASE_URL="https://osvauco-agent-357036551735.us-central1.run.app"

Konsekvens: Smoke-test traff en URL som ikke var knyttet til riktig Cloud Run-instans.

4. Cloud Build SA manglet roles/run.invoker

Cloud Run returnerer 404 (ikke 401/403) for uautoriserte kallere — designet for å skjule tjenestens eksistens. Cloud Build service account hadde ikke blitt gitt invoker-rettigheter.

# FIX — kjør én gang per ny Cloud Run-tjeneste:
gcloud run services add-iam-policy-binding osvauco-agent \
  --region=us-central1 \
  --member="serviceAccount:357036551735@cloudbuild.gserviceaccount.com" \
  --role="roles/run.invoker" \
  --project=propane-will-491900-m5

Konsekvens: Alle autentiserte kall fra Cloud Build ble avvist med 404.

Diagnose-metode som fungerte

La til verbose curl -v med og uten auth direkte i smoke-test steget:

echo "=== Med auth ==="
curl -v -H "Authorization: Bearer $TOKEN" "$BASE_URL/health" 2>&1
echo "=== Uten auth ==="
curl -v "$BASE_URL/health" 2>&1

Dette avslørte:

  • server: Google Frontend i response header → ikke appens 404, men GCP frontend
  • Response body: The requested URL /health was not found on this server → IAM-blokkering
  • Token prefix: tom → --audiences bug

Regler som gjelder heretter

  1. ALDRI --audiences flagg med gcloud auth print-identity-token
  2. ALLTID hardkod kanonisk Cloud Run URL i smoke-tests
  3. ALLTID gi Cloud Build SA roles/run.invoker ved opprettelse av ny Cloud Run-tjeneste
  4. BEHOLD sleep 30 i smoke-test — nødvendig for traffic routing
  5. Ved 404 fra automatisert caller → sjekk IAM FØRST, ikke routing

Kanoniske verdier for dette prosjektet

Cloud Run URL:  https://osvauco-agent-357036551735.us-central1.run.app
Cloud Build SA: 357036551735@cloudbuild.gserviceaccount.com
Prosjekt:       propane-will-491900-m5
Region:         us-central1

Tidslinje

  • ~13:00 CEST: Første smoke-test feil
  • ~19:30 CEST: Root cause identifisert (manglende IAM + feil URL + --audiences bug)
  • ~19:37 CEST: IAM binding lagt til, build passerte
  • Totalt tid brukt: ~6.5 timer