#!/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