diff --git a/.gitea/workflows/cd.yml b/.gitea/workflows/cd.yml index b0ec31d..b73d5cc 100644 --- a/.gitea/workflows/cd.yml +++ b/.gitea/workflows/cd.yml @@ -67,16 +67,38 @@ jobs: - name: Build and push to local registry run: | + set -e + # infra#241: buildctl, NOT buildah. Rootless buildah in gitea-runner's + # hardened securityContext cannot remap the UID/GID range + # newuidmap/newgidmap need on a fresh base-image pull, and the pod has + # no OCI runtime at all. buildctl talks to the host's buildkitd over a + # socket, so the privileged extraction happens on the host. Same + # pattern as mathias/infra's segment-embedder.yml. + # + # Highest-leverage place to fix it: every repo generated from this + # template inherits this CI, so a buildah-based template manufactures + # new instances of the bug. Warm layers mask it, so a generated repo + # builds fine until its first genuinely cold base-image pull. + BUILDKIT_HOST="unix:///run/buildkit/buildkitd.sock" REGISTRY="localhost:5000" REF="${REGISTRY}/${{ env.IMAGE }}:${{ steps.meta.outputs.sha-tag }}" - buildah build \ - --label "org.opencontainers.image.revision=${{ github.sha }}" \ - -t ${REF} \ - -t ${REGISTRY}/${{ env.IMAGE }}:latest \ - . - buildah push --tls-verify=false ${REF} - buildah push --tls-verify=false ${REGISTRY}/${{ env.IMAGE }}:latest - echo "✓ Image pushed to ${REF}" + TAR_FILE="$(mktemp)" + trap 'rm -f "$TAR_FILE"' EXIT + + buildctl --addr "$BUILDKIT_HOST" build \ + --frontend dockerfile.v0 \ + --local context=. \ + --local dockerfile=. \ + --opt label:org.opencontainers.image.revision="${{ github.sha }}" \ + --output type=oci,dest="$TAR_FILE" + + # buildctl has no registry-push equivalent to `buildah push`; skopeo + # copies the OCI archive up. Twice, to keep the :sha and :latest tags. + skopeo copy --dest-tls-verify=false \ + oci-archive:"$TAR_FILE" docker://${REF} + skopeo copy --dest-tls-verify=false \ + oci-archive:"$TAR_FILE" docker://${REGISTRY}/${{ env.IMAGE }}:latest + echo "✓ Image pushed to ${REF} and :latest" deploy: name: Deploy via GitOps