From 97a668640d21b76e5afa727bb5af005fe9501bcb Mon Sep 17 00:00:00 2001 From: Anton Babenko Date: Wed, 16 May 2018 20:04:48 +0200 Subject: [PATCH] Added terraform-docs integration (#13) * Add hook to create readme * Updated README --- .pre-commit-hooks.yaml | 8 ++++++++ README.md | 16 ++++++++++++---- hooks.yaml | 8 ++++++++ terraform_docs.sh | 39 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 67 insertions(+), 4 deletions(-) create mode 100755 terraform_docs.sh diff --git a/.pre-commit-hooks.yaml b/.pre-commit-hooks.yaml index 786ef5a56..842faa94b 100644 --- a/.pre-commit-hooks.yaml +++ b/.pre-commit-hooks.yaml @@ -6,6 +6,14 @@ files: (\.tf|\.tfvars)$ exclude: \.terraform\/.*$ +- id: terraform_docs + name: Terraform Docs + description: Inserts input and output documentation into README.md (using terraform-docs). + entry: terraform_docs.sh + language: script + files: (\.tf)$ + exclude: \.terraform\/.*$ + - id: terraform_validate_no_variables name: Terraform validate without variables description: Validates all Terraform configuration files without checking whether all required variables were set (basic check). diff --git a/README.md b/README.md index 8a3fa373f..867feeb40 100644 --- a/README.md +++ b/README.md @@ -6,16 +6,24 @@ Several [pre-commit](http://pre-commit.com/) hooks to keep Terraform configurati * `terraform_fmt` - Rewrites all Terraform configuration files to a canonical format. * `terraform_validate_no_variables` - Validates all Terraform configuration files without checking whether all required variables were set. * `terraform_validate_with_variables` - Validates all Terraform configuration files and checks whether all required variables were specified. +* `terraform_docs` - Inserts input and output documentation into `README.md`. -Note that `terraform_validate_no_variables` and `terraform_validate_with_variables` will not work if variables are being set dynamically (eg, when using [Terragrunt](https://github.com/gruntwork-io/terragrunt)). Use `terragrunt validate` command instead. +## Notes about hooks -An example `.pre-commit-config.yaml`: +1. `terraform_validate_no_variables` and `terraform_validate_with_variables` will not work if variables are being set dynamically (eg, when using [Terragrunt](https://github.com/gruntwork-io/terragrunt)). Use `terragrunt validate` command instead. + +1. `terraform_docs` will insert/update documentation generated by [terraform-docs](https://github.com/segmentio/terraform-docs) between markers - `` and `` if they are present in `README.md`. Make sure that `terraform-docs` is installed. + +## Example + +`.pre-commit-config.yaml`: ```yaml - repo: git://github.com/antonbabenko/pre-commit-terraform - sha: v1.6.0 + rev: v1.7.0 hooks: - id: terraform_fmt + - id: terraform_docs ``` -Enjoy the clean code! +Enjoy the clean and documented code! diff --git a/hooks.yaml b/hooks.yaml index 786ef5a56..842faa94b 100644 --- a/hooks.yaml +++ b/hooks.yaml @@ -6,6 +6,14 @@ files: (\.tf|\.tfvars)$ exclude: \.terraform\/.*$ +- id: terraform_docs + name: Terraform Docs + description: Inserts input and output documentation into README.md (using terraform-docs). + entry: terraform_docs.sh + language: script + files: (\.tf)$ + exclude: \.terraform\/.*$ + - id: terraform_validate_no_variables name: Terraform validate without variables description: Validates all Terraform configuration files without checking whether all required variables were set (basic check). diff --git a/terraform_docs.sh b/terraform_docs.sh new file mode 100755 index 000000000..a3008aeaa --- /dev/null +++ b/terraform_docs.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash +set -e + +declare -a paths +declare -a tfvars_files + +index=0 + +for file_with_path in "$@"; do + file_with_path="${file_with_path// /__REPLACED__SPACE__}" + + paths[index]=$(dirname "$file_with_path") + + if [[ "$file_with_path" == *".tfvars" ]]; then + tfvars_files+=("$file_with_path") + fi + + let "index+=1" +done + +readonly tmp_file="tmp_$(date | md5).txt" + +for path_uniq in $(echo "${paths[*]}" | tr ' ' '\n' | sort -u); do + path_uniq="${path_uniq//__REPLACED__SPACE__/ }" + + pushd "$path_uniq" > /dev/null + + terraform-docs md ./ > "$tmp_file" + + # Replace content between markers with the placeholder - http://fahdshariff.blogspot.no/2012/12/sed-mutli-line-replacement-between-two.html + sed -i -n '/BEGINNING OF PRE-COMMIT-TERRAFORM DOCS HOOK/{p;:a;N;/END OF PRE-COMMIT-TERRAFORM DOCS HOOK/!ba;s/.*\n/I_WANT_TO_BE_REPLACED\n/};p' README.md + + # Replace placeholder with the content of the file - https://stackoverflow.com/a/31057013/550451 + sed -i -e "/I_WANT_TO_BE_REPLACED/r $tmp_file" -e "//d" README.md + + rm -f "$tmp_file" + + popd > /dev/null +done