cd ..
CI/CD

Automatizando a validação de Terraform utilizando scripts dentro de workflows do GitHub Actions

Automatizando a validação de Terraform utilizando scripts dentro de workflows do GitHub Actions

Quando começamos a criar pipelines no GitHub Actions, é comum colocar todos os comandos diretamente dentro do arquivo YAML.

Embora funcione, conforme a pipeline cresce ela acaba ficando difícil de manter.

Uma alternativa muito utilizada é mover toda a lógica para um Shell Script, deixando o workflow apenas responsável por executar esse script.

Esse padrão melhora a organização do projeto e facilita a reutilização em diferentes pipelines.

Estrutura do projeto

Um exemplo simples seria:

.
├── .github
│   └── workflows
│       └── testa-terraform.yml
├── infra
│   ├── provider.tf
│   ├── variables.tf
│   └── ec2.tf
└── scripts
    └── valida-tf.sh

Cada arquivo possui uma responsabilidade específica.


Configurando o Provider

O primeiro passo é informar qual provider será utilizado.

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region = "us-east-1"
}

Criando uma instância

Depois podemos declarar um recurso simples.

resource "aws_instance" "web" {
  ami           = var.ami_id
  instance_type = var.instance_type

  tags = {
    Name = "HelloWorld"
  }
}

Declarando variáveis

Separar as variáveis facilita bastante a reutilização do código.

variable "ami_id" {
  type    = string
  default = "ami-xxxxxxxx"
}

variable "instance_type" {
  type    = string
  default = "t3.micro"
}

Criando o script de validação

Em vez de colocar todos os comandos dentro do workflow, podemos criar um arquivo Bash.

#!/usr/bin/env bash

set -euo pipefail

terraform init -backend=false

terraform validate

O comando

set -euo pipefail

é uma excelente prática porque:

Instalando o Terraform durante a pipeline

Caso o runner não possua o Terraform instalado, podemos baixá-lo automaticamente.

Exemplo simplificado:

curl -L "$DOWNLOAD_URL" -o terraform.zip

unzip terraform.zip

export PATH="$HOME/bin:$PATH"

Assim não dependemos de uma instalação prévia.

Executando a validação

Após inicializar o projeto, basta validar a sintaxe.

terraform init -backend=false

terraform validate

O parâmetro

-backend=false

é muito útil durante testes porque evita configurar um backend remoto apenas para validar a estrutura do projeto.

Retornando o resultado para o GitHub Actions

Outra prática interessante é informar o resultado da execução utilizando o arquivo especial do GitHub Actions.

Quando tudo funciona:

echo "tf_result=success" >> "$GITHUB_OUTPUT"

Caso ocorra algum erro:

echo "tf_result=failure" >> "$GITHUB_OUTPUT"

exit 1

Dessa forma outros passos da pipeline conseguem utilizar essa informação.

Workflow simplificado

O YAML fica extremamente pequeno.

name: Testa Terraform

on:
  workflow_dispatch:

jobs:
  valida:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Permitir execução
        run: chmod +x scripts/valida-tf.sh

      - name: Executar validação
        run: ./scripts/valida-tf.sh

Observe que praticamente toda a lógica saiu do workflow.

Vantagens dessa abordagem

Entre os principais benefícios estão:

Conclusão

Separar a lógica da pipeline em scripts Bash é uma prática bastante utilizada em projetos DevOps.

O GitHub Actions continua responsável pela orquestração da pipeline, enquanto o Shell Script concentra toda a lógica da execução.

Essa organização torna o código mais limpo, facilita testes locais e permite reutilizar o mesmo script em diferentes pipelines sem duplicar comandos.

Quanto maior o projeto, maior tende a ser o benefício dessa separação.

Referências

O que achou?