From add5428e2fa127644e2fada14342dc18aa2743f8 Mon Sep 17 00:00:00 2001 From: mathias Date: Tue, 25 Aug 2026 08:52:26 +0000 Subject: [PATCH] ci(cd): call the shared build-image script instead of inlining it (infra#309) A template is the highest-leverage copy of anything. This one carried its own inline build step, so every generated repo was born with a private fork of the build logic -- which is how rootless buildah reached a dozen repos before infra#241, and why the fix then had to be rediscovered here weeks after the app repos were done. The step now calls .gitea/build-image.sh, a byte-identical copy of mathias/infra's ci-templates/build-image.sh. Generated repos inherit the script and the call; adding the new repo to infra's adopters.txt puts it under the drift gate. Invoked as `bash .gitea/build-image.sh` rather than relying on the exec bit: files written through the Gitea API land 0644, and a template whose CI depends on a file mode is a trap for every repo generated from it. --- .gitea/workflows/cd.yml | 56 ++++++++++++++++------------------------- 1 file changed, 22 insertions(+), 34 deletions(-) diff --git a/.gitea/workflows/cd.yml b/.gitea/workflows/cd.yml index 0c3cdae..f92e437 100644 --- a/.gitea/workflows/cd.yml +++ b/.gitea/workflows/cd.yml @@ -38,7 +38,7 @@ jobs: # __PROJECT_NAME__/__MODULE_PATH__ are placeholders substituted only when # a repo is generated from this template -- on the raw template repo # itself they're still literal, and `IMAGE: __PROJECT_NAME__` contains - # uppercase letters, which buildah/Docker rejects outright ("repository + # uppercase letters, which the registry rejects outright ("repository # name must be lowercase"). Build/deploy can never succeed here; skip # them on this repo so its own CI reads green on what it can actually # validate (the check job). @@ -54,41 +54,29 @@ jobs: SHA=$(git rev-parse --short HEAD) echo "sha-tag=${SHA}" >> "$GITHUB_OUTPUT" - # infra#241: buildctl, NOT buildah. Rootless buildah in gitea-runner's - # hardened securityContext (capabilities: drop [ALL], - # allowPrivilegeEscalation: false) cannot remap the UID/GID range - # newuidmap/newgidmap need on a fresh base-image pull, and it has no OCI - # runtime at all. buildctl talks to the host's buildkitd over a socket, so - # the privileged extraction happens in buildkitd on the host and never in - # this pod. Same pattern as mathias/infra's segment-embedder.yml. + # infra#309: the implementation lives in .gitea/build-image.sh, a + # byte-identical copy of mathias/infra's ci-templates/build-image.sh. + # Do not edit it here -- edit the canonical file, run `task ci:sync`, + # and infra's drift gate will name any repo still carrying an old copy. # - # This matters MORE in a template than anywhere else: every repo generated - # from here inherits its CI, so a buildah-based template manufactures new - # instances of a bug that has already cost this estate several red builds. + # This matters more in a template than anywhere else: every repo + # generated from here inherits its CI, so a template that carries the + # build LOGIC manufactures a new copy of every bug in it. That is + # precisely how rootless buildah (infra#241) reached a dozen repos, and + # why the fix then had to be rediscovered here weeks later. A template + # that carries a CALL manufactures nothing. + # + # NEW REPOS: add yourself to mathias/infra's ci-templates/adopters.txt so + # the gate keeps this copy current. Until you do, the copy is unmanaged + # and will silently fall behind. + # + # `bash