feat(tools): страж имён атрибутов схемы + вызов в 03 (fail-fast до заливки)
Инцидент 2026-09-30 показал: невалидное имя атрибута (s3-inst) проходило генерацию, сборку и заливку, а ломалось только у пользователя (Terraform отвергает схему целиком). - TOOLS/scripts/check_schema_names.sh: проверяет все tfsdk:"..." в сгенерированном Go на [a-z0-9_]; exit 1 при нарушении, с подсказкой про helpers.ToSnake. - 03_build_and_upload_provider.sh: вызов стража после 02 (до сборки и заливки). - ARCHITECTURE.md: страж добавлен в список enforced-скриптов. - HISTORY: пункт 'не закрыто' заменён на 'закрыто' с проверками. Проверено: dev/test/prod -> OK; искусственный пример (tfsdk:"s3-inst") -> exit 1.
This commit is contained in:
@@ -68,7 +68,8 @@ linux-артефакта: `d25a71a31dbc9ab16e494b3d1f68b38b2214bd530045c5a3003f5
|
||||
**Верификация.** `DEV_STAND/FPipeGmail`: провайдер `2.0.1` (после сброса lock) →
|
||||
`terraform validate` — **Success**.
|
||||
|
||||
**Не закрыто (предложение).** В пайплайне нет проверки схемы: `02`/сборка/заливка проходят при
|
||||
невалидных именах атрибутов, дефект обнаруживается только при обращении Terraform к провайдеру.
|
||||
Стоит добавить шаг валидации схемы в `03` (или fail-fast в генераторе по `[a-z0-9_]`).
|
||||
**Закрыто.** Добавлен страж `TOOLS/scripts/check_schema_names.sh`: проверяет все
|
||||
`tfsdk:"..."` в сгенерированном Go на `[a-z0-9_]` и включён в `03` (перед сборкой и заливкой).
|
||||
Проверено: `dev`/`test`/`prod` — OK; на искусственном примере (`tfsdk:"s3-inst"`) страж
|
||||
падает с exit 1. Теперь невалидная схема не может уехать в реестр.
|
||||
|
||||
|
||||
@@ -306,6 +306,10 @@ Enforced by scripts (run before build/commit):
|
||||
- `TOOLS/scripts/check_generated_drift.sh <stand>` — generated Go vs provider copy.
|
||||
- `TOOLS/scripts/check_hardcoded_service_ids.sh` — forbids `svc.ID == N` /
|
||||
`ServiceID == N` outside the registries.
|
||||
- `TOOLS/scripts/check_schema_names.sh <generated-go-dir>` — every `tfsdk:"..."`
|
||||
attribute name must match `[a-z0-9_]`. Terraform rejects the WHOLE provider schema on an
|
||||
invalid name (incident 2026-09-30: API codes `s3-inst` / `s3-ref-root`), so this guard
|
||||
runs inside `03_build_and_upload_provider.sh` BEFORE build/upload.
|
||||
|
||||
Build rule: `provider/internal/resources_gen` and `provider/resources_yaml` are
|
||||
ephemeral by design and never a build source. Canonical build is
|
||||
|
||||
@@ -41,6 +41,12 @@ fi
|
||||
"${ROOT_DIR}/TOOLS/scripts/01_generate_yamls.sh" --profile "$PROFILE_DIR"
|
||||
"${ROOT_DIR}/TOOLS/scripts/02_generate_resources_and_docs_v2.sh" --profile "$PROFILE_DIR"
|
||||
|
||||
# Fail-fast: имена атрибутов Terraform-схемы обязаны быть [a-z0-9_]. Иначе провайдер
|
||||
# не отдаст схему целиком и любой plan/apply у пользователей упадёт (инцидент 2026-09-30:
|
||||
# коды API `s3-inst` / `s3-ref-root`). Проверяем ДО сборки и заливки.
|
||||
STAND_NAME="$(basename "$PROFILE_DIR")"
|
||||
"${ROOT_DIR}/TOOLS/scripts/check_schema_names.sh" "${ROOT_DIR}/generated/${STAND_NAME}/go"
|
||||
|
||||
resolve_root_path() {
|
||||
local path_value="$1"
|
||||
if [[ -z "$path_value" ]]; then
|
||||
|
||||
Executable
+46
@@ -0,0 +1,46 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
# check_schema_names.sh — защита от невалидных имён атрибутов Terraform-схемы.
|
||||
#
|
||||
# Terraform допускает в именах атрибутов только [a-z0-9_]. Нарушение приводит к тому,
|
||||
# что провайдер НЕ может отдать схему целиком ("Invalid Attribute/Block Name") и падают
|
||||
# plan/apply/validate у всех пользователей.
|
||||
# Инцидент 2026-09-30: коды API `s3-inst` / `s3-ref-root` в тестовом сервисе 1_dummy.
|
||||
#
|
||||
# Проверяет все `tfsdk:"..."` в сгенерированном Go.
|
||||
#
|
||||
# Usage:
|
||||
# ./TOOLS/scripts/check_schema_names.sh generated/dev/go
|
||||
# ./TOOLS/scripts/check_schema_names.sh provider/internal/resources_gen
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
ROOT_DIR="${ROOT_DIR:-$(cd "${SCRIPT_DIR}/../.." && pwd)}"
|
||||
|
||||
TARGET="${1:-}"
|
||||
if [[ -z "$TARGET" ]]; then
|
||||
echo "Usage: $0 <dir-with-generated-go>" >&2
|
||||
exit 2
|
||||
fi
|
||||
[[ "$TARGET" = /* ]] || TARGET="${ROOT_DIR}/${TARGET}"
|
||||
|
||||
if [[ ! -d "$TARGET" ]]; then
|
||||
echo "Error: directory not found: $TARGET" >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
bad="$(grep -rho 'tfsdk:"[^"]*"' "$TARGET" --include='*.go' \
|
||||
| sed 's/^tfsdk:"//; s/"$//' \
|
||||
| grep -vE '^[a-z0-9_]+$' \
|
||||
| sort -u || true)"
|
||||
|
||||
if [[ -n "$bad" ]]; then
|
||||
echo "INVALID TERRAFORM ATTRIBUTE NAMES (only [a-z0-9_] allowed):" >&2
|
||||
echo "$bad" | sed 's/^/ /' >&2
|
||||
echo "" >&2
|
||||
echo "Terraform отвергает схему провайдера ЦЕЛИКОМ — пользователи не смогут сделать plan/apply." >&2
|
||||
echo "Нормализуйте имена в генераторе: TOOLS/resource-generator/internal/helpers/helpers.go (ToSnake/sanitizeAttrName)." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "OK: all tfsdk attribute names valid in ${TARGET}"
|
||||
Reference in New Issue
Block a user