infracloud/invista/nexus/MFE-USER-PIPELINE.md

365 lines
13 KiB
Markdown

# mfe-user - Pipeline Multi-Cloud
## Visão Geral
O repositório `mfe-user` possui uma pipeline unificada que suporta deploy para **AWS** e **OCI** (Oracle Cloud Infrastructure).
**Localização**: `C:\dev\C:devrepos_mfe\mfe-user\azure-pipelines.yml`
**Branch**: `devops`
---
## Como Executar a Pipeline
### Opção 1: Push na branch devops
```bash
cd mfe-user
git checkout devops
# fazer alterações
git add .
git commit -m "sua mensagem"
git push origin devops
```
A pipeline dispara automaticamente.
### Opção 2: Executar manualmente
1. Acesse Azure DevOps → Pipelines
2. Selecione `mfe-user`
3. Clique em **Run pipeline**
4. Selecione branch `devops`
5. Escolha `cloudProvider`:
- `aws` → Deploy AWS S3
- `oci` → Deploy OCI Object Storage + API Gateway
- `both` → Ambos
---
## Fluxo da Pipeline
### Diagrama Completo
```
┌──────────────────────────────────────────────────────────────┐
│ TRIGGER: Push na branch 'devops' │
└──────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────┐
│ PARÂMETRO: cloudProvider │
│ ├── aws (padrão) │
│ ├── oci │
│ └── both │
└──────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────┐
│ STAGE 1: BUILD (sempre executa) │
│ ├── Node.js 20.x │
│ ├── npm ci │
│ ├── npm run build:dev │
│ └── Publica artefato 'dist' │
└──────────────────────────────────────────────────────────────┘
┌───────────────┴───────────────┐
▼ ▼
┌─────────────────────────┐ ┌─────────────────────────────┐
│ DEPLOY_AWS │ │ UPLOADTOOCI │
│ (se aws ou both) │ │ (se oci ou both) │
│ ├── Download artefato │ │ ├── Instala OCI CLI │
│ ├── Sync S3 │ │ ├── Cria bucket │
│ └── Purge Cloudflare │ │ └── Upload arquivos │
└─────────────────────────┘ └─────────────────────────────┘
┌─────────────────────────────┐
│ CREATEPAR │
│ ├── Deleta PAR antigo │
│ └── Cria novo PAR (1 ano) │
└─────────────────────────────┘
┌─────────────────────────────┐
│ DEPLOYTOAPIGATEWAY │
│ ├── Cria gateway │
│ └── Cria deployment │
└─────────────────────────────┘
```
---
## O que é Criado na OCI
### 1. Bucket (Object Storage)
| Propriedade | Valor |
|-------------|-------|
| Nome | `mfe-user-dev` |
| Namespace | `grbb7qzeuoag` |
| Compartment | Dev (`ocid1.compartment.oc1..aaaaaaaa76x3nykkjwvctpr6px34dysu3pbg7p62h2r65fegt7fvbrioll3a`) |
| Storage Tier | Standard |
### 2. Pre-Authenticated Request (PAR)
| Propriedade | Valor |
|-------------|-------|
| Nome | `mfe-user-dev-par` |
| Access Type | ObjectRead |
| Validade | 1 ano (31536000 segundos) |
O PAR permite que o API Gateway acesse os arquivos do bucket sem autenticação.
### 3. API Gateway
| Propriedade | Valor |
|-------------|-------|
| Nome | `mfe-user-gateway` |
| Endpoint Type | PUBLIC |
| Subnet | `sbn-lb-1` (`ocid1.subnet.oc1.sa-saopaulo-1.aaaaaaaa2ezw57uocis6s2eioypdsnt2p4pwm4fwnjz5jdaqigrm6jaqexeq`) |
| Compartment | Dev |
### 4. API Gateway Deployment
| Propriedade | Valor |
|-------------|-------|
| Nome | `mfe-user-deployment` |
| Path Prefix | `/` |
| Authentication | Anonymous |
| Rota | `/{req.*}` → GET → PAR URL |
---
## Resultado Final
### URL de Acesso
Após o deploy bem-sucedido, o MFE estará disponível em:
```
https://<gateway-ocid>.apigateway.sa-saopaulo-1.oci.customer-oci.com/
```
### Como Obter a URL
```bash
oci api-gateway gateway list \
--compartment-id "ocid1.compartment.oc1..aaaaaaaa76x3nykkjwvctpr6px34dysu3pbg7p62h2r65fegt7fvbrioll3a"
```
Ou verificar no console OCI:
1. Acesse OCI Console
2. Developer Services → API Gateway
3. Selecione `mfe-user-gateway`
4. Copie o **Hostname**
---
## Pré-requisitos (Variable Groups)
### aws-credentials-dev
| Variável | Descrição |
|----------|-----------|
| `AWS_ACCESS_KEY_ID` | Access Key AWS |
| `AWS_SECRET_ACCESS_KEY` | Secret Key AWS |
| `AWS_REGION` | Região (ex: us-east-1) |
| `CLOUDFLARE_ZONE_ID` | Zone ID Cloudflare |
| `CLOUDFLARE_API_TOKEN` | Token Cloudflare |
### oci-terraform
| Variável | Descrição | Valor Exemplo |
|----------|-----------|---------------|
| `OCI_TENANCY_OCID` | OCID da Tenancy | `ocid1.tenancy.oc1..xxx` |
| `OCI_USER_OCID` | OCID do Usuário | `ocid1.user.oc1..xxx` |
| `OCI_FINGERPRINT` | Fingerprint da chave | `xx:xx:xx:xx:...` |
| `OCI_PRIVATE_KEY_B64` | Chave privada (base64) | (secret) |
| `OCI_REGION` | Região OCI | `sa-saopaulo-1` |
| `COMPARTMENT_PARENT_OCID` | Compartment Dev | `ocid1.compartment.oc1..aaaaaaaa76x3nykkjwvctpr6px34dysu3pbg7p62h2r65fegt7fvbrioll3a` |
| `OCI_SUBNET_OCID` | Subnet para API Gateway | `ocid1.subnet.oc1.sa-saopaulo-1.aaaaaaaa2ezw57uocis6s2eioypdsnt2p4pwm4fwnjz5jdaqigrm6jaqexeq` |
### mfe-credentials
| Variável | Descrição |
|----------|-----------|
| (variáveis específicas do MFE) | |
---
## Comparação: AWS vs OCI
| Aspecto | AWS | OCI |
|---------|-----|-----|
| Armazenamento | S3 Bucket | Object Storage Bucket |
| CDN/Proxy | CloudFront (opcional) | API Gateway |
| Cache | Cloudflare | - |
| Autenticação | AWS Access Key | OCI API Key |
| URL Final | S3 URL ou CloudFront | API Gateway URL |
| Custo | ~$0.023/GB + requests | ~$0.0255/GB + API Gateway |
---
## Troubleshooting
### O que acontece se disparar a pipeline sem infraestrutura?
#### Recursos Criados Automaticamente
| Recurso | Se não existir | Comportamento |
|---------|----------------|---------------|
| Bucket | ✅ Pipeline cria | `oci os bucket create` funciona |
| PAR | ✅ Pipeline cria | Cria automaticamente |
| API Gateway | ✅ Pipeline cria | Funciona SE subnet existir |
| Deployment | ✅ Pipeline cria | Funciona SE gateway existir |
#### Recursos que DEVEM Existir
| Recurso | Obrigatório | Motivo |
|---------|-------------|--------|
| VCN | ✅ Sim | API Gateway precisa de rede |
| Subnet | ✅ Sim | API Gateway precisa de subnet |
| Variable `OCI_SUBNET_OCID` | ✅ Sim | Pipeline precisa saber qual subnet usar |
#### Fluxo de Execução sem Infraestrutura
```
┌─────────────┐
│ BUILD │ → ✅ Sempre funciona
└─────────────┘
┌─────────────┐
│ UPLOADTOOCI│ → ✅ Cria bucket automaticamente
│ │ (se não existir)
└─────────────┘
┌─────────────┐
│ CREATEPAR │ → ✅ Cria PAR automaticamente
└─────────────┘
┌─────────────┐
│ DEPLOY API │ → ❌ FALHA se:
│ GATEWAY │ • OCI_SUBNET_OCID não configurado
│ │ • Subnet não existe
│ │ • VCN não existe
└─────────────┘
```
#### Erros Comuns
| Erro | Causa | Solução |
|------|-------|---------|
| `Variable OCI_SUBNET_OCID not found` | Variável não configurada | Adicionar no Variable Group `oci-terraform` |
| `Subnet not found` | OCID inválido ou subnet não existe | Verificar OCID da subnet |
| `VCN not found` | VCN não existe | Criar VCN via Terraform |
| `NotAuthorizedOrNotFound` | Permissões insuficientes | Verificar políticas OCI |
#### Cenário: Disparar sem OCI_SUBNET_OCID
**Resultado**:
- ✅ Bucket `mfe-user-dev` será criado
- ✅ PAR será criado
- ❌ API Gateway falhará
- ❌ Deployment não será criado
**Como recuperar**:
1. Adicionar `OCI_SUBNET_OCID` no Variable Group
2. Reexecutar a pipeline
3. API Gateway será criado
#### Cenário: Subnet Não Existe
**Resultado**:
- ✅ Bucket criado
- ✅ PAR criado
- ❌ API Gateway falha com erro de subnet
**Como recuperar**:
1. Criar subnet via Terraform ou Console OCI
2. Atualizar `OCI_SUBNET_OCID` com novo OCID
3. Reexecutar pipeline
### Pipeline falha no Build
| Erro | Solução |
|------|---------|
| `npm ci` falha | Verificar `package-lock.json` |
| `npm run build:dev` falha | Verificar script no `package.json` |
| Artefato vazio | Verificar se `dist/` foi gerado |
### Pipeline falha no Upload OCI
| Erro | Solução |
|------|---------|
| `OCI_PRIVATE_KEY_B64` inválido | Regenerar chave e atualizar Variable Group |
| `Authentication failed` | Verificar fingerprint e user OCID |
| `Compartment not found` | Verificar `COMPARTMENT_PARENT_OCID` |
### Pipeline falha no API Gateway
| Erro | Solução |
|------|---------|
| `OCI_SUBNET_OCID` não configurado | Adicionar variável no Variable Group |
| `Subnet not found` | Verificar se subnet existe |
| `Quota exceeded` | Verificar limites da tenancy |
### MFE não carrega no navegador
| Erro | Solução |
|------|---------|
| 403 Forbidden | PAR expirou, reexecutar pipeline |
| 404 Not Found | Verificar rotas do deployment |
| Arquivos JS não carregam | Verificar Content-Type no bucket |
---
## Comandos Úteis
### Verificar recursos OCI
```bash
# Listar buckets
oci os bucket list --compartment-id "ocid1.compartment.oc1..aaaaaaaa76x3nykkjwvctpr6px34dysu3pbg7p62h2r65fegt7fvbrioll3a"
# Listar objetos no bucket
oci os object list --namespace-name "grbb7qzeuoag" --bucket-name "mfe-user-dev"
# Listar API Gateways
oci api-gateway gateway list --compartment-id "ocid1.compartment.oc1..aaaaaaaa76x3nykkjwvctpr6px34dysu3pbg7p62h2r65fegt7fvbrioll3a"
# Ver deployment
oci api-gateway deployment list --gateway-id "<gateway-id>"
# Listar PARs
oci os preauth-request list --namespace-name "grbb7qzeuoag" --bucket-name "mfe-user-dev"
```
### Deletar recursos (se necessário)
```bash
# Deletar PAR
oci os preauth-request delete --namespace-name "grbb7qzeuoag" --bucket-name "mfe-user-dev" --par-id "<par-id>"
# Deletar bucket (vazio)
oci os bucket delete --namespace-name "grbb7qzeuoag" --bucket-name "mfe-user-dev"
# Deletar deployment
oci api-gateway deployment delete --deployment-id "<deployment-id>"
# Deletar gateway
oci api-gateway gateway delete --gateway-id "<gateway-id>"
```
---
## Referências
- [OCI-MFE-TASKS.md](./OCI-MFE-TASKS.md) - Checklist de atividades
- [OCI-MFE-STEPBYSTEP.md](./OCI-MFE-STEPBYSTEP.md) - Passo a passo
- [OCI-API-GATEWAY.md](./OCI-API-GATEWAY.md) - Configuração API Gateway
- [Oracle Documentation](https://docs.oracle.com/en/learn/oci-api-gateway-web-hosting/index.html)