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.
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:
-
deploy_global(GitHub-hostedubuntu-24.04):- Lista stacks alteradas com tag
global - Executa
terragrunt planeterragrunt apply -auto-approve - Inicia o runner OCI self-hosted
- Lista stacks alteradas com tag
-
deploy(self-hosted OCI, depende dedeploy_global):- Lista stacks alteradas excluindo tag
global - Executa
terragrunt init,plan, eapply -auto-approve
- Lista stacks alteradas excluindo tag
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:
start_runner— Inicia o runner OCIpreview(self-hosted OCI):- Cria status check
pendingno PR - Lista stacks alteradas via
terramate list --changed - Executa
terragrunt plan -out out.tfplan -lock=falsecom--continue-on-error - Gera comentário sticky no PR com o output do plan (truncado em ~248KB)
- Atualiza status check para
successoufailure
- Cria status check
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:
deploy_global— Plan + apply de todas as stacks com tagglobaldeploy— Apply de todas as stacks excluindoglobal
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
- Valida que o config NÃO existe (config shared incompatível)
- Gera arquivo
.hclcom blocodb_config(PostgreSQL 16 + 9.6) - Cria branch, commit, PR com labels
- Dispara workflow de preview
- 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)
- Valida existência do config conforme tipo de banco
- Gera/atualiza arquivo
.hcldo tenant - Copia secrets do Vault do tenant de origem para o novo
- Cria PR no repositório de infra com labels (
new_tenant,tenant=X,env=Y) - Adiciona metadata no Vault (PR number para tracking)
- Dispara preview
- Em paralelo: Cria PR no
ads-tenants-configcom 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
- Cria kubeconfig para clusters TOOLS + ambiente alvo
- Faz backup do
ApplicationSetdo ArgoCD - Patcha o ApplicationSet removendo
automatedsync - Deleta deployments do tenant no cluster alvo (aguarda até 3 min)
- Em caso de falha: reverte ApplicationSet do backup
Reativar Auto-Sync (tenant-enable-auto-sync.yml)¶
Trigger: workflow_dispatch manual — após manutenção
- Cria kubeconfig para cluster TOOLS
- Faz backup do ApplicationSet
- Restaura
syncPolicy.automated: {prune: true, selfHeal: true}
Cleanup de PR Cancelado (cleanup-tenant-config.yml)¶
Trigger: PR fechado sem merge com label new_tenant
- Encontra e fecha PR relacionado no
ads-tenants-config - Deleta secrets do Vault criados pelo PR (usando metadata
pr_number) - 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.