From 05f56c5e00b6537c0e8fe5699f83f7ec6c0ebe44 Mon Sep 17 00:00:00 2001 From: Repinoid Date: Tue, 22 Sep 2026 08:31:22 +0300 Subject: [PATCH] =?UTF-8?q?fix(build):=20=D0=B3=D0=B5=D0=B9=D1=82=20=D0=B4?= =?UTF-8?q?=D1=80=D0=B5=D0=B9=D1=84=D0=B0=20=D1=81=D0=B3=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D1=80=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D0=BA=D0=BE=D0=B4=D0=B0=20+=20=D0=B7=D0=B0=D0=BF?= =?UTF-8?q?=D1=80=D0=B5=D1=82=20=D0=BF=D1=80=D1=8F=D0=BC=D0=BE=D0=B9=20?= =?UTF-8?q?=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B8=20=D0=B8=D0=B7=20provider/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TOOLS/scripts/build-provider.sh | 12 ++++++ TOOLS/scripts/check_generated_drift.sh | 58 ++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100755 TOOLS/scripts/check_generated_drift.sh diff --git a/TOOLS/scripts/build-provider.sh b/TOOLS/scripts/build-provider.sh index 41a714e..d35870c 100755 --- a/TOOLS/scripts/build-provider.sh +++ b/TOOLS/scripts/build-provider.sh @@ -33,6 +33,18 @@ PROVIDER_DIR="${PROVIDER_DIR:-${ROOT_DIR}/provider}" BUILD_DIR="${BUILD_DIR:-${ROOT_DIR}/artifacts/provider_build}" GPG_KEY_FILE="${GPG_KEY_FILE:-${ROOT_DIR}/secrets/private_key.asc}" +# Гейт дрейфа: прямая сборка из общего provider/ запрещена. +# В provider/internal/resources_gen может лежать устаревшая копия (каталог +# в .gitignore, дрейф не виден в git). Канонический путь — через +# 03_build_and_upload_provider.sh: он собирает из временной копии со +# свежесгенерированным кодом. Детект дрейфа: TOOLS/scripts/check_generated_drift.sh. +if [[ "$PROVIDER_DIR" == "${ROOT_DIR}/provider" ]]; then + echo "Error: refused to build directly from the shared provider dir." >&2 + echo " It may contain a stale generated copy of another stand." >&2 + echo " Use: TOOLS/scripts/03_build_and_upload_provider.sh --profile " >&2 + exit 2 +fi + VERSION="${1:-2.0.3}" REGISTRY_HOSTNAME="${REGISTRY_HOSTNAME:-tf-registry.containerk8s.services.ngcloud.ru}" NAMESPACE="${NAMESPACE:-nubes}" diff --git a/TOOLS/scripts/check_generated_drift.sh b/TOOLS/scripts/check_generated_drift.sh new file mode 100755 index 0000000..d18d8ec --- /dev/null +++ b/TOOLS/scripts/check_generated_drift.sh @@ -0,0 +1,58 @@ +#!/usr/bin/env bash +set -euo pipefail + +# check_generated_drift.sh — детект дрейфа сгенерированного Go-кода. +# +# Сравнивает ПО СОДЕРЖИМОМУ каталог свежей генерации стенда с рабочей копией +# провайдера, из которой возможна прямая сборка: +# +# generated//go/ <-> provider/internal/resources_gen/ +# +# Каноническая сборка идёт через 03_build_and_upload_provider.sh (временная +# копия со свежесгенерированным кодом). Этот скрипт — детектор: он не даёт +# provider/internal/resources_gen незаметно протухнуть (каталог в .gitignore, +# поэтому в git status дрейф не виден). +# +# Использование: +# ./TOOLS/scripts/check_generated_drift.sh dev # dev | test | prod +# +# Выход: 0 — дрейфа нет; 1 — дрейф есть; 2 — ошибка аргументов. + +STAND="${1:-}" +if [[ -z "$STAND" ]]; then + echo "Usage: $0 # dev | test | prod" >&2 + exit 2 +fi + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +ROOT_DIR="${ROOT_DIR:-$(cd "${SCRIPT_DIR}/../.." && pwd)}" + +GEN_GO_DIR="${ROOT_DIR}/generated/${STAND}/go" +PROV_GO_DIR="${ROOT_DIR}/provider/internal/resources_gen" + +if [[ ! -d "$GEN_GO_DIR" ]]; then + echo "ERROR: no generated go for stand '${STAND}': $GEN_GO_DIR" >&2 + echo " Run: TOOLS/scripts/02_generate_resources_and_docs_v2.sh --profile TOOLS/config/${STAND}" >&2 + exit 2 +fi +if [[ ! -d "$PROV_GO_DIR" ]]; then + echo "DRIFT: provider resources_gen dir missing: $PROV_GO_DIR" >&2 + exit 1 +fi + +# Сравнение по содержимому, включая файлы, присутствующие только с одной стороны. +if diff -rq "$GEN_GO_DIR" "$PROV_GO_DIR" >/dev/null; then + echo "OK: no drift for stand '${STAND}' (generated go == provider copy)." + exit 0 +fi + +echo "DRIFT DETECTED for stand '${STAND}':" >&2 +echo " source: $GEN_GO_DIR" >&2 +echo " target: $PROV_GO_DIR" >&2 +echo "" >&2 +echo "Сгенерированный код стенда расходится с рабочей копией провайдера." >&2 +echo "Сборка должна идти через 03_build_and_upload_provider.sh (temp-копия);" >&2 +echo "provider/internal/resources_gen надо привести в соответствие с generated." >&2 +echo "Различия:" >&2 +diff -rq "$GEN_GO_DIR" "$PROV_GO_DIR" >&2 || true +exit 1