# 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 ```bash # 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 ```yaml # 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 ```bash # 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. ```bash # 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: ```bash 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