Localize external-secrets container (native container.py build) (#367)
Knocks out the weekly "pick one non-local container and make it local" task by moving **external-secrets** off `ghcr.io` onto a locally-built image, under our own supply-chain control. Doubles as its overdue service review. ## What changed - **`containers/external-secrets/container.py`** (new) — native Dagger build (the Dockerfile→container.py migration pattern). Clones the forge mirror at `v2.2.0` and builds the single `all_providers` static Go binary, faithful to upstream's `make build` (CGO off, no version ldflags upstream). ENTRYPOINT is `/bin/external-secrets` so the controller/webhook/cert-controller Deployments select their role via `args:` exactly as before. - **`argocd/manifests/external-secrets/kustomization.yaml`** — image swapped to `registry.ops.eblu.me/blumeops/external-secrets:v2.2.0-2985007`. **Like-for-like (v2.2.0)**, not an upgrade. - **`service-versions.yaml`** — marked reviewed (2026-06-04), noted the local build. ## Build Built on the indri forge runner (run #579, ~4 min) → pushed to Zot. Image config verified: `Entrypoint=/bin/external-secrets`, `User=65534`, version label `v2.2.0`. ## Deployed from branch & verified - All 3 pods (controller / webhook / cert-controller) rolled to the local image, `1/1 Running` - Controller + webhook logs clean (no errors; webhook serving TLS) - **End-to-end secret fetch proven:** force-synced `monitoring/grafana-admin` → `refreshTime` advanced to now, `Ready=True` - All 10 ExternalSecrets cluster-wide remain `SecretSynced=True` — no collateral damage - App `Healthy` ## Post-merge `external-secrets` currently points at this branch (so `apps` reads OutOfSync — expected). After merge: ``` argocd app set external-secrets --revision main && argocd app sync external-secrets ``` 🤖 Generated with [Claude Code](https://claude.com/claude-code) Reviewed-on: #367
This commit is contained in:
parent
bb55fa9566
commit
0e70a1b524
4 changed files with 59 additions and 3 deletions
51
containers/external-secrets/container.py
Normal file
51
containers/external-secrets/container.py
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
"""External Secrets Operator — native Dagger build.
|
||||
|
||||
Two-stage build: Go binary (all providers), Alpine runtime.
|
||||
Source cloned from forge mirror.
|
||||
|
||||
A single binary serves as the controller, webhook, and cert-controller; the
|
||||
Deployments select the role via a subcommand passed in `args:`, so the image
|
||||
ENTRYPOINT must be the binary itself (matching upstream's distroless image).
|
||||
"""
|
||||
|
||||
import dagger
|
||||
|
||||
from blumeops.containers import (
|
||||
alpine_runtime,
|
||||
clone_from_forge,
|
||||
go_build,
|
||||
oci_labels,
|
||||
)
|
||||
|
||||
VERSION = "v2.2.0"
|
||||
|
||||
|
||||
async def build(src: dagger.Directory) -> dagger.Container:
|
||||
source = clone_from_forge("external-secrets", VERSION)
|
||||
|
||||
# Upstream `make build` compiles every secret provider into a single
|
||||
# static binary (`-tags all_providers`, CGO disabled). Mirror that so the
|
||||
# local image is functionally identical to ghcr.io/.../external-secrets.
|
||||
backend = go_build(
|
||||
source,
|
||||
"/external-secrets",
|
||||
tags="all_providers",
|
||||
)
|
||||
|
||||
runtime = alpine_runtime(
|
||||
extra_apk=["ca-certificates"],
|
||||
create_user=False,
|
||||
)
|
||||
runtime = oci_labels(
|
||||
runtime,
|
||||
title="External Secrets Operator",
|
||||
description=(
|
||||
"Kubernetes operator that integrates external secret management systems"
|
||||
),
|
||||
version=VERSION,
|
||||
)
|
||||
return (
|
||||
runtime.with_file("/bin/external-secrets", backend.file("/external-secrets"))
|
||||
.with_user("65534")
|
||||
.with_entrypoint(["/bin/external-secrets"])
|
||||
)
|
||||
Loading…
Add table
Add a link
Reference in a new issue