Skip to content

Commit

Permalink
feat: Make terraform_validate to run init if necessary (#158)
Browse files Browse the repository at this point in the history
  • Loading branch information
antonbabenko authored Nov 2, 2020
1 parent 84374f6 commit d303bff
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 27 deletions.
2 changes: 1 addition & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -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
Expand Down
10 changes: 9 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion terraform_docs.sh
Original file line number Diff line number Diff line change
Expand Up @@ -311,7 +311,7 @@ EOF

}

# global arrays
# global arrays
declare -a ARGS=()
declare -a FILES=()

Expand Down
2 changes: 1 addition & 1 deletion terraform_tfsec.sh
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ parse_cmdline_() {
done
}

# global arrays
# global arrays
declare -a ARGS=()
declare -a FILES=()

Expand Down
51 changes: 28 additions & 23 deletions terraform_validate.sh
Original file line number Diff line number Diff line change
@@ -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_ "$@"
Expand Down Expand Up @@ -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"

# 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")
pushd "$(realpath "$path_uniq")" > /dev/null

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
fi

local validate_path
validate_path="${path_uniq#"$terraform_path"}"
set +e
validate_output=$(terraform validate "${ARGS[@]}" 2>&1)
validate_code=$?
set -e

# 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
if [[ $validate_code != 0 ]]; then
error=1
echo "Validation failed: $path_uniq"
echo "$validate_output"
echo
echo "Failed path: $path_uniq"
echo "================================"
fi
cd "$starting_path"

popd > /dev/null
fi
done

Expand All @@ -116,7 +121,7 @@ terraform_validate_() {
fi
}

# global arrays
# global arrays
declare -a ARGS
declare -a ENVS
declare -a FILES
Expand Down

0 comments on commit d303bff

Please sign in to comment.