From 7b857059b35754bad2b75cce7f6cba35c4f4d222 Mon Sep 17 00:00:00 2001 From: chrischristiansen-glitch Date: Wed, 10 Jun 2026 19:48:32 +0200 Subject: [PATCH] docs: append Cloud Build CI/CD lessons learned (10. juni 2026) - GEMINI.md: new section '## Cloud Build & CI/CD Rules' - ROADMAP.md: completed infra task appended - MASTERPLAN.md: lessons learned section appended - LEARNINGS.md: detailed post-mortem appended --- docs/LEARNINGS_CICD_2026-06-10.md | 99 +++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 docs/LEARNINGS_CICD_2026-06-10.md diff --git a/docs/LEARNINGS_CICD_2026-06-10.md b/docs/LEARNINGS_CICD_2026-06-10.md new file mode 100644 index 0000000..86ad877 --- /dev/null +++ b/docs/LEARNINGS_CICD_2026-06-10.md @@ -0,0 +1,99 @@ +# 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