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:
parent
0f163ab0af
commit
7b857059b3
99
docs/LEARNINGS_CICD_2026-06-10.md
Normal file
99
docs/LEARNINGS_CICD_2026-06-10.md
Normal 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
|
||||||
Loading…
Reference in New Issue
Block a user