fix(ci): cache de build com teto em todo job que builda imagem [INFRA-69215] #99
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/INFRA-69215-cache-buildkit"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
O que
Todo job de
.forgejo/workflowsque builda imagem passa a terminar com o passoLimpar cache de build (teto)(
if: always(),continue-on-error: true,timeout-minutes: 10):Jobs que ganharam a limpeza:
build-ci-images.yml:build-python-ci,build-node-ci,build-docker-ci,build-nginx-base,build-trivy-ci,build-php-ci,build-android-ci,build-deploy-ci(docker build→--builder default);reusable-image-cve-os.yml:cve-os(docker buildx build→ o builder corrente, capturado antes do build emCVE_OS_BUILDER);install-docker.yml:install(cria obuildkit-builder→--builder buildkit-builder).O
buildkit-builderdoinstall-dockeragora nasce com--buildkitd-configcom gc ligada e teto.Por quê
O disco raiz do host tmf-prod (onde roda o runner) lotou; o principal escritor é o cache de build do runner
(buildkit/containerd), INFRA-69105. Nenhum job removia cache: o
cve-ossó faziadocker rmida tag, os 8 jobs dobuild-ci-imagesnada, e obuildkit-builderera criado sem gc e nunca removido.Achados
docker build,buildx build/bake,compose build,build-push-action,buildx createem.forgejo/workflows: só os 10 jobs acima.release.ymlnão builda imagem no runner (deploy por SSH no host de destino).default(driver docker): o cache fica no daemon do host. O builder doinstall-dockervale só dentro daquele job container (metadado do buildx), mas o container
buildx_buildkit_buildkit-builder0e o volumede estado ficam no host.
moby/buildkit:buildx-stable-1do Docker Hub (fora do nosso registry). Nãomexi aqui (fora do escopo); vale issue de soberania para pinar
--driver-opt image=num espelho emtmf/mirror.Flags (versão medida)
docker run --rm --entrypoint docker <registry>/tmf/ci-images/tmf-ci-docker:29.7.1-20261009-2e51884 buildx version→
github.com/docker/buildx v0.36.0. Obuildx prune --helplista--max-used-space,--min-free-space,--reserved-space;--keep-storagesumiu do help e, usado, imprimeFlag --keep-storage has been deprecated, keep-storage flag has been changed to reserved-space(é piso, não teto).Por isso o teto é
--max-used-space.docker builder prunena CLI 29 é o mesmo comando (--builderpadrãodefault).Teto escolhido: 10 GB
Padrão
10gb, configurável: inputbuild_cache_max_used_space(reusáveis) eenv.BUILD_CACHE_MAX_USED_SPACE(
build-ci-images.yml). Comuntil=24h, só sai cache sem uso há 24h, e só enquanto o total passar do teto: o cachequente dos builds do dia fica. 10 GB cabe o cache quente de vários produtos (cada build de produto deixa poucos GB) e é ~1%
do disco de 1 TB; hoje o cache do builder default desta máquina de dev já soma 32 GB, ordem de grandeza do que se acumula
sem limpeza.
gc do
buildkit-builderConfig gerado no job (chaves do buildkit ≥ 0.17, sem
gckeepstorage/keepBytesdepreciadas):O config só vale na criação do container do builder. Um
buildkit-builderque já existe no host sem gc segue semgc: o job detecta (sem regra
Keep Duration: 24h0m0snobuildx inspect) e emite::warning::, e o prune do último passosegura o teto. Não recrio à força:
buildx rmderruba build concorrente que esteja usando o builder. Para ligar a gcnele, o operador roda
docker buildx rm buildkit-builderfora do horário e o próximo job recria.Validação
until=876000h+ teto100tb, nada elegível):--max-used-spacerc=0Total: 0B; sem--builderrc=0;--keep-storagerc=0 com o aviso de depreciação;--builder nao-existerc=1 (por isso o|| ::warning::).docker buildx duigual antes e depois (32.54GB).moby/buildkit:v0.33.1descartável com o toml →GC Policy rule#0: Keep duration 24h0m0s, Maximum used space 10.73GB; rule#1: All true, 10.73GB, sem aviso de chave depreciada.infra69215-teste, imagem buildkit local, removido no fim):buildx create --driver docker-container --buildkitd-config+inspect --bootstrapmostra as 2 regras; o prune do passo nele rc=0;nenhum container sobrou.
tests/cache-build/(17 testes): todo job com build tem a limpeza como último passo, no builder certo; nenhumsystem prune -a/volume prune/image prune -a/--keep-storage; install-docker cria com gc; controle negativo(job sintético sem limpeza, limpeza no meio, builder errado) reprova; o
run:real do passo, comdockerfalso quefalha, sai 0 com
::warning::.tests/*verdes (generate-docsprecisa depythonno PATH; aqui rodou com um link para python3).Não verificado
--max-used-space; medido no engine 29.8.1 local (API 1.56).🤖 Generated with Claude Code
https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2