iac/hack/render-contour.sh

62 lines
2.7 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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/<contour> и все его слои (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}"