feat(plataforma): a etapa MANIFESTOS_GERADOS ganha o molde e a copia de trabalho

Era a primeira etapa do provisionamento e a unica bloqueada por algo MEU, nao
por credencial do dono: o pod nao enxergava o molde nem o repositorio GitOps, e
as tres propriedades ficavam vazias. Falhar fechado, nomeando a propriedade, era
o comportamento certo — o que faltava era o material chegar.

Um initContainer clona o repositorio em /gitops na subida. Dentro dele,
moldes/consolidado e o molde e tenants/<nome> e onde a etapa escreve: UM volume
serve aos dois, e por isso o molde foi para o repositorio GitOps no commit
anterior.

Tres decisoes que valem registro:

- CLONE ANONIMO. O Gitea aceita leitura sem credencial neste repositorio, e
  leitura e tudo o que a etapa 1 precisa. Empurrar e a etapa ARGO_SINCRONIZADO,
  que depende de credencial e continua bloqueada — esta mudanca nao a destrava e
  nao tenta;
- emptyDir, e nao PVC. A copia e descartavel por desenho: se o pod morrer no
  meio de um provisionamento, o que ficou pela metade some junto. Melhor do que
  um clone velho e divergente sobrevivendo entre reinicios;
- a imagem e a do act_runner, que JA esta no no e tem git 2.45.2. Nao ha
  registry aqui, entao construir uma imagem so para ter git custaria mais do que
  reusar esta.

O endereco e o interno (gitea-http.gitea.svc:3000), o mesmo do ApplicationSet.
Depende do 19-netpol-gitea.yaml do commit anterior.
This commit is contained in:
deploy
2026-09-22 22:10:39 +00:00
parent efc9d35f94
commit 6ca712c619
@@ -32,11 +32,49 @@ spec:
# Com a `default`, a permissao de ler e escalar Deployment dos tenants
# valeria para qualquer pod que subisse sem `serviceAccountName`.
serviceAccountName: atm-provisionamento
volumes:
- { name: gitops, emptyDir: {} }
# P5.3 — a copia de trabalho do GitOps, refeita a cada subida do pod.
#
# CLONE RASO E ANONIMO. O Gitea aceita leitura sem credencial neste
# repositorio (conferido em 2026-09-22), e leitura e tudo o que a etapa 1
# precisa: ela RENDERIZA o molde para `tenants/<nome>`. Empurrar e a etapa
# ARGO_SINCRONIZADO, que depende de credencial e continua bloqueada.
#
# `emptyDir`, e nao PVC: a copia e descartavel por desenho. Se o pod morrer
# no meio de um provisionamento, o que ficou pela metade some junto — e isso
# e melhor do que um clone velho e divergente sobrevivendo entre reinicios.
#
# A imagem e a do `act_runner`, que JA esta no no e tem git 2.45.2. Nao ha
# registry aqui (`imagePullPolicy: Never`), entao construir uma imagem so
# para ter git custaria mais do que reusar esta.
#
# O endereco e o INTERNO, o mesmo que o ApplicationSet do ArgoCD usa — o
# externo passa por Ingress e TLS, e nao ha motivo para sair do cluster
# para buscar o que esta dentro dele. Depende do `19-netpol-gitea.yaml`.
initContainers:
- name: clonar-gitops
image: docker.io/gitea/act_runner:0.2.11
imagePullPolicy: Never
command: ["/bin/sh", "-c"]
args:
- |
set -e
git clone --depth 1 http://gitea-http.gitea.svc:3000/atmadmin/athletic-map-deploy.git /gitops
test -d /gitops/moldes/consolidado || { echo "molde ausente no clone"; exit 1; }
echo "clone pronto: $(ls /gitops/moldes/consolidado | wc -l) arquivo(s) de molde"
volumeMounts:
- { name: gitops, mountPath: /gitops }
resources:
requests: { cpu: 10m, memory: 32Mi }
limits: { cpu: 200m, memory: 128Mi }
containers:
- name: servico-captacao
image: docker.io/library/servico-captacao:1.5-realm
imagePullPolicy: Never
ports: [{ containerPort: 8083 }]
volumeMounts:
- { name: gitops, mountPath: /gitops }
env:
- { name: SPRING_DATASOURCE_URL, value: "jdbc:postgresql://postgres:5432/athleticmap?sslmode=require" }
- { name: SPRING_DATASOURCE_USERNAME, value: "atm" }
@@ -81,6 +119,18 @@ spec:
# Depende do `18-netpol-sealed-secrets.yaml`: sem ele a conexao
# nao sai (o ipBlock da deny-cross-tenant nao vale depois do DNAT).
- { name: PROVISIONAMENTO_CERT_SELAGEM, value: "http://sealed-secrets-controller.kube-system:8080/v1/cert.pem" }
# P5.3 — a copia de trabalho do GitOps e o molde, no MESMO volume.
#
# O initContainer clona o repositorio em /gitops na subida; dentro
# dele, `moldes/consolidado` e o molde e `tenants/<nome>` e onde a
# etapa escreve. Um volume serve aos dois.
#
# Vazio falhava FECHADO, nomeando a propriedade — era o estado ate
# 2026-09-22. Escrever num diretorio temporario que ninguem commita
# daria a impressao de que a etapa funcionou.
- { name: PROVISIONAMENTO_GITOPS, value: "/gitops" }
- { name: PROVISIONAMENTO_MOLDE, value: "/gitops/moldes/consolidado" }
- { name: PROVISIONAMENTO_PLANO_PADRAO, value: "bronze" }
- { name: CAPTACAO_LIMITE_POR_IP, value: "5" }
# Destino do aviso ao comercial. Vazio = lead e gravado e o
# aviso vira log sem PII. Preencher quando houver SMTP.