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
This commit is contained in:
chrischristiansen-glitch 2026-06-10 19:48:32 +02:00
parent 0f163ab0af
commit 7b857059b3

View File

@ -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