tool(scripts): validate_docs_examples.sh — terraform validate по примерам из сгенерированных доков
This commit is contained in:
Executable
+82
@@ -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
|
||||
Reference in New Issue
Block a user