diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml index 1441ed4..0679a2e 100644 --- a/.gitea/workflows/ci.yaml +++ b/.gitea/workflows/ci.yaml @@ -41,6 +41,27 @@ jobs: nuget-${{ runner.os }}- - run: make lint + # The Helm chart's only automated gate: it renders and schema-checks the whole + # stack, and checks it still describes the same stack as the compose file + # (ADR-0033). No cluster involved — see docs/runbooks/kubernetes-talos.md. + k8s: + runs-on: ubuntu-latest + steps: + - uses: https://github.com/actions/checkout@v4 + # helm as its pinned static binary rather than a marketplace action: one URL, + # the same one the Talos runbook §0 gives a developer, and no third-party + # action to vet (CLAUDE.md §13). The drift check also needs `docker compose`, + # which the runner already has (see docs/runbooks/ci.md). + - name: Install helm + run: | + mkdir -p "$HOME/.local/bin" + curl -sSL https://get.helm.sh/helm-v3.16.4-linux-amd64.tar.gz \ + | tar xz -O linux-amd64/helm > "$HOME/.local/bin/helm" + chmod +x "$HOME/.local/bin/helm" + echo "$HOME/.local/bin" >> "$GITHUB_PATH" + - run: make k8s-lint + - run: make k8s-drift + build: runs-on: ubuntu-latest steps: diff --git a/docs/architecture/adr-0033-kubernetes-via-one-helm-chart.md b/docs/architecture/adr-0033-kubernetes-via-one-helm-chart.md index ef7b39e..feaf080 100644 --- a/docs/architecture/adr-0033-kubernetes-via-one-helm-chart.md +++ b/docs/architecture/adr-0033-kubernetes-via-one-helm-chart.md @@ -126,8 +126,9 @@ Consequences of that shape, each chosen deliberately: **Negative / costs** -- A second deployment description to keep in step with compose. Nothing enforces that - today; a drift check belongs in CI (follow-up). +- A second deployment description to keep in step with compose. `make k8s-drift` (#168) + now enforces the part that bites — the workload set and the resolved images, with the + four deviations below declared — but not per-workload env, ports or volumes. - `helm install` alone is not enough — the ConfigMaps must be seeded first, and a missing one surfaces as `ContainerCreating`, not as a clear error. - Generic templates mean a values typo can render valid-but-wrong YAML; `k8s-lint` catches diff --git a/docs/runbooks/ci.md b/docs/runbooks/ci.md index 5c6d3a7..0a22a95 100644 --- a/docs/runbooks/ci.md +++ b/docs/runbooks/ci.md @@ -2,8 +2,10 @@ > **Status: active.** The workflow `.gitea/workflows/ci.yaml` runs on Gitea's > hosted `ubuntu-latest` runner — no self-hosted runner required. -> **`make ci` is still the local gate** — it runs the exact same checks -> (the workflow calls the same `make` targets). +> **`make ci` is still the local gate** — it runs the same checks via the same +> `make` targets, with one exception: the `k8s` job's targets are not in `make ci`, +> because `helm` is optional for everyone not deploying to Kubernetes. Run +> `make k8s-lint k8s-drift` by hand after touching the chart or the compose file. ## The pipeline @@ -16,6 +18,8 @@ and CI cannot drift: | `lint` | `make lint` → `dotnet format … --verify-no-changes` | .NET 10 SDK | | `build` | `make build` → `dotnet build … -c Release` | .NET 10 SDK | | `unit` | `make unit` → `dotnet test … -c Release --filter "Category!=Integration"` | .NET 10 SDK | +| `frontend` | `make frontend` → Nx lint/test/build for the four portals | pnpm + Node | +| `k8s` | `make k8s-lint` (render + schema-check the Helm chart) → `make k8s-drift` (chart still describes the same stack as `infra/docker-compose.yml`) | pinned `helm` binary + `docker compose` | | `mutation` | `make mutation` → `dotnet tool restore` → `dotnet stryker` (ACL); uploads the HTML report as an artifact | .NET 10 SDK | | `verify-stack` | the single live-stack stage — steps: `make verify-up` (full stack up + health, the DoD smoke) → `make verify-acl` (ACL ↔ OpenZaak) → `make verify-nrc` (OpenZaak → NRC delivery) → `make down` | container engine + egress (base images, nuget, `selectielijst.openzaak.nl`) | diff --git a/docs/runbooks/kubernetes-talos.md b/docs/runbooks/kubernetes-talos.md index c4c1f54..52271eb 100644 --- a/docs/runbooks/kubernetes-talos.md +++ b/docs/runbooks/kubernetes-talos.md @@ -322,6 +322,7 @@ The PVCs carry `helm.sh/resource-policy: keep`, so `make k8s-down` leaves the da ```bash make k8s-lint # render + schema-check the chart, no cluster needed +make k8s-drift # fail if compose and the chart describe different stacks make k8s-portals # forward the portals + Keycloak to localhost (browser access) make k8s-images K8S_REGISTRY=... # after changing a service or a portal make k8s-up TALOS_HOST=... K8S_REGISTRY=... @@ -366,5 +367,7 @@ immutable, so `helm upgrade` is rejected with `cannot patch "…" with kind Job` `K8S_SET='--set workloads.tempo.enabled=true --set workloads.prometheus.enabled=true --set workloads.grafana.enabled=true'`. The .NET services still export OTLP; the exporter fails harmlessly when Tempo is absent. - **The verify/e2e lanes.** `make verify*` and the Playwright e2e drive compose, not the - chart. The Kubernetes path is verified with §5's smoke test. + chart. The Kubernetes path is verified with §5's smoke test. CI's `k8s` job runs the two + clusterless checks (`k8s-lint`, `k8s-drift`) on every PR — a values typo or a compose + image bump that skipped the chart fails there, but nothing deploys the chart in CI. - **Ingress, TLS, and resource requests.** See the ponytail ceiling in ADR-0033.