3.4 KiB
3.4 KiB
Centralized registry/host constants (oleks/ci-scripts#4)
Woodpecker has no cross-repo variable store and no include: mechanism, so
these constants can't be defined once and referenced by name inside raw YAML
pipelines. Two real mechanisms exist instead — use whichever fits the value:
- Woodpecker secret or org secret — for anything that's actually a credential, or that we want to be able to rotate without touching every repo's pipeline file. Prefer this whenever a value isn't public.
- Manifest field, interpolated by the oleks/ci-scripts generator
(
generator/render.py, oleks/ci-scripts#2) — for values that are public infrastructure addresses baked into rendered YAML. Put the value in the per-repo manifest once; the generator stamps it into every rendered file. This is the practical stand-in for a "constants file" Woodpecker can't nativelyinclude:.
There is no third option (a shared "constants.yaml" include:d by every
pipeline) — Woodpecker pipelines are standalone YAML with no include
directive, so the generator is the only place central substitution happens.
Inventory
| Constant | Value(s) | Where it's inlined today | Mechanism |
|---|---|---|---|
| Git server / netrc machine | git.oleks.space |
every clone: block |
manifest field git_host (rarely changes; secret would be overkill) |
| Gitea clone token | — | every clone: block, GITEA_CLONE_TOKEN env |
secret gitea_clone_token (org secret, already is one) |
| Registry push token | — | matrix/manifest build steps | secret registry_token (org secret) |
| Attic cache token | — | split (attic-closure) build steps | secret attic_token (org secret) |
| Build image | git.oleks.space/oleks/nix-ci:latest / :latest-arm64 |
every build step's image: |
manifest field image + arch suffix rule (generator appends -arm64 for arm64 legs) |
| BuildKit address | tcp://buildkit-${ARCH}.infra.svc.cluster.local:1234, tcp://buildkit-rootless-${ARCH}.infra.svc.cluster.local:1234 |
matrix-shape build/manifest steps | manifest field buildkit_prefix (buildkit or buildkit-rootless), arch interpolated by the generator |
| Resolver nameserver | 169.254.20.10 |
s390x cross-build pipelines (building/s390x, out of this worker's scope) | manifest field nameserver where the shape needs it; coordinate with fleet-worker (owns building/s390x + building/arm64) |
| Kubernetes node selector overrides | e.g. kubernetes.io/hostname: howard2404 (csi-s3, pinned to the only s390x/arm64-capable node) |
matrix-shape backend_options.kubernetes.nodeSelector |
manifest field node_selector (map, optional) |
Convention going forward
- If a value is secret-shaped (token, password, key) → it MUST be a Woodpecker secret, never a manifest field or literal in generated YAML.
- If a value is public infrastructure (hostname, image ref, in-cluster
service DNS name) that's the same across most repos → put it in the
per-repo manifest consumed by
generator/render.py(oleks/ci-scripts#2), not hand-typed into.woodpecker/*.yaml. - If a value is genuinely repo-specific (a one-off node pin, a nonstandard arch list) → it's still a manifest field, just not shared across repos. The manifest is the single place per-repo variance lives; the rendered YAML is never hand-edited (see the "GENERATED" header the generator stamps on every output file).