Automating Proper Terraform Formatting using Git Pre-Hooks

I’ve noticed lately that a lot of Terraform is formatted differently. Some developers utilize two indents, others one indent. As long as the Terraform as functional most people overlook the formatting of their infrastructure as code files.

Personally I don’t think we should ever push messy code into our repositories. How could we solve this problem? Well, Terraform has a built in formatter the terraform fmt command will automatically format your code.

#!/usr/bin/env bash

# Initialize variables
EXIT_CODE=0
AFFECTED_FILES=()

# Detect OS for cross-platform compatibility
OS=$(uname -s)
IS_WINDOWS=false
if [[ "$OS" == MINGW* ]] || [[ "$OS" == CYGWIN* ]] || [[ "$OS" == MSYS* ]]; then
    IS_WINDOWS=true
fi

# Find all .tf files - cross-platform compatible method
if [ "$IS_WINDOWS" = true ]; then
    # For Windows using Git Bash
    TF_FILES=$(find . -type f -name "*.tf" -not -path "*/\\.*" | sed 's/\\/\//g')
else
    # For Linux/Mac
    TF_FILES=$(find . -type f -name "*.tf" -not -path "*/\.*")
fi

# Check each file individually for better reporting
for file in $TF_FILES; do
    # Get the directory of the file
    dir=$(dirname "$file")
    filename=$(basename "$file")
    
    # Run terraform fmt check on the specific file - handle both OS formats
    terraform -chdir="$dir" fmt -check "$filename" >/dev/null 2>&1
    
    # If format check fails, record the file
    if [ $? -ne 0 ]; then
        AFFECTED_FILES+=("$file")
        EXIT_CODE=1
    fi
done

# If any files need formatting, list them and exit with error
if [ $EXIT_CODE -ne 0 ]; then
    echo "Error: The following Terraform files need formatting:"
    for file in "${AFFECTED_FILES[@]}"; do
        echo " - $file"
    done
    echo ""
    echo "Please run the following command to format these files:"
    echo "terraform fmt -recursive"
    exit 1
fi

echo "All Terraform files are properly formatted"
exit 0

Put this code inside your “.git/hooks/” directory so that it automatically runs when someone does a push. If there is badly formatted Terraform you should see something like:

Running Terraform format check...
Error: The following Terraform files need formatting:
  - ./main.tf

Please run the following command to format these files:
terraform fmt -recursive
error: failed to push some refs to 'github.com:avansledright/terraform-fmt-pre-hook.git'

After running the <code>terraform fmt -recursive</code> it should push successfully!

If this was helpful to your or your team please share it across your social media!

YouTube video of this script in action

Comments

Leave a Reply