#!/bin/bash set -euo pipefail # Auto-detect which Terraform modules to validate based on changed files from paths-filter # Uses paths-filter outputs from GitHub Actions: # ALL_CHANGED_FILES - all files changed in the PR (for logging) # SHARED_CHANGED - boolean indicating if shared infrastructure changed # MODULE_CHANGED_FILES - only files in registry/**/modules/** (for processing) # Validates all modules if shared infrastructure changes, or skips if no changes detected # # This script only validates changed modules. Documentation and template changes are ignored. validate_terraform_directory() { local dir="$1" echo "Running \`terraform validate\` in $dir" pushd "$dir" > /dev/null terraform init -upgrade terraform validate popd > /dev/null } main() { echo "==> Detecting changed files..." if [[ -n "${ALL_CHANGED_FILES:-}" ]]; then echo "Changed files in PR:" echo "$ALL_CHANGED_FILES" | tr ' ' '\n' | sed 's/^/ - /' echo "" fi local script_dir script_dir=$(dirname "$(readlink -f "$0")") local registry_dir registry_dir=$(readlink -f "$script_dir/../registry") if [[ "${SHARED_CHANGED:-false}" == "true" ]]; then echo "==> Shared infrastructure changed" echo "==> Validating all modules for safety" local subdirs subdirs=$(find "$registry_dir" -mindepth 3 -maxdepth 3 -path "*/modules/*" -type d | sort) elif [[ -z "${MODULE_CHANGED_FILES:-}" ]]; then echo "✓ No module files changed, skipping validation" exit 0 else CHANGED_FILES=$(echo "$MODULE_CHANGED_FILES" | tr ' ' '\n') MODULE_DIRS=() while IFS= read -r file; do if [[ "$file" =~ \.(md|png|jpg|jpeg|svg)$ ]]; then continue fi if [[ "$file" =~ ^registry/([^/]+)/modules/([^/]+)/ ]]; then local namespace namespace="${BASH_REMATCH[1]}" local module module="${BASH_REMATCH[2]}" local module_dir module_dir="registry/${namespace}/modules/${module}" if [[ -d "$module_dir" ]] && [[ ! " ${MODULE_DIRS[*]} " =~ " $module_dir " ]]; then MODULE_DIRS+=("$module_dir") fi fi done <<< "$CHANGED_FILES" if [[ ${#MODULE_DIRS[@]} -eq 0 ]]; then echo "✓ No modules to validate" echo " (documentation, templates, namespace files, or modules without changes)" exit 0 fi echo "==> Validating ${#MODULE_DIRS[@]} changed module(s):" for dir in "${MODULE_DIRS[@]}"; do echo " - $dir" done echo "" local subdirs="${MODULE_DIRS[*]}" fi status=0 for dir in $subdirs; do # Skip over any directories that obviously don't have the necessary # files if test -f "$dir/main.tf"; then if ! validate_terraform_directory "$dir"; then status=1 fi fi done exit $status } main