This repository has been archived on 2026-11-08. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
platform-ci/source_tools/scripts/manifest-verify.sh
forge-recoveryandClaude Sonnet 5.5 84c6f19438
KofTwentyTwo/ci-policy: ci / fork-guard (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / go-0 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / go-nix-1 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / gradle-2 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / gradle-3 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / java-docker-4 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / java-maven-5 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / manifests-6 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / nix-7 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / node-8 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / python-9 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / rust-10 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / rust-11 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / rust-12 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / source-config-13 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / source-config-14 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / image-build-0 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / image-build-1 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / image-build-2 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / image-build-3 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / image-build-4 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / image-build-5 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / image-build-6 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / image-build-7 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / not-enrolled (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / content-validate-0 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / standards-0 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / node-matrix-0 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / source-config-15 (pull_request) Blocked by required conditions
KofTwentyTwo/ci-policy: Shared source and config CI / verify (pull_request) Blocked by required conditions
KofTwentyTwo/ci-policy: Shared source and config CI / secrets (pull_request) Blocked by required conditions
KofTwentyTwo/ci-policy: Shared source and config CI / gate (pull_request) Waiting for needed jobs
KofTwentyTwo/ci-policy: ci / ci-result (pull_request) Waiting for needed jobs
KofTwentyTwo/ci-policy: native / fork-deny (pull_request) Skipped
KofTwentyTwo/ci-policy: native / build-macos-0 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / build-macos-1 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / build-macos-2 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / build-macos-3 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / build-windows-4 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / build-windows-5 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / build-windows-6 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / build-windows-7 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / dotnet-8 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / dotnet-9 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / dotnet-10 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / dotnet-11 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / swift-12 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / swift-13 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / swift-14 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / swift-15 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / swift-16 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / swift-17 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / swift-18 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / swift-19 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / native-result (pull_request) Canceled after 4s
feat(ci): advance shared pipeline capabilities
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-05 05:03:47 +00:00

70 lines
3.2 KiB
Bash

#!/usr/bin/env bash
# Render declared Kustomize deployment roots with `kubectl kustomize` and fail on any render error.
# Offline by construction: no kubectl apply, no kubeconfig, no service account, no cluster call.
#
# env: INPUT_ROOTS comma or whitespace separated workspace-relative directories (required)
# INPUT_ENABLE_HELM true|false (default false); true needs the pinned helm on PATH
# MANIFEST_OUT output directory (default ci-manifests)
# KUBECTL, HELM binaries (default from PATH; tests substitute fakes)
set -u
here=$(cd "$(dirname "$0")" && pwd)
# shellcheck disable=SC1091
. "$here/../tools.env"
roots_in=${INPUT_ROOTS:-}
helm=${INPUT_ENABLE_HELM:-false}
out=${MANIFEST_OUT:-ci-manifests}
kubectl_bin=${KUBECTL:-kubectl}
fail() { echo "manifest-verify: $*" >&2; exit 1; }
[ "$helm" = true ] || [ "$helm" = false ] || fail "enable-helm must be true or false"
[ -L "$out" ] && fail "$out is a symlink"
command -v "$kubectl_bin" >/dev/null 2>&1 || fail "kubectl is not installed"
helm_args=()
if [ "$helm" = true ]; then
helm_bin=$(command -v "${HELM:-helm}") || fail "enable-helm is declared but helm is not installed"
have=$("$helm_bin" version --template '{{.Version}}' 2>/dev/null) || fail "cannot read helm version"
[ "$have" = "v${HELM_VERSION}" ] || fail "helm $have is not the pinned v${HELM_VERSION}"
helm_args=(--enable-helm --helm-command "$helm_bin")
fi
workspace=$(pwd -P)
roots=()
set -f
for raw in ${roots_in//,/ }; do
root=${raw#./}; root=${root%/}
[[ $root =~ ^[A-Za-z0-9._/-]+$ ]] || fail "unsafe root '$raw'"
[[ $root =~ ^/ || $root =~ (^|/)\.\.(/|$) ]] && fail "root '$raw' must be a relative path inside the workspace"
roots+=("$root")
done
set +f
[ "${#roots[@]}" -gt 0 ] || fail "no manifest roots declared"
rm -rf -- "$out"
mkdir -p "$out"
failed=0
count=0
for root in $(printf '%s\n' "${roots[@]}" | sort -u); do
dir=$(cd -- "$root" 2>/dev/null && pwd -P) || { echo "manifest-verify: $root: not a directory" >&2; failed=1; continue; }
case "$dir" in "$workspace"/*) ;; *) echo "manifest-verify: $root: resolves outside the workspace" >&2; failed=1; continue ;; esac
file=""
for name in kustomization.yaml kustomization.yml Kustomization; do
[ -f "$dir/$name" ] && { file="$dir/$name"; break; }
done
[ -n "$file" ] || { echo "manifest-verify: $root: no kustomization file" >&2; failed=1; continue; }
if grep -Eq '^kind:[[:space:]]*Component[[:space:]]*$' "$file"; then
echo "manifest-verify: $root: is a Component, not a deployment root" >&2; failed=1; continue
fi
target="$out/${root//\//__}.yaml"
# No credentials reach the render: kubectl kustomize only reads the filesystem.
if ! env -u KUBECONFIG -u KUBERNETES_SERVICE_HOST "$kubectl_bin" kustomize "$dir" ${helm_args[@]+"${helm_args[@]}"} > "$target"; then
echo "manifest-verify: $root: kustomize render failed" >&2; failed=1; continue
fi
grep -Eq '^kind:' "$target" || { echo "manifest-verify: $root: render produced no resources" >&2; failed=1; continue; }
count=$((count + 1))
echo "manifest-verify: $root: rendered $(grep -c '^kind:' "$target") resources"
done
echo "manifest-verify: $count of ${#roots[@]} roots rendered"
exit "$failed"