Como rodar localmente¶
Status: Aprovado · Responsável: Gustavo Madruga · Atualizado em: 2026-09-14
Build e testes estão em Como buildar e testar; a organização do código, no guia do código.
Pré-requisitos¶
- JDK 25 no
JAVA_HOME(GraalVM 25, para quem vai compilar o native). O Gradle roda na JVM do ambiente e o plugin Micronaut 5 só configura numa JVM 25. A versão é a dodocs/app.json(toolchain.java), a mesma da CI. - Docker rodando: o Postgres de dev sobe em container, e os testes usam Testcontainers.
- Build pelo wrapper (
./gradlew; no Windows,.\gradlew.bat) — nunca Maven.
Subir o app¶
No Windows, o run-dev.bat da raiz faz tudo:
run-dev.bat
Ele escolhe portas livres (Postgres entre 6543 e 6699, HTTP entre 8080 e 8179), sobe só o serviço
postgres do docker-compose.dev.yml, exporta as variáveis de dev e roda gradlew run --continuous.
Na subida, imprime a URL do servidor, o banco e o Bearer de dev.
Fora do Windows, o mesmo à mão:
docker compose -f docker-compose.dev.yml up -d --wait postgres
export MICRONAUT_ENVIRONMENTS=dev
export DATASOURCES_DEFAULT_URL='jdbc:postgresql://localhost:5432/db_onpetro?reWriteBatchedInserts=false'
export DATASOURCES_DEFAULT_USERNAME=user_onpetro
export DATASOURCES_DEFAULT_PASSWORD=dev123
export BI_COMERCIAL_XLS_API_TOKEN=dev-token-apenas-local
export S3_FILE_STORAGE=PSQL # sem Garage local; ver a seção abaixo
./gradlew run
O reWriteBatchedInserts=false fica na URL: com a flag ligada, a métrica linhas_efetivas se perde
(decisão 0009). Sem as variáveis AUTH_*, no
ambiente dev as views ficam abertas; o login Google está no runbook do login.
Sem TELEGRAM_BOT_TOKEN/TELEGRAM_CHAT_ID, as notificações ficam desligadas.
| Caminho | O quê |
|---|---|
/health |
liveness, com a versão |
/processamentos |
acompanhamento dos arquivos recebidos |
/swagger-ui |
contrato da API REST |
O envio de planilhas é o POST /api/xls/processar com o Bearer de dev, descrito no
contrato da API.
Object storage local (Garage)¶
O modo padrão do storage é PSQL_GARAGE, que grava o .xlsx também no Garage: sem Garage no ar, o
upload responde 503. Para rodar sem ele, exporte S3_FILE_STORAGE=PSQL (o run-dev.bat não exporta).
Para rodar com ele, suba o serviço garage e faça uma vez o init de cluster, key e bucket pela CLI do
Garage (a imagem não tem shell para um init automático):
docker compose -f docker-compose.dev.yml up -d garage
C="docker compose -f docker-compose.dev.yml exec garage /garage"
$C status # anote o ID do nó
$C layout assign <ID_DO_NO> -z local -c 1G && $C layout apply --version 1
$C key import --yes -n onpetro GK0123456789abcdef01234567 \
0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
$C key allow onpetro --create-bucket
$C bucket create onpetro
$C bucket allow onpetro --key onpetro --read --write --owner
A key é a de dev que o run-dev.bat exporta em GARAGE_ACCESS_KEY_ID/GARAGE_SECRET_ACCESS_KEY; fora
dele, exporte as duas antes do ./gradlew run. Os modos estão na
decisão 0005.
Rodar a imagem native¶
docker build -f Dockerfile.native -t onpetro-xls:native-local .
É o mesmo Dockerfile.native que a CI builda e publica. Para o loop rápido só do binário, sem imagem:
./gradlew nativeCompile -PnativeQuick com a GraalVM 25 no JAVA_HOME — o -PnativeQuick troca o
-Os de produção pelo -Ob, que compila mais rápido. O binário sai em
build/native/nativeCompile/application.
Testar uma lib da casa antes do release¶
A versão da xadm-commons que ainda não saiu no registro vem do seu ~/.m2: a lib sobe o número e
publica com publishToMavenLocal, e este app declara o número novo no build.gradle.kts. O bloco de
repositórios já traz o mavenLocal() depois do registro e filtrado para br.com.xadm, então versão
publicada sempre sai do registro e o local só preenche o número que ainda não saiu.
A CI builda num runner sem ~/.m2: fica vermelha até a lib sair no registro, e a /xadm-release recusa
dependência da casa fora dele. Com o registro fora do ar o Gradle não cai no local; use
./gradlew --offline. Regra em Bibliotecas da casa.