From 67c4d2f190af2cd6f0935317e87140fd49f51d69 Mon Sep 17 00:00:00 2001 From: Repinoid Date: Mon, 21 Sep 2026 20:41:13 +0300 Subject: [PATCH] =?UTF-8?q?tool(scripts):=20validate=5Fdocs=5Fexamples.sh?= =?UTF-8?q?=20=E2=80=94=20terraform=20validate=20=D0=BF=D0=BE=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=D0=BC=D0=B5=D1=80=D0=B0=D0=BC=20=D0=B8=D0=B7=20?= =?UTF-8?q?=D1=81=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20=D0=B4=D0=BE=D0=BA=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TOOLS/scripts/validate_docs_examples.sh | 82 +++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100755 TOOLS/scripts/validate_docs_examples.sh diff --git a/TOOLS/scripts/validate_docs_examples.sh b/TOOLS/scripts/validate_docs_examples.sh new file mode 100755 index 0000000..7ff7914 --- /dev/null +++ b/TOOLS/scripts/validate_docs_examples.sh @@ -0,0 +1,82 @@ +#!/usr/bin/env bash +# validate_docs_examples.sh — прогоняет `terraform validate` по примерам из +# сгенерированных доков (первый hcl-блок в каждом *_example.md). +# +# Зачем: docs-generator может отрендерить HCL, который не парсится или не +# соответствует схеме провайдера. Юнит-тестов у него нет, поэтому единственная +# честная проверка — реальный terraform. +# +# Использование: +# ./TOOLS/scripts/validate_docs_examples.sh [--profile TOOLS/config/dev] [--filter vc_] +# +# Exit code: 0 — все примеры валидны, 1 — есть падения (список в конце). + +set -uo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +PROFILE="TOOLS/config/dev" +FILTER="" + +while [[ $# -gt 0 ]]; do + case "$1" in + --profile) PROFILE="$2"; shift 2 ;; + --filter) FILTER="$2"; shift 2 ;; + -h|--help) sed -n '2,14p' "$0"; exit 0 ;; + *) echo "Unknown arg: $1" >&2; exit 2 ;; + esac +done + +STAND="$(basename "$PROFILE")" +DOCS_DIR="${ROOT_DIR}/generated/${STAND}/docs" +WORK_DIR="$(mktemp -d)" +trap 'rm -rf "$WORK_DIR"' EXIT + +if [[ ! -d "$DOCS_DIR" ]]; then + echo "Error: docs dir not found: $DOCS_DIR (сначала запустите 02_generate_resources_and_docs_v2.sh)" >&2 + exit 2 +fi + +# Кэш плагинов: terraform init в каждом каталоге не будет качать провайдер заново. +export TF_PLUGIN_CACHE_DIR="${TF_PLUGIN_CACHE_DIR:-$HOME/.terraform.d/plugin-cache}" +mkdir -p "$TF_PLUGIN_CACHE_DIR" + +pass=0 +fail=0 +failed=() + +for md in "$DOCS_DIR"/*_example.md; do + name="$(basename "$md" _example.md)" + if [[ -n "$FILTER" && "$name" != *"$FILTER"* ]]; then + continue + fi + + dir="$WORK_DIR/$name" + mkdir -p "$dir" + # Первый ```hcl ... ``` блок — это полный пример (provider + resource). + awk '/^```hcl/{f=1;next} /^```/{if(f){exit}} f' "$md" > "$dir/main.tf" + + if [[ ! -s "$dir/main.tf" ]]; then + echo "SKIP $name (нет hcl-блока)" + continue + fi + + out="$(cd "$dir" && terraform init -backend=false -input=false -no-color 2>&1 \ + && terraform validate -no-color 2>&1)" + if [[ $? -eq 0 ]] && ! grep -q '^Error:' <<<"$out"; then + pass=$((pass + 1)) + echo "OK $name" + else + fail=$((fail + 1)) + failed+=("$name") + echo "FAIL $name" + printf '%s\n' "$out" | grep -E 'Error:|on main\.tf' | head -6 | sed 's/^/ /' + fi +done + +echo +echo "──────────────────────────────────────────" +echo "OK: $pass FAIL: $fail" +if [[ $fail -gt 0 ]]; then + printf 'Упавшие примеры: %s\n' "${failed[*]}" + exit 1 +fi