fix(ci): kustomize-build validated nothing and reported green
Blocking review point on #460, and it was exactly right. `find -printf` is a GNU findutils extension. ci-k8s is alpine-based and never installs findutils, so find is BusyBox — confirmed by running it in the image: find: unrecognized: -printf BusyBox v1.37.0 Because the result fed a command substitution used as a word list, the failure was SILENT: empty output, zero loop iterations, fail stayed 0, and the step exited green having run kubectl kustomize on nothing at all. The proof is in this PR's own pipeline run (3158). The step is recorded as "success", and its log contains ZERO `ok` lines — sixty were expected. So the gate I added to catch silent no-ops was itself a silent no-op, and CI reported it as passing. Worth stating why neither of my checks caught it: I dry-ran the loop on my workstation, which has GNU find, and the CI run cannot distinguish a zero-iteration loop from a working one when every kustomization already builds — both exit 0. The review's suggested test (paste the per-directory log lines, not the exit code) is the only one that separates them. Fixed by replacing -printf with a portable pipe through sed. Verified in the actual image, with a synthetic tree, that the loop now iterates. Also added a discovery assertion to both find-based steps: fail if the count is implausible (kustomize-build expects >=50 of ~60; shellcheck expects >=1) rather than proceeding with an empty list. That is the general fix — without it, ANY future breakage of discovery degrades back into a green no-op instead of a failure, which is the trap this whole commit is about rather than the -printf detail specifically. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -32,8 +32,29 @@ steps:
|
||||
commands:
|
||||
- |
|
||||
set -eu
|
||||
# NOT `find -printf '%h\n'`: that is a GNU findutils extension and this
|
||||
# image ships BusyBox find (v1.37.0), which rejects it outright with
|
||||
# "find: unrecognized: -printf". Because the result feeds a command
|
||||
# substitution used as a word list, the failure is SILENT — empty output,
|
||||
# zero loop iterations, fail=0, step exits green having validated
|
||||
# nothing. That is exactly what this pipeline shipped in its first
|
||||
# revision, and CI reported it as passing.
|
||||
dirs=$(find kubernetes -name kustomization.yaml | sed 's|/kustomization.yaml$||' | sort)
|
||||
|
||||
# Assert the discovery actually found something. Without this, any future
|
||||
# breakage of the find/sed above degrades back into a green no-op rather
|
||||
# than a failure — the specific trap that made the first revision of this
|
||||
# step useless while looking healthy.
|
||||
count=$(printf '%s\n' "$dirs" | grep -c . || true)
|
||||
if [ "$count" -lt 50 ]; then
|
||||
echo "FAIL: found only $count kustomizations; expected ~60."
|
||||
echo " Discovery is broken — refusing to report success."
|
||||
exit 1
|
||||
fi
|
||||
echo "discovered $count kustomizations"
|
||||
|
||||
fail=0
|
||||
for d in $(find kubernetes -name kustomization.yaml -printf '%h\n' | sort); do
|
||||
for d in $dirs; do
|
||||
if kubectl kustomize "$d" >/dev/null 2>/tmp/err; then
|
||||
echo "ok $d"
|
||||
else
|
||||
@@ -81,8 +102,18 @@ steps:
|
||||
commands:
|
||||
- |
|
||||
set -eu
|
||||
files=$(find kubernetes -name '*.sh' | sort)
|
||||
# Same no-op guard as kustomize-build: if discovery ever returns nothing,
|
||||
# fail loudly instead of passing having checked no files.
|
||||
count=$(printf '%s\n' "$files" | grep -c . || true)
|
||||
if [ "$count" -lt 1 ]; then
|
||||
echo "FAIL: no shell scripts found under kubernetes/ — discovery is broken."
|
||||
exit 1
|
||||
fi
|
||||
echo "discovered $count shell scripts"
|
||||
|
||||
fail=0
|
||||
for f in $(find kubernetes -name '*.sh' | sort); do
|
||||
for f in $files; do
|
||||
if shellcheck -S error "$f"; then
|
||||
echo "ok $f"
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user