Pular para conteúdo

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 do docs/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.