infracloud/invista/nexus/OCI-MFE-PADRONIZACAO.md

164 lines
5.7 KiB
Markdown

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