feat/fleet-cd-staging-deploy #310

Merged
johnride merged 8 commits from feat/fleet-cd-staging-deploy into master 2026-05-29 22:49:25 +00:00

8 Commits

Author SHA1 Message Date
03bc98cd38 Merge pull request 'refactor/openbao-instance' (#312) from refactor/openbao-instance into feat/fleet-cd-staging-deploy
All checks were successful
Run Check Script / check (pull_request) Successful in 2m23s
Reviewed-on: #312
2026-05-29 21:50:45 +00:00
7638611b9f refactor(openbao): share OpenbaoInstance across deploy + setup scores
All checks were successful
Run Check Script / check (pull_request) Successful in 2m21s
namespace/release/pod were duplicated as independent literals across
OpenbaoScore (hardcoded) and OpenbaoSetupScore (defaults) — pod was a
derived fact (`{release}-0`) stored as a literal that rots if release
changes, and namespace agreement was by coincidence. Introduce
OpenbaoInstance { namespace, release } with a derived pod(); both scores
take it. Only the shared identity moves; per-score knobs (host, tls,
kv_mount, policies, …) stay on their owner.
2026-05-29 17:32:26 -04:00
1f525cd5d1 feat(openbao): optional cert-manager ingress TLS
OpenbaoScore.tls_issuer: Some(issuer) adds the cert-manager
cluster-issuer annotation + tls block (edge TLS, listener stays plain);
None keeps plain HTTP. Option<String> not bool — cert-manager needs the
issuer name. Rendering extracted to values() and covered by tests.
2026-05-29 17:02:23 -04:00
d687b29f35 docs(fleet): manual staging deploy is interim; drop premature CD workflow
Full in-cluster CD is blocked on headless OpenBao auth (Zitadel machine
identity), so the clickable deploy-staging workflow + its runner would be
dead config. Drop it; document the manual operator deploy (same secure
OpenBao-config path) until the auth flow lands.
2026-05-29 16:07:01 -04:00
7f76c9e81f refactor(fleet): deploy binary is operator-only — load config, run one Score
All checks were successful
Run Check Script / check (pull_request) Successful in 2m32s
The binary carried a dev nats+operator+agent stack with user/pass flags
that no automated caller used (the e2e harness composes those Scores
from the lib directly). Cut it: main.rs is now load FleetDeploySecrets →
run one FleetOperatorScore. 265→118 lines. Matches ADR-023 (one Score
per component, compose upward).
2026-05-29 15:03:38 -04:00
8736efc29e feat(fleet): deploy by release tag, not a typed version
All checks were successful
Run Check Script / check (pull_request) Successful in 2m22s
The deploy workflow took a hand-typed chart version (a second source of
truth, typo-prone). Take a --from-tag instead and parse the version in
Rust via the existing version_from_tag — the tag is the single source of
truth and YAML never parses it. --operator-chart-version stays for the
laptop path.
2026-05-29 14:53:50 -04:00
96d78f8671 refactor(fleet): densify CD deploy comments — WHY-only, no narration 2026-05-29 12:40:45 -04:00
245d7dd9a5 feat(fleet): clickable CD deploy of the operator to staging
Adds the deploy half of fleet-operator CD: a manual workflow_dispatch
that installs a published operator chart version via harmony apply,
run from an in-cluster, permissionless runner.

- FleetDeploySecrets (#[config(secret)]) loaded via ConfigClient: the
  published-chart path is Zitadel-SSO-only by construction — operator
  credentials + deployer kubeconfig come from OpenBao, no user/pass
  field reachable. user/pass stays a dev-only rendered-chart flag.
- FleetOperatorScore::credentials() so the published-chart path applies
  the operator Secret (was a no-op).
- Deprecate SecretManager in favour of harmony_config::ConfigClient.
2026-05-29 12:38:59 -04:00