0011 — int-pied native-ready (GraalVM); imagem/deploy na fábrica¶
Status: Aprovado · Responsável: Gustavo Madruga · Atualizado em: 2026-09-11 · Decidido em: 2026-08-23
Contexto¶
A constituição fixa GraalVM native-image como o alvo de deploy do server Micronaut
elegível (RD central 0022): RSS ~3× menor, imagem
menor, boot rápido, e — sobretudo — o build sai do host de produção (o build-spike do
shadowJar/native na VM do Coolify foi gatilho de freeze). O int-pied é elegível: server
Micronaut sem Apache POI (a lib hostil ao native), então não cai na exceção JVM.
Faltava torná-lo native-ready. Este trabalho habilita o build native e prova que compila, sem trocar o deploy.
Decisão¶
O int-pied é native-ready: ./gradlew nativeCompile compila. A imagem native e o
deploy ficam para a fábrica de imagens (central 0003) — este repo não os faz.
- Perfil GraalVM CE no
build.gradle.kts(configure<GraalVMExtension>):-Os(prod) /-Ob(-PnativeQuick, loop) +--gc=serial,baseName=app. CE 25 não tem G1/PGO/build-report;-O3==-O2. docs/app.jsonmarcanative: true— discriminador que o gate do CI e o e2e native leem.- Gate no repo do app =
nativeCompilecompilar (0022 §Gate). Runtime/boot/e2e native ficam num repo de e2e separado; a imagem é buildada na fábrica (0003), fora daqui. - Sentry native-safe:
SentryInitializer.inicializar()nomain(SDK sobe antes do contexto) + reflect-config doSentryAppenderemMETA-INF/native-image/(o Joran o instancia por reflexão — o único hint manual recorrente da casa). Demais gaps (jackson-databind, OkHttp,@Scheduled) foram resolvidos sozinhos pelo reachability-metadata do native-build-tools + serde build-time — zero hint extra. IntegradorClientdeixou OkHttp e passou a falar peloHttpClientdo Micronaut (build-time, native-limpo), alinhando o transporte app↔app da casa (central 0020).
Consequências¶
Revisão (2026-09-09) — o native saiu do "compila" e virou alvo de deploy, aqui no repo. A primeira consequência abaixo ("não há
Dockerfile.nativeneste repo") não vale mais: o repo ganhou oDockerfile.native— par hermético doDockerfileJVM — edocs/app.jsondeclarabuild.targets: [jar, native]. O CI (.github/workflows/pipeline.yml) tem o jobbuild_native(GraalVM, ~13min,mode=mine sem cache-dance —mode=maxjá travou oexporting to imagee estourou o timeout), publica:native-amd64e deploya jar e native lado a lado no mesmo banco (targets resolvidos por nome no control-plane, sem uuid nem ponte SSH — central 0026). Há ainda um gate de paridadeDockerfile×Dockerfile.nativenos dirs app-writable sob/app, para os dois não divergirem em silêncio.O que não mudou: o perfil GraalVM (
-Os/-Ob,--gc=serial,baseName=app), o hint manual doSentryAppender, e oIntegradorClientnoHttpClientdo Micronaut.Revisão (2026-09-11) — o hint do
SentryAppendersaiu deste repo. Axadm-comum-web0.9.1 embarcaMETA-INF/native-image/br.com.xadm/xadm-comum-web/reflect-config.jsoncom as três entradas que o logback exige no native:SentryAppendereSentryOptionscom construtor e métodos públicos, ech.qos.logback.classic.Level.valueOf(String). A cópia local registrava só o appender — com ela,<options>e<minimumEventLevel>eram ignorados em silêncio e o evento do native chegava ao GlitchTip semenvironment(o DSN sobrevivia porque o SDK o lê da env). O repo subiu para a 0.9.1 e apagou oreflect-config.jsonlocal no mesmo commit, como manda o §Migração da lib. A prova no binário (evento de teste com oenvironmentcerto) é do e2e native.
- O
DockerfileJVM continua sendo o deploy (0022 §Topologia — durante a migração o repo mantém a cara JVM). Não háDockerfile.nativeneste repo; a receitadockerfile-java-nativevive/roda na fábrica. (Superado — ver a revisão acima.) - Build native local usou Oracle GraalVM (o
native-imageda máquina do dev) como proxy — o gate autoritativo é a fábrica em CE. O perfil (-Os/-Ob,--gc=serial) roda nos dois. micronaut-http-clientvirouimplementation. OkHttp permanece só para PIED e Resend (terceiros externos) — decisão consciente, não dívida.- Conflito casa×repo declarado: [0020] pede
@Clientdeclarativo, mas a integração nasce desligada (INTEGRADOR_BASE_URLvazio) e o app tem de bootar assim — um@Client(id)resolveria a URL no startup e a vazia arriscaria o boot. EscolhidoHttpClientlow-level (URL absoluta por chamada, guarda o vazio antes do request): tira OkHttp sem quebrar o disabled-by-default.
Pendências declaradas (§1.6 / REGRA Nº 3)¶
- Reflect-config do
SentryAppenderdeve subir para axadm-comum-web(dona doSentryInitializer), via reachability-metadata da lib — hoje é cópia local byte-idêntica à debi-transporte-xls/central-backend/webstorm-ecom. Enquanto não sobe, fica aqui. (Resolvida em 2026-09-11 — subiu naxadm-comum-web0.9.1; ver a revisão acima.) - Imagem native + deploy Coolify + rollout/rollback + e2e ponta-a-ponta = trabalho posterior (fábrica + repo de e2e), fora deste escopo.
Alternativas descartadas¶
- Buildar a imagem native no repo do app (
dockerBuildNative, plugin). Contraria 0022 §Topologia (o native builda na fábrica; a wolfi-base do plugin nem trazcurl, quebrando o HEALTHCHECK §5). Native aqui é sónativeCompileprovando compilação. - Manter OkHttp no
IntegradorClient. Compila em native (reachability-metadata), mas diverge do transporte app↔app da casa (0020). Trocado.