Pular para conteúdo

Runtime env (INT_*) — fail-safe

Problema que isto resolve

O Angular em produção lê window.env de um script gerado no boot a partir de ECOSIF_*INT_*envsubst em env.prod.js.

Se o nginx/CDN cachear /assets/env.js como asset estático (expires 1y / immutable), o browser pode ficar com um valor antigo (ex.: hideAdminMenu=true) enquanto a task ECS e o config.json / runtime-flags.json já mostram false.

Query string (?v=) não basta se o gateway/CDN indexar só pelo path e ignorar a query — o corpo antigo de /assets/env.js continua a ser servido.

Fluxo canónico

ECOSIF_* (task / compose)
  → ecosif-env-map.sh (INT_*)
  → envsubst(config.template.json) → config.json
  → envsubst(env.prod.js) → assets/env.js (canónico)
  → force booleans INT_* → env.js
  → asserts fail-fast (placeholders + booleans INT_* ↔ ficheiros)
  → runtime-flags.json + system-env.json (SHOWVARS+DEBUG)
  → copia → assets/env-runtime-<versao>-<UTC>.js  (path ÚNICO por boot)
  → index.html: <script src="assets/env-runtime-…js">
  → nginx ^~ /assets/env* com Cache-Control: no-store
  → browser: window.env / AppConfig

Garantias no boot (contentor não sobe se falhar)

  1. Templates env.prod.js e config.template.json ainda contêm ${INT_*} obrigatórios (detecta imagem “assada”).
  2. Após envsubst, não restam ${.
  3. Literais booleanos em env.js e config.json iguais aos INT_* (hideAdminMenu, showVars, debug, auth flags, …).
  4. config.features.hideAdminMenu espelha env.js hideAdminMenu.
  5. index.html carrega env-runtime-<versao>-<boot>.js (path novo a cada boot → CDN não reutiliza /assets/env.js antigo).
  6. Menu admin no layout prefere config.json (AppConfig.isAdminMenuHidden) com fallback a window.env.

Como conferir se a imagem nova subiu (sem shell no contentor)

O tag Itaú (ecosif-webapp-dev:v0.1.0-<hash>) é alias interno; o hash não é o SHA do repo ds-ecosif-angular. Use estes sinais:

  1. View Source / Network do HTML (/):
  2. Cache-Control: no-store… em index.html
  3. <script src="assets/env-runtime-…js"> (não assets/env.js sozinho nem só ?v=)
  4. Network desse env-runtime-…js:
  5. Cache-Control: no-store…
  6. linha hideAdminMenu com "false" quando a task tem ECOSIF_ANGULAR_HIDE_ADMIN_MENU=false
  7. Abrir /assets/config/runtime-flags.json (404 = imagem sem o fail-safe):
  8. flags.hideAdminMenu, source: env.js
  9. Overlay SHOWVARS: INT_HIDE_ADMIN_MENU=false e runtime_served.hideAdminMenu=false
  10. Se o script ainda for assets/env.js sem env-runtime- → build/deploy não inclui o entrypoint novo.

Checklist pós-deploy

  1. Publicar imagem Angular com este código + bump ECOSIF_VERSION / appVersion visível.
  2. Purge CDN/gateway de /, /index.html, /assets/env.js se existir cache à frente (opcional após fingerprint).
  3. Uma vez: hard refresh ou janela anónima.
  4. Login ADMIN + menu Ferramentas Administrativas visível.

Variável

Sistema Interna Efeito
ECOSIF_ANGULAR_HIDE_ADMIN_MENU INT_HIDE_ADMIN_MENU window.env.hideAdminMenu, config.features.hideAdminMenu, menu admin

Testes locais dos asserts

sh conf/scripts/tests/test-ecosif-env-assert.sh