62 lines
2.7 KiB
Bash
62 lines
2.7 KiB
Bash
#!/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}"
|