Terraform Continuous Delivery com GitHub Actions
Tags: actionshackathon21, terraform, iac, devops
Published: 2021-11-10 18:38:11

[Instructions]: # (To submit to the GitHub Actions x DEV Hackathon 2021, please fill out all sections.)

#GitHub Actions: O que é?
GitHub Actions é uma ferramenta que permite automatizar fluxos de trabalho personalizados dentro de seu repositório GitHub de forma simples. Existem [varias Actions já feitas](https://github.com/marketplace?category=&query=&type=actions), criadas por desenvolvedores em todo o mundo, que você pode usar. No entanto, se você não conseguir encontrar uma Actions para seu caso de uso, poderá criar a sua própria. E se você quiser, sinta-se à vontade para compartilhá-lo no [GitHub Marketplace](https://github.com/marketplace?) para melhorar a vida de outros desenvolvedores.

#O que é um Workflow? 
Um workflow é um processo automatizado e configurável. Cada workflow no GitHub Actions é escrito em um arquivo [YAML (Yet Another Markup Language)](https://yaml.org/) usando a sintaxe YAML. Todos os fluxos de trabalho podem ser acionados por eventos que acontecem dentro ou para o seu repositório. Exemplos de eventos que acontecem em seu repositório incluem: uma solicitação push ou pull.

#Actions e Workflow, mas qual a diferença? 

As definições parecem muito semelhantes, então qual é a diferença?

A resposta é que você pode usar uma actions em um workflow!

Actions são comandos autônomos que são combinados em etapas para criar um workflow. Actions são o menor bloco de construção portátil de um workflow. Você pode criar suas próprias ações ou usar actions criadas pela comunidade GitHub. Para usar uma ação em um fluxo de trabalho, você deve incluí-la como uma etapa.

#Chega de teoria, vamos pra prática!

Se essa é sua primeira vez com o GitHub Actions vale muito você começar pelo [quickstart](https://docs.github.com/en/actions/quickstart) eu não conseguiria fazer algo melhor para começar então depois do quickstart volta para aqui =D

No meu exemplo eu vou estar utilizando a [actions oficial da hashicorp](https://github.com/marketplace/actions/hashicorp-setup-terraform) para estar fazendo a entrega da minha infraestrutura feita no Terraform com o GitHub.

Este fluxo de trabalho instala a versão mais recente do Terraform CLI e configura o arquivo de configuração Terraform CLI
com um token de API para Terraform Cloud (app.terraform.io). Em eventos de solicitação pull, este fluxo de trabalho será executado
`terraform init`, `terraform fmt`, e `terraform plan`. Em eventos push para o branch main, `terraform apply` será executado.

A documentação para `hashicorp/setup-terraform` está localizado aqui:: https://github.com/hashicorp/setup-terraform

Para usar este workflow, você precisará concluir as seguintes etapas de configuração.

1- Crie um arquivo `main.tf` na raiz deste repositório com o backend `remote` e um ou mais recursos definidos.

```terraform
terraform { 
  backend "remote" { 
    organization = "example-organization"
    workspaces { 
      name = "example-workspace" 
    }
  }
}

resource "null_resource" "example" {
  triggers = {
    value = "A example resource that does nothing!"
  }
}
```

2- Gere um token de API de usuário do [Terraform Cloud](https://www.terraform.io/cloud) e armazene-o como um segredo GitHub (por exemplo, TF_API_TOKEN) neste repositório.

###**Documentação**:
   - https://www.terraform.io/docs/cloud/users-teams-organizations/api-tokens.html
   - https://help.github.com/en/actions/configuring-and-managing-workflows/creating-and-storing-encrypted-secrets

3- Faça referência ao segredo do GitHub na etapa anterior usando a action do GitHub `hashicorp/setup-terraform`.
```yaml
     - name: Setup Terraform
       uses: hashicorp/setup-terraform@v1
       with:
         cli_config_credentials_token: ${{ secrets.TF_API_TOKEN }}
```

#Terraform Continuous Delivery com GitHub Actions

Para concluirmos escrevi o workflow completo.
Ele deve ser usado junto com as configurações de setup e incluindo ele no diretorio `.github/worflow/terraform.yml`

[Note]: # (Our markdown editor supports pretty embeds. Try this syntax: `{% github link_to_your_repo %}` to share a GitHub repository)
```yaml
name: 'Terraform'

on:
  push:
    branches:
    - main
  pull_request:

jobs:
  terraform:
    name: 'Terraform'
    runs-on: ubuntu-latest
    environment: production

    # Use o shell Bash independentemente do executor GitHub Actions ser ubuntu-latest, macos-latest ou windows-latest
    defaults:
      run:
        shell: bash

    steps:
    # Faça check-out do repositório para o executar o GitHub Actions
    - name: Checkout
      uses: actions/checkout@v2

    # Instale a versão mais recente do Terraform CLI e configure o arquivo de configuração Terraform CLI com um token de API de usuário do Terraform Cloud
    - name: Setup Terraform
      uses: hashicorp/setup-terraform@v1
      with:
        cli_config_credentials_token: ${{ secrets.TF_API_TOKEN }}

    # Inicialize um diretório de trabalho novo ou existente do Terraform criando arquivos iniciais, carregando qualquer estado remoto, baixando módulos, etc.
    - name: Terraform Init
      run: terraform init

    # Verifica se todos os arquivos de configuração do Terraform seguem um formato canônico
    - name: Terraform Format
      run: terraform fmt -check

    # Gera um plano de execução para Terraform
    - name: Terraform Plan
      run: terraform plan

      # No push do main, construa ou altere a infraestrutura de acordo com os arquivos de configuração do Terraform
      # Nota: É recomendado configurar uma verificação de status "estrita" necessária em seu repositório para "Terraform Cloud". Consulte a documentação sobre verificações de status "estritas" exigidas para obter mais informações: https://help.github.com/en/github/administering-a-repository/types-of-required-status-checks
    - name: Terraform Apply
      if: github.ref == 'refs/heads/main' && github.event_name == 'push'
      run: terraform apply -auto-approve
```

Por hoje é isso. 
Participe do [GitHub Actions Hackathon](https://dev.to/devteam/join-us-for-the-2021-github-actions-hackathon-on-dev-4hn4) aqui do Dev.to e contribua com conteúdos como esses.

Vlw flw