# Padronização OCI para todos os MFEs **Concluído em:** 2026-02-25 --- ## Contexto O `mfe-user` tinha uma pipeline OCI funcional na branch `devops` que fazia Build → Upload para OCI Object Storage. O API Gateway (`api-gateway-mfe-dev`, IP 10.110.198.250) já estava provisionado via Terraform, mas só servia o `mfe-user`. Os demais MFEs (mfe-shell, mfe-auth, mfe-person, mfe-formalization, mfe-poc) não tinham pipeline OCI nem estavam no Terraform. **Objetivo concluído:** Replicar o padrão em todos os MFEs, mantendo lógica DRY via template compartilhado. --- ## O Que Foi Feito ### 1. Template OCI Compartilhado **Repositório:** `azure-pipelines-templates` **Arquivo:** `/mfe/deploy-mfe-oci.yaml` (branch `main`) **Commit:** `feat: add OCI deploy template for MFEs (deploy-mfe-oci.yaml)` Template reutilizável com dois parâmetros: - `mfeName` (string) — ex: `mfe-shell`, `mfe-auth` - `buildCommand` (string, default: `npm run build:dev`) **Stages:** 1. **Build**: `npm ci` + `$(buildCommand)` → publica artefato `dist` 2. **UploadToOCI**: instala OCI CLI, configura `~/.oci/config`, cria bucket se não existir, seta `public-access-type=ObjectReadWithoutList`, faz upload com content-type por extensão **Variable Group usado:** `oci-terraform` **Variáveis:** `OCI_PRIVATE_KEY_B64`, `OCI_USER_OCID`, `OCI_FINGERPRINT`, `OCI_TENANCY_OCID`, `OCI_REGION`, `TF_VAR_compartment_parent_ocid` **Bucket name pattern:** `mfe-$(mfeName)-dev` **Dist path:** `$(Pipeline.Workspace)/dist/$(mfeName)/browser/` --- ### 2. Pipelines dos MFEs (branch `devops`) Cada MFE tem agora um `azure-pipelines.yml` na branch `devops` com trigger para essa branch: ```yaml trigger: branches: include: - devops resources: repositories: - repository: templates type: git name: azure-pipelines-templates extends: template: mfe/deploy-mfe-oci.yaml@templates parameters: mfeName: '' ``` | Repo | Arquivo | Ação | Commit | |---|---|---|---| | `mfe-user` | `/azure-pipelines.yml` (branch `devops`) | Atualizado: de inline → template OCI | feat: migrate CI/CD to OCI... | | `mfe-shell` | `/azure-pipelines.yml` (branch `devops`) | Atualizado: de AWS template → OCI template | feat: migrate CI/CD to OCI... | | `mfe-auth` | `/azure-pipelines.yml` (branch `devops`) | Atualizado: de AWS template → OCI template | feat: migrate CI/CD to OCI... | | `mfe-person` | `/azure-pipelines.yml` (branch `devops`) | Atualizado: de AWS template → OCI template | feat: migrate CI/CD to OCI... | | `mfe-formalization` | `/azure-pipelines.yml` (branch `devops`) | Criado novo | feat: migrate CI/CD to OCI... | | `mfe-poc` | `/azure-pipelines.yml` (branch `devops`) | Criado novo | feat: migrate CI/CD to OCI... | --- ### 3. Terraform — API Gateway MFE **Repositório:** `tf_oci_clusters` **Arquivo:** `/environments/dev/api_gateway_mfe.tf` (branch `main`) **Commit:** `feat(dev): add all 6 MFEs to api_gateway_mfe deployments` O array `mfe_deployments` foi atualizado de 1 para 6 entradas: | MFE | Hostname | Bucket | |-----|----------|--------| | mfe-user | mfe-user-dev.invista.com.br | mfe-user-dev | | mfe-shell | mfe-shell-dev.invista.com.br | mfe-shell-dev | | mfe-auth | mfe-auth-dev.invista.com.br | mfe-auth-dev | | mfe-person | mfe-person-dev.invista.com.br | mfe-person-dev | | mfe-formalization | mfe-formalization-dev.invista.com.br | mfe-formalization-dev | | mfe-poc | mfe-poc-dev.invista.com.br | mfe-poc-dev | --- ## Como Funciona ### Fluxo de Deploy ``` Push para branch devops em qualquer MFE repo ↓ azure-pipelines.yml trigga ↓ Extends deploy-mfe-oci.yaml@templates ↓ Stage: Build npm ci + npm run build:dev Publica artefato 'dist' ↓ Stage: UploadToOCI Instala OCI CLI Configura ~/.oci/config (via oci-terraform variable group) Cria bucket mfe--dev (se não existir) Seta public-access-type=ObjectReadWithoutList Upload de todos arquivos com content-type correto ``` ### Acesso após Terraform Apply O Terraform cria um deployment por MFE no API Gateway `api-gateway-mfe-dev`. **URL base do gateway:** `https://guhal72tzyekzchzamhhi3lvgi.apigateway.sa-saopaulo-1.oci.customer-oci.com/` Cada MFE fica acessível em: - `mfe-user-dev.invista.com.br` → Object Storage `mfe-user-dev` - `mfe-shell-dev.invista.com.br` → Object Storage `mfe-shell-dev` - etc. --- ## Notas Importantes - **A branch `devops` do mfe-user** (pipeline multi-cloud inline) é mantida como está — o `azure-pipelines.yml` atualizado convive com o inline existente porque substituiu o arquivo existente com o novo template - **mfe-formalization e mfe-poc** não tinham pipeline algum — o novo arquivo OCI é o primeiro - Os **buckets** `mfe-{name}-dev` são criados automaticamente pela pipeline se não existirem - Após `terraform apply` o API Gateway cria um deployment por MFE no mesmo gateway (rota por hostname) --- ## Verificação ### Pipeline Após push para branch `devops` em qualquer MFE: 1. Azure DevOps detecta trigger na branch `devops` 2. Executa Build stage (npm ci + build:dev) 3. Executa UploadToOCI stage (cria bucket + faz upload) 4. Bucket `mfe--dev` disponível no OCI Object Storage ### Terraform Após `terraform apply` no ambiente `dev`: 1. API Gateway cria um deployment por MFE no `mfe_deployments` list 2. Cada deployment tem rotas: - `GET /` → `index.html` (SPA entry point) - `GET /{path*}` → arquivos estáticos do bucket --- ## Referências - [OCI-MFE-TASKS.md](./OCI-MFE-TASKS.md) — Checklist completo - [OCI-MFE-STEPBYSTEP.md](./OCI-MFE-STEPBYSTEP.md) — Guia passo a passo - [OCI-TERRAFORM.md](./OCI-TERRAFORM.md) — Terraform configuração - Template: `azure-pipelines-templates/mfe/deploy-mfe-oci.yaml` - Terraform: `tf_oci_clusters/environments/dev/api_gateway_mfe.tf`