From d303bff1f9a7fadc4b22db6a642861de6dfca2c9 Mon Sep 17 00:00:00 2001 From: Anton Babenko Date: Mon, 2 Nov 2020 21:44:54 +0100 Subject: [PATCH] feat: Make terraform_validate to run init if necessary (#158) --- .pre-commit-config.yaml | 2 +- README.md | 10 +++++++- terraform_docs.sh | 2 +- terraform_tfsec.sh | 2 +- terraform_validate.sh | 57 ++++++++++++++++++++++------------------- 5 files changed, 43 insertions(+), 30 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 90e69ba..3fd9775 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: git://github.com/pre-commit/pre-commit-hooks - rev: v3.2.0 + rev: v3.3.0 hooks: - id: check-yaml - id: end-of-file-fixer diff --git a/README.md b/README.md index c54a5ec..5647336 100644 --- a/README.md +++ b/README.md @@ -195,13 +195,21 @@ if they are present in `README.md`. - '--envs=AWS_SECRET_ACCESS_KEY="asecretkey"' ``` +1. It may happen that Terraform working directory (`.terraform`) already exists but not in the best condition (eg, not initialized modules, wrong version of Terraform, etc). To solve this problem you can find and delete all `.terraform` directories in your repository using this command: + + ```shell + find . -type d -name ".terraform" -print0 | xargs -0 rm -r + ``` + + `terraform_validate` hook will try to reinitialize them before running `terraform validate` command. + ## Notes for developers 1. Python hooks are supported now too. All you have to do is: 1. add a line to the `console_scripts` array in `entry_points` in `setup.py` 1. Put your python script in the `pre_commit_hooks` folder -Enjoy the clean and documented code! +Enjoy the clean, valid, and documented code! ## Authors diff --git a/terraform_docs.sh b/terraform_docs.sh index ee1ff90..8c7076b 100755 --- a/terraform_docs.sh +++ b/terraform_docs.sh @@ -311,7 +311,7 @@ EOF } -# global arrays +# global arrays declare -a ARGS=() declare -a FILES=() diff --git a/terraform_tfsec.sh b/terraform_tfsec.sh index a698420..6c6ee25 100755 --- a/terraform_tfsec.sh +++ b/terraform_tfsec.sh @@ -66,7 +66,7 @@ parse_cmdline_() { done } -# global arrays +# global arrays declare -a ARGS=() declare -a FILES=() diff --git a/terraform_validate.sh b/terraform_validate.sh index c224fa8..236b351 100755 --- a/terraform_validate.sh +++ b/terraform_validate.sh @@ -1,6 +1,9 @@ #!/usr/bin/env bash set -eo pipefail +# `terraform validate` requires this env variable to be set +export AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION:-us-east-1} + main() { initialize_ parse_cmdline_ "$@" @@ -80,34 +83,36 @@ terraform_validate_() { if [[ -n "$(find "$path_uniq" -maxdepth 1 -name '*.tf' -print -quit)" ]]; then - local starting_path - starting_path=$(realpath "$path_uniq") - local terraform_path - terraform_path="$path_uniq" + pushd "$(realpath "$path_uniq")" > /dev/null - # Find the relevant .terraform directory (indicating a 'terraform init'), - # but fall through to the current directory. - while [[ $terraform_path != "." ]]; do - if [[ -d $terraform_path/.terraform ]]; then - break - else - terraform_path=$(dirname "$terraform_path") + if [[ ! -d .terraform ]]; then + set +e + init_output=$(terraform init -backend=false 2>&1) + init_code=$? + set -e + + if [[ $init_code != 0 ]]; then + error=1 + echo "Init before validation failed: $path_uniq" + echo "$init_output" + popd > /dev/null + continue fi - done - - local validate_path - validate_path="${path_uniq#"$terraform_path"}" - - # Change to the directory that has been initialized, run validation, then - # change back to the starting directory. - cd "$(realpath "$terraform_path")" - if ! terraform validate "${ARGS[@]}" "$validate_path"; then - error=1 - echo - echo "Failed path: $path_uniq" - echo "================================" fi - cd "$starting_path" + + set +e + validate_output=$(terraform validate "${ARGS[@]}" 2>&1) + validate_code=$? + set -e + + if [[ $validate_code != 0 ]]; then + error=1 + echo "Validation failed: $path_uniq" + echo "$validate_output" + echo + fi + + popd > /dev/null fi done @@ -116,7 +121,7 @@ terraform_validate_() { fi } -# global arrays +# global arrays declare -a ARGS declare -a ENVS declare -a FILES