# 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: '<nome-do-mfe>'
```

| 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-<nome>-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-<nome>-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`
