From a95f5eeec12a1105364a79822b958d3a21ac8a18 Mon Sep 17 00:00:00 2001 From: Maksym Vlasov Date: Tue, 5 Jul 2022 15:25:30 +0300 Subject: [PATCH] feat: Allow `terraform_providers_lock` specify terraform init args (#406) --- README.md | 9 +++++++ hooks/_common.sh | 39 +++++++++++++++++++++++++++++++ hooks/terraform_providers_lock.sh | 16 +++++-------- hooks/terraform_validate.sh | 16 +++---------- 4 files changed, 57 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 416533aa4..b0a10bad1 100644 --- a/README.md +++ b/README.md @@ -515,6 +515,15 @@ Example: `terraform_providers_lock` hook will try to reinitialize directories before running the `terraform providers lock` command. +5. `terraform_providers_lock` support passing custom arguments to its `terraform init`: + + ```yaml + - id: terraform_providers_lock + args: + - --init-args=-upgrade + ``` + + ### terraform_tflint 1. `terraform_tflint` supports custom arguments so you can enable module inspection, deep check mode, etc. diff --git a/hooks/_common.sh b/hooks/_common.sh index eb17ef815..e5be5ffc4 100644 --- a/hooks/_common.sh +++ b/hooks/_common.sh @@ -25,6 +25,7 @@ function common::initialize { # Globals (init and populate): # ARGS (array) arguments that configure wrapped tool behavior # HOOK_CONFIG (array) arguments that configure hook behavior +# INIT_ARGS (array) arguments for `terraform init` command # FILES (array) filenames to check # Arguments: # $@ (array) all specified in `hooks.[].args` in @@ -34,6 +35,8 @@ function common::parse_cmdline { # common global arrays. # Populated via `common::parse_cmdline` and can be used inside hooks' functions ARGS=() HOOK_CONFIG=() FILES=() + # Used inside `common::terraform_init` function + INIT_ARGS=() local argv argv=$(getopt -o a:,h: --long args:,hook-config: -- "$@") || return @@ -51,6 +54,11 @@ function common::parse_cmdline { HOOK_CONFIG+=("$1;") shift ;; + -i | --init-args) + shift + INIT_ARGS+=("$1") + shift + ;; --) shift # shellcheck disable=SC2034 # Variable is used @@ -230,3 +238,34 @@ function common::colorify { echo -e "${COLOR}${TEXT}${RESET}" } + +####################################################################### +# Run terraform init command +# Arguments: +# command_name (string) command that will tun after successful init +# dir_path (string) PATH to dir relative to git repo root. +# Can be used in error logging +# Globals (init and populate): +# INIT_ARGS (array) arguments for `terraform init` command +# Outputs: +# If failed - print out terraform init output +####################################################################### +function common::terraform_init { + local -r command_name=$1 + local -r dir_path=$2 + + local exit_code=0 + local init_output + + if [ ! -d .terraform ]; then + init_output=$(terraform init -backend=false "${INIT_ARGS[@]}" 2>&1) + exit_code=$? + + if [ $exit_code -ne 0 ]; then + common::colorify "red" "'terraform init' failed, '$command_name' skipped: $dir_path" + echo -e "$init_output\n\n" + fi + fi + + return $exit_code +} diff --git a/hooks/terraform_providers_lock.sh b/hooks/terraform_providers_lock.sh index a0f406808..1bdf8597a 100755 --- a/hooks/terraform_providers_lock.sh +++ b/hooks/terraform_providers_lock.sh @@ -30,23 +30,19 @@ function per_dir_hook_unique_part { local -r args="$1" local -r dir_path="$2" - if [ ! -d ".terraform" ]; then - init_output=$(terraform init -backend=false 2>&1) - init_code=$? + local exit_code - if [ $init_code -ne 0 ]; then - common::colorify "red" "Init before validation failed: $dir_path" - common::colorify "red" "$init_output" - exit $init_code - fi - fi + common::terraform_init 'terraform providers lock' "$dir_path" || { + exit_code=$? + return $exit_code + } # pass the arguments to hook # shellcheck disable=SC2068 # hook fails when quoting is used ("$arg[@]") terraform providers lock ${args[@]} # return exit code to common::per_dir_hook - local exit_code=$? + exit_code=$? return $exit_code } diff --git a/hooks/terraform_validate.sh b/hooks/terraform_validate.sh index cbbab532e..eefe73321 100755 --- a/hooks/terraform_validate.sh +++ b/hooks/terraform_validate.sh @@ -88,8 +88,6 @@ function parse_cmdline_ { # args (string with array) arguments that configure wrapped tool behavior # dir_path (string) PATH to dir relative to git repo root. # Can be used in error logging -# Globals: -# INIT_ARGS (array) arguments for `terraform init` command` # ENVS (array) environment variables that will be used with # `terraform` commands # Outputs: @@ -100,19 +98,12 @@ function per_dir_hook_unique_part { local -r dir_path="$2" local exit_code - local init_output local validate_output - if [ ! -d .terraform ]; then - init_output=$(terraform init -backend=false "${INIT_ARGS[@]}" 2>&1) + common::terraform_init 'terraform validate' "$dir_path" || { exit_code=$? - - if [ $exit_code -ne 0 ]; then - common::colorify "yellow" "'terraform init' failed, 'terraform validate' skipped: $dir_path" - echo "$init_output" - return $exit_code - fi - fi + return $exit_code + } # pass the arguments to hook # shellcheck disable=SC2068 # hook fails when quoting is used ("$arg[@]") @@ -129,7 +120,6 @@ function per_dir_hook_unique_part { } # global arrays -declare -a INIT_ARGS declare -a ENVS [ "${BASH_SOURCE[0]}" != "$0" ] || main "$@"