Skip to content

Pipeline de Infraestrutura

O pipeline de infraestrutura (ads-oci-infra-pipeline) gerencia toda a IaC da Oracle Cloud usando Terramate + Terragrunt + Terraform. Os workflows do GitHub Actions automatizam preview, deploy e sincronização de infraestrutura.

A arquitetura do pipeline utiliza Terramate, Terragrunt e Terraform para criar e gerenciar recursos de forma consistente e reproduzível em diferentes ambientes. Além disso, o pipeline integra GitHub Actions para automação de CI/CD.

Arquitetura Geral

Figura 1: Pipeline de Infraestrutura

Visão Geral

flowchart LR
    A[Branch] --> B[Pull Request]
    B --> C[Preview]
    C --> D[PR Comment<br/>com terraform plan]
    D --> E{Aprovação}
    E -->|Merge| F[Deploy]
    F --> G[Apply Global]
    G --> H[Apply Stacks]

    I[Daily 4am UTC] --> J[Infrastructure Sync]
    J --> K[Apply ALL Stacks]

Workflows

Deploy (deploy.yml)

Executado em push para main quando há alterações em config/ ou infrastructure/.

Jobs:

  1. deploy_global (GitHub-hosted ubuntu-24.04):

    • Lista stacks alteradas com tag global
    • Executa terragrunt plan e terragrunt apply -auto-approve
    • Inicia o runner OCI self-hosted
  2. deploy (self-hosted OCI, depende de deploy_global):

    • Lista stacks alteradas excluindo tag global
    • Executa terragrunt init, plan, e apply -auto-approve

Apply sem plan file

O apply usa -auto-approve diretamente (sem plan file) porque o provider Ansible não exibe changes no plan output.

Preview (preview.yml)

Executado em Pull Requests para main. Gera preview das alterações e posta como comentário no PR.

Jobs:

  1. start_runner — Inicia o runner OCI
  2. preview (self-hosted OCI):
    • Cria status check pending no PR
    • Lista stacks alteradas via terramate list --changed
    • Executa terragrunt plan -out out.tfplan -lock=false com --continue-on-error
    • Gera comentário sticky no PR com o output do plan (truncado em ~248KB)
    • Atualiza status check para success ou failure

Status Check Obrigatório

O status check Infrastructure Preview é obrigatório para merge — o PR fica bloqueado até o preview completar com sucesso.

Infrastructure Sync (drift.yml)

Executado diariamente às 4:00 UTC via cron. Reconcilia TODAS as stacks (não apenas as alteradas).

Jobs:

  1. deploy_global — Plan + apply de todas as stacks com tag global
  2. deploy — Apply de todas as stacks excluindo global

A diferença chave em relação ao deploy: o drift roda em todas as stacks para garantir reconciliação completa do estado.

Workflows de Tenant

Criar Tenant — Banco Dedicado (tenant-create-dedicated.yml)

Trigger: workflow_dispatch manual

Passo 0 — Cria a infraestrutura de banco dedicado para o tenant:

Inputs: tenant_name, description, environment (hml/nox), enable_replica, enable_backup, ocpus, memory, data_volume_size

  1. Valida que o config NÃO existe (config shared incompatível)
  2. Gera arquivo .hcl com bloco db_config (PostgreSQL 16 + 9.6)
  3. Cria branch, commit, PR com labels
  4. Dispara workflow de preview
  5. Merge → Deploy cria a infra do banco

Criar Tenant — Config de App (tenant-create.yml)

Trigger: workflow_dispatch manual

Passo 1 — Cria config de aplicação e secrets do tenant:

Inputs: tenant_name, description, environment, source_tenant (template), applications, database_type (shared/dedicated)

  1. Valida existência do config conforme tipo de banco
  2. Gera/atualiza arquivo .hcl do tenant
  3. Copia secrets do Vault do tenant de origem para o novo
  4. Cria PR no repositório de infra com labels (new_tenant, tenant=X, env=Y)
  5. Adiciona metadata no Vault (PR number para tracking)
  6. Dispara preview
  7. Em paralelo: Cria PR no ads-tenants-config com configs de app copiados do tenant de origem
flowchart TB
    A[Dispatch: tenant-create] --> B[Validações]
    B --> C[Gera .hcl config]
    C --> D[Copia Secrets Vault]
    D --> E[PR no infra repo]
    D --> F[PR no tenants-config repo]
    E --> G[Preview → Merge → Deploy]
    F --> H[Merge → ArgoCD sync]

Desativar Auto-Sync (tenant-disable-auto-sync.yml)

