#!/bin/sh # Рендер всех kustomization'ов, относящихся к одному контуру. # # render-contour.sh <контур> <каталог-результата> # # Используется из Dockerfile, но работает и локально — нужен только kustomize. set -eu contour="${1:?не задан контур}" out="${2:?не задан каталог результата}" if [ ! -d "clusters/${contour}" ]; then echo "Неизвестный контур: ${contour}" >&2 echo "Доступные:" >&2 ls clusters | sed 's/^/ - /' >&2 exit 1 fi mkdir -p "$out" build() { dir="$1" # Имя файла повторяет путь: clusters/aero/apps -> clusters.aero.apps.yaml name=$(echo "$dir" | tr '/' '.') echo " build ${dir}" # --load-restrictor LoadRestrictionsNone: слои ссылаются на apps/ и # infrastructure/ через ../../.., то есть выходят за корень kustomization. kustomize build --load-restrictor LoadRestrictionsNone "$dir" > "${out}/${name}.yaml" } # Каталоги контура: сам clusters/ и все его слои (controllers, configs, # apps, infrastructure — набор у контуров разный, поэтому ищем, а не перечисляем). # flux-system исключён: gotk-components.yaml генерирует `flux bootstrap`, # он и так лежит в репозитории готовым. echo "Контур ${contour}: слои Flux" find "clusters/${contour}" -name kustomization.yaml -not -path '*/flux-system/*' \ | sed 's#/kustomization.yaml$##' | sort > /tmp/layers.txt while read -r dir; do build "$dir" done < /tmp/layers.txt # Оверлеи приложений и инфраструктуры. Через слои они уже отрендерились, но # отдельные файлы дают поресурсный diff и ловят оверлей, который в слои пока # не подключён, — такой ломался бы уже при подключении. for root in apps infrastructure; do [ -d "$root" ] || continue echo "Контур ${contour}: оверлеи ${root}/*/${contour}" for dir in "$root"/*/"$contour"; do [ -f "${dir}/kustomization.yaml" ] || continue build "$dir" done done # Пустой результат почти наверняка означает опечатку в имени контура — # лучше упасть на сборке, чем отдать пустой образ. if [ -z "$(ls -A "$out")" ]; then echo "Для контура ${contour} не собрано ни одного манифеста" >&2 exit 1 fi echo "Готово: $(ls -1 "$out" | wc -l) файлов в ${out}"