Skip to content

CI substrate parity: chainsaw cluster = live recipe (Cilium/GW-API/Rollouts), un-skip 9 suites - #7

Closed
konih wants to merge 7 commits into
mainfrom
lane/ci-substrate-parity
Closed

CI substrate parity: chainsaw cluster = live recipe (Cilium/GW-API/Rollouts), un-skip 9 suites#7
konih wants to merge 7 commits into
mainfrom
lane/ci-substrate-parity

Conversation

@konih

@konih konih commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

CI harness PR only — coordinator merges via ref-push; will be closed after CI is green.

What

  • chainsaw CI cluster is now built from hack/cluster/kind-up.sh (the live kaddy-dev recipe: Cilium + Gateway API CRDs + LB-IPAM + cert-manager + kaddy-local-ca, versions.env pins). No hack/cluster changes were needed — the scripts' podman/rootful/loopback guards no-op on the docker Linux runner.
  • Installs Argo Rollouts + Gateway API plugin (pinned v0.16.0, arch suffix rewritten arm64→amd64 at apply time; live manifest untouched), the E4 edge + clubhouse + mulligan workloads, and the default-deny network baseline.
  • Un-skipped: gateway/clubhouse-ready, gateway/root-path-200, security/{default-deny,gateway-to-app,unauthorized-ingress-fails}, rollouts/{canary-weights,canary-rollback,bluegreen-blocks-bad-promotion} (serialized — shared mulligan objects), tls/certificate-renewal.
  • Still skipped (annotations updated where stale): crossplane (no Crossplane engine in CI), security/unsigned-image-denied (policy is Audit pending cosign), monitoring/loki-ruler-alert (ruler disabled by design), identity/portal/caddy-mvp stubs (epics unbuilt).
  • Riders: TEST-9 (monitoring.yaml on push to main), SEC-5 (all action refs SHA-pinned, Renovate-compatible).

Local gates: task verify ✅ · task test:meta:e1e ✅ · actionlint ✅ · shellcheck hack/cluster ✅ · yaml parse ✅

konih added 7 commits July 16, 2026 12:18
…uster (Cilium+GW-API+local-CA), un-skip 9 suites (TEST-9, SEC-5)

- chainsaw.yaml now creates the kind cluster via hack/cluster/kind-up.sh (the
  LIVE substrate recipe: disableDefaultCNI + kubeProxyMode:none, Cilium
  1.18.11 + Gateway API v1.2.1 CRDs + LB-IPAM, cert-manager v1.18.2 +
  kaddy-local-ca — all versions.env pins). helm/kind-action removed.
- Installs Argo Rollouts (vendored v1.9.0) + the Gateway API trafficRouting
  plugin: the pinned v0.16.0 asset arch-rewritten linux-arm64→linux-amd64 at
  apply time (runner arch); the live deploy/rollouts/config.yaml stays
  byte-identical.
- Applies deploy/gateway/ + clubhouse + clubhouse-tls Certificate +
  deploy/workloads/mulligan/ + the default-deny network baseline
  (deploy/policies/network/{gateway,monitoring,argocd}).
- Un-skips: gateway (2), security netpol (3), rollouts (3, serialized —
  shared mulligan objects), tls/certificate-renewal. Honest-skip annotations
  updated (crossplane now blocked ONLY on the Crossplane engine).
- TEST-9: monitoring.yaml (promtool) runs on push to main too.
- SEC-5: ALL workflow action refs pinned to full commit SHAs with version
  comments (Renovate-compatible).
… — upstream manifest is namespace-less (Argo CD destination supplies it live)
…lphabetical apply order) + multi-arch showcase image

- chainsaw.yaml: kubectl apply -f <dir> walks files alphabetically, so
  namespace.yaml landed AFTER the namespaced resources -> NotFound. Apply the
  namespace manifest explicitly first (gateway + mulligan).
- showcase-image.yaml: published images (main + v*) build linux/amd64 AND
  linux/arm64 via QEMU — the live kind node is Apple-silicon arm64 and the
  amd64-only image failed with 'no match for platform in manifest'. PR builds
  stay amd64-only (no push). cosign continues to sign the manifest-list
  digest, covering both arches.
…scovery only loads chainsaw-test.yaml files

Latent gap found while un-skipping: 'chainsaw test tests/chainsaw' discovers
only files literally named chainsaw-test.yaml, so every per-scenario suite
(gateway/security/monitoring/rollouts/tls/crossplane) was silently never
executed — in CI or anywhere — even when its skip flag was off. The workflow
now runs each Test-bearing file explicitly (same invocation the suites'
live-verification annotations document), sequentially. Taskfile follow-up
wanted: fold per-scenario discovery into test:chainsaw.
…ions with jmespath in never-executed suites

loki-ready, stack-ready and cert-manager-ready asserted a bare
status.conditions ARRAY with one element; chainsaw (kyverno-json) compares
arrays length-strictly, so any object carrying more than one condition fails
with 'lengths of slices don't match' — proven by the first real CI execution
(the pod WAS Ready). These tests had never run anywhere (the discovery gap
fixed in the previous commit), so the broken idiom was never caught. Fixed to
the jmespath filter idiom the repo already uses (root-path-200, labeling):
(conditions[?type=='X'].status | [0]): "True" — identical semantics to the
tests' stated intent, no assertion weakened. certificate-renewal and
clusterissuer-staging keep the bare array: their objects carry exactly one
condition (verified live).
…30s default too tight for green pod availability on the loaded CI node
…tor assert — unquoted dashes parse as JMESPath arithmetic, expression could never be true
@konih

konih commented Jul 16, 2026

Copy link
Copy Markdown
Contributor Author

Merged to main via ref-push (local-merge workflow); PR was the CI harness — all 5 checks green.

@konih konih closed this Jul 16, 2026
@konih
konih deleted the lane/ci-substrate-parity branch July 16, 2026 11:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant