# Полная сборка манифестов IaC-репозитория для одного контура.
#
#   docker build --build-arg CONTOUR=aero -t iac:aero .
#   docker run --rm iac:aero list                  # что собралось
#   docker run --rm iac:aero cat clusters          # слои Flux одним потоком
#   docker run --rm -v "$PWD/out:/export" iac:aero export
#
# Контур — имя каталога в clusters/ (aero, brusnika-prod, dsinv, wb, ...).
# Тот же идентификатор служит именем overlay внутри apps/* и infrastructure/*,
# поэтому одного аргумента хватает на весь рендер.
#
# Сборка офлайновая: kustomize build разворачивает оверлеи и патчи, а
# HelmRelease остаётся Custom Resource'ом — чарты тянет Flux уже в кластере.
# Ни helm, ни доступ к OCI-реестру здесь не нужны. Исключение — валидация:
# схемы CRD kubeconform берёт из сети (отключается VALIDATE=0).

ARG KUSTOMIZE_VERSION=v5.4.3
ARG KUBECONFORM_VERSION=v0.6.7

FROM registry.k8s.io/kustomize/kustomize:${KUSTOMIZE_VERSION} AS kustomize
FROM ghcr.io/yannh/kubeconform:${KUBECONFORM_VERSION} AS kubeconform


FROM alpine:3.20 AS builder

# Контур обязателен по смыслу, но значение по умолчанию оставлено: сборка без
# --build-arg собирает aero, а не падает на пустой переменной.
ARG CONTOUR=aero
ARG VALIDATE=1
ARG KUBERNETES_VERSION=1.30.0

COPY --from=kustomize /app/kustomize /usr/local/bin/kustomize
COPY --from=kubeconform /kubeconform /usr/local/bin/kubeconform

WORKDIR /src

# Скрипт копируется отдельным слоем: правка манифестов не инвалидирует его,
# а правка скрипта не тянет за собой пересборку базовых слоёв.
COPY hack/render-contour.sh /usr/local/bin/render-contour
RUN chmod +x /usr/local/bin/render-contour

COPY . .

RUN render-contour "${CONTOUR}" /out

# Валидация отдельным слоем: смена версии Kubernetes не пересобирает рендер.
# --ignore-missing-schemas пропускает ресурсы, чьих схем нет в каталоге
# (часть CRD), но не заглушает ошибки в тех, что нашлись.
RUN if [ "${VALIDATE}" = "1" ]; then \
      kubeconform \
        -kubernetes-version "${KUBERNETES_VERSION}" \
        -strict \
        -ignore-missing-schemas \
        -schema-location default \
        -schema-location 'https://raw.githubusercontent.com/datreeio/CRDs-catalog/main/{{.Group}}/{{.ResourceKind}}_{{.ResourceAPIVersion}}.json' \
        -summary \
        /out/*.yaml ; \
    else \
      echo "VALIDATE=0 — проверка схемами пропущена" ; \
    fi


FROM alpine:3.20

ARG CONTOUR=aero
ENV CONTOUR=${CONTOUR}

LABEL org.opencontainers.image.title="iac-manifests" \
      org.opencontainers.image.description="Собранные манифесты контура ${CONTOUR}" \
      ru.iac.contour="${CONTOUR}"

COPY --from=builder /out /manifests
COPY hack/entrypoint.sh /usr/local/bin/entrypoint
RUN chmod +x /usr/local/bin/entrypoint

ENTRYPOINT ["/usr/local/bin/entrypoint"]
CMD ["list"]