Trigger: workflow_dispatch manual — para manutenção de tenants

  1. Cria kubeconfig para clusters TOOLS + ambiente alvo
  2. Faz backup do ApplicationSet do ArgoCD
  3. Patcha o ApplicationSet removendo automated sync
  4. Deleta deployments do tenant no cluster alvo (aguarda até 3 min)
  5. Em caso de falha: reverte ApplicationSet do backup

Reativar Auto-Sync (tenant-enable-auto-sync.yml)

Trigger: workflow_dispatch manual — após manutenção

  1. Cria kubeconfig para cluster TOOLS
  2. Faz backup do ApplicationSet
  3. Restaura syncPolicy.automated: {prune: true, selfHeal: true}

Cleanup de PR Cancelado (cleanup-tenant-config.yml)

Trigger: PR fechado sem merge com label new_tenant

  1. Encontra e fecha PR relacionado no ads-tenants-config
  2. Deleta secrets do Vault criados pelo PR (usando metadata pr_number)
  3. Comenta resumo de cleanup no PR

Actions

Action Descrição
setup-tooling Instala Terraform, Terragrunt, Terramate via asdf + kubectl
setup-git Configura git com identidade github-actions[bot]
capture-output Executa comando capturando stdout, stderr, exit-code, duration
check-config-exists Valida existência do config do tenant (shared vs dedicated)
check-vault-secrets Verifica se secrets do tenant já existem no Vault
create-tenant-config Gera arquivo .hcl com config do tenant
git-operations Cria branch timestamped, commit, push
pr-management Cria PR com body detalhado e labels
vault-secrets-management Copia secrets entre tenants via backup→transform→restore
vault-secrets-metadata Adiciona metadata de tracking aos secrets
delete-vault-secrets-by-pr Deleta secrets marcados com PR number específico
preview-workflow Dispara preview e cria status check
tenant-config-setup Cria config de tenant no ads-tenants-config

Makefile

O Makefile encapsula todos os comandos terramate run ... -- terragrunt <cmd> com filtro por ambiente e tag.

Sintaxe

bash make <comando> <ENV> # Todas as stacks do ambiente make <comando> <ENV>:<TAG> # Stacks com tag específica

Onde ENV = tools, hml, nox e TAG = tag da stack (ex: oke, argo, vault).

Comandos

Comando Descrição
make plan ENV Terraform plan do ambiente
make plan ENV:TAG Plan de stacks específicas
make apply ENV Apply com confirmação
make apply ENV:TAG Apply de stacks específicas
make validate ENV Validação de sintaxe
make destroy ENV Destroy com confirmação (exclui tag keep)
make output ENV:TAG Mostra outputs
make state list ENV:TAG Lista recursos no state
make state show ENV:TAG RESOURCE Mostra recurso específico
make state rm ENV:TAG RESOURCE Remove recurso do state
make help Exemplos de uso

Exemplos

```bash

Plan do cluster OKE no ambiente tools

make plan tools:oke

Apply de tudo no HML

make apply hml

Destroy excluindo tag custom

make destroy nox:oke -n custom_tag

Verificar state de um recurso

make state show tools:oke 'module.my_resource' ```

Scripts

vault-backup.sh

Gerenciamento completo de secrets do Vault KV v2:

```bash

Backup de todos os secrets de um mount

./scripts/vault/vault-backup.sh -b -m secret/HML -o backup.json

Restore de backup

./scripts/vault/vault-backup.sh -r -m secret/HML -i backup.json

Copiar entre mounts

./scripts/vault/vault-backup.sh -cp -m secret/HML -sp tenants/origin -dm secret/HML -dp tenants/dest

Listar secrets recursivamente

./scripts/vault/vault-backup.sh -l -m secret/HML

Deletar secrets (com confirmação)

./scripts/vault/vault-backup.sh -d -m secret/HML -sp tenants/old ```

vault-update-value.sh

Transforma backup JSON substituindo referências de um tenant por outro:

bash ./scripts/vault/vault-update-value.sh backup.json source_tenant dest_tenant

Faz substituição com boundary-aware matching (., -, _, /) para evitar falsos positivos.

Stack de Ferramentas

Ferramenta Versão Função
Terraform 1.11.1 Provisionamento de recursos OCI
Terragrunt 0.83.0 DRY config + backend management
Terramate 0.14.0 Orquestração de stacks + change detection

O estado do Terraform é armazenado em OCI Object Storage (compatível S3), com chaves baseadas no path relativo de cada stack.