Fix stuck-pending pipeline: hardcode per-arch labels instead of unresolved ${ARCH} (oleks/ci-scripts#14, #15)
ci/woodpecker/cron/drift Pipeline failed
ci/woodpecker/tag/build-arm64 Pipeline was successful
ci/woodpecker/tag/build-amd64 Pipeline failed
ci/woodpecker/tag/manifest Pipeline was canceled

This commit is contained in:
2026-07-05 16:59:26 +03:00
parent 1fb1cfa3b5
commit 6bd25f6192
5 changed files with 75 additions and 56 deletions
+36
View File
@@ -0,0 +1,36 @@
# Hand-authored (not generated) for oleks/ci-scripts#14, #15.
#
# Deviation from the shared generator's "matrix" kind (which emits one
# build.yaml with `matrix: {ARCH: [...]}` + `labels: {arch: ${ARCH}}`): a
# Woodpecker scheduler bug/regression on this cluster's agent version left
# that unresolved-at-label-matching-time `${ARCH}` literal never matching
# any agent, so the pipeline sat pending forever with zero dispatch
# (diagnosed via cluster:ci-agent). Splitting into one file per arch with a
# hardcoded literal label sidesteps the whole class of bug for this new
# self-build pipeline. The shared generator's matrix kind still needs an
# audit across the ~15 repos that use it (see oleks/ci-scripts#12/#13 CI
# registration + drift-detection work) — not fixed here, flagged on #14.
when:
- event: tag
ref: "refs/tags/v*"
labels:
arch: amd64
steps:
- name: build-and-push
image: git.oleks.space/oleks/nix-ci:latest
environment:
REGISTRY_TOKEN:
from_secret: registry_token
BUILDKIT_ADDR: "tcp://buildkit-amd64.infra.svc.cluster.local:1234"
PUBLISH: "1"
commands:
- echo "▸ arch=$(uname -m)"
- ci/local.sh --arch amd64
backend_options:
kubernetes:
labels:
commit-tag: "${CI_COMMIT_TAG}"
pipeline-number: "${CI_PIPELINE_NUMBER}"
build-arch: amd64
+27
View File
@@ -0,0 +1,27 @@
# Hand-authored (not generated) for oleks/ci-scripts#14, #15. See
# build-amd64.yaml for why this is split per-arch instead of using the
# shared generator's matrix kind (unresolved `${ARCH}` label bug).
when:
- event: tag
ref: "refs/tags/v*"
labels:
arch: arm64
steps:
- name: build-and-push
image: git.oleks.space/oleks/nix-ci:latest
environment:
REGISTRY_TOKEN:
from_secret: registry_token
BUILDKIT_ADDR: "tcp://buildkit-arm64.infra.svc.cluster.local:1234"
PUBLISH: "1"
commands:
- echo "▸ arch=$(uname -m)"
- ci/local.sh --arch arm64
backend_options:
kubernetes:
labels:
commit-tag: "${CI_COMMIT_TAG}"
pipeline-number: "${CI_PIPELINE_NUMBER}"
build-arch: arm64
-38
View File
@@ -1,38 +0,0 @@
# GENERATED by oleks/ci-scripts — do not hand-edit.
# Source manifest: manifests/ci-fleet-publish.yaml
# Regenerate: python3 generator/render.py manifests/ci-fleet-publish.yaml --out <repo>/.woodpecker
matrix:
ARCH:
- amd64
- arm64
when:
- event: tag
ref: "refs/tags/v*"
labels:
arch: ${ARCH}
# Thin wrapper (cluster #196, emmett#44): CI runs the SAME ci/local.sh a
# developer runs, so CI and local can't drift. CI-specific bits are env
# overrides only: BUILDKIT_ADDR -> the in-cluster NATIVE per-arch buildkit
# (no QEMU), PUBLISH=1 -> actually push. Output is unchanged: a per-arch
# :<version>-<arch> image, later merged into :<version>+:latest by manifest.yaml.
steps:
- name: build-and-push
image: git.oleks.space/oleks/nix-ci:latest
environment:
REGISTRY_TOKEN:
from_secret: registry_token
BUILDKIT_ADDR: "tcp://buildkit-${ARCH}.infra.svc.cluster.local:1234"
PUBLISH: "1"
commands:
- echo "▸ arch=$(uname -m)"
- ci/local.sh --arch "${ARCH}"
backend_options:
kubernetes:
labels:
commit-tag: "${CI_COMMIT_TAG}"
pipeline-number: "${CI_PIPELINE_NUMBER}"
build-arch: "${ARCH}"
+12 -12
View File
@@ -1,21 +1,21 @@
# GENERATED by oleks/ci-scripts — do not hand-edit.
# Source manifest: manifests/ci-fleet-publish.yaml
# Regenerate: python3 generator/render.py manifests/ci-fleet-publish.yaml --out <repo>/.woodpecker
# Hand-authored (not generated) for oleks/ci-scripts#14, #15 — see
# build-amd64.yaml for why the arch builds are split per-file instead of a
# single generated matrix build.yaml.
when:
- event: tag
ref: "refs/tags/v*"
depends_on:
- build
- build-amd64
- build-arm64
# oleks/ci-scripts#9: run even if a per-arch matrix leg failed. Without
# `runs_on`, Woodpecker skips a dependent workflow outright once any leg of
# `build` fails, so a lone arm64 success would silently produce no image at
# all. `ci/local.sh --manifest` itself must probe the registry for which
# per-arch tags actually landed (not assume a fixed arch list, and not rely
# on step/pipeline success status) and build the manifest from whatever
# exists — a partial manifest beats none.
# oleks/ci-scripts#9: run even if a per-arch build failed. Without
# `runs_on`, Woodpecker skips a dependent workflow outright once any
# dependency fails, so a lone arm64 success would silently produce no
# image at all. `ci/local.sh --manifest` itself must probe the registry
# for which per-arch tags actually landed (not assume a fixed arch list,
# and not rely on step/pipeline success status) and build the manifest
# from whatever exists — a partial manifest beats none.
runs_on:
- success
- failure
-6
View File
@@ -1,6 +0,0 @@
repo: ci-fleet-publish
kind: matrix
image: git.oleks.space/oleks/nix-ci
script: ci/local.sh
arches: [amd64, arm64]
buildkit_prefix: buildkit