perf(ci): reduzir build de 17m para ~6m com clone raso, caches e paralelismo - #22
Merged
Merged
Conversation
O workflow disparava em push (sem filtro de branch) e em pull_request, entao um push de branch com PR aberto rodava a pipeline inteira duas vezes para o mesmo commit, serializadas pelo grupo de concorrencia e custando ~4m49s cada. Com o filtro, o main continua validado e publicando a imagem no push, e as branches de feature passam a rodar uma vez, via pull_request (que ja dispara a cada novo push do PR). Efeito colateral: commits de branch deixam de publicar tag sha-<commit> no GHCR; apenas o que chega ao main publica.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Por que
A pipeline levava 17m01s para um app pequeno. A causa era o
git clone https://github.com/vlang/vc.git: um repo de 1,83 GB (versiona ov.cgerado, 10,7 MB, a cada commit) clonado duas vezes por run (no runner e dentro da imagem), respondendo por 51% da pipeline (525s de 1021s). Do repo inteiro so 3 arquivos sao usados:v.c,v_win.ceREADME.md.O que mudou
Dockerfile+ workflow):fetch --depth 1 origin <sha>no lugar do clone completo. Pins e assercoesgit rev-parse HEADidenticos.actions/cachede/tmp/v, chave por pin): so recompila quando o pin muda.type=gha,mode=max): reaproveitaapk+ toolchain V musl entre runs.docker buildx buildroda em primeiro plano, num passo unico comwaitnas duas no final.pushrestrito amain. Antes, um push de branch com PR aberto disparava os dois eventos (pushepull_request) para o mesmo commit, rodando a pipeline inteira duas vezes.O gate de publicacao continua preservado (a espera acontece antes do
Publicar tag imutavel) e nenhum pin do toolchain muda.Resultado
Dois runs reais depois das mudancas:
Os dois passaram, com
5 passednos testes V e 4/4 contratos. A variacao de 207s a 272s na compilacao e do runner (mesmo codigo, mesmas flags), entao o ganho confiavel e estrutural: bootstrap de 340s para 39-47s e uma execucao por push em vez de duas.Ponto de atencao
Mudanca de comportamento: commits de branch deixam de publicar tag no GHCR. Agora publica o que entra no
main, ou seja a tag passou a sersha-<merge commit>e nao maissha-<commit do branch>. Nodeploy-production.yml, use o SHA do commit nomain. Se o fluxo de subir um commit de PR no A/B antes do merge for necessario, este item precisa ser revertido.O cache de layers do buildx deu miss no run de PR, o que e esperado e nao indica ma configuracao: o cache do GHA e escopado por ref, entao
refs/pull/N/mergenao le o que um push de branch escreveu. O ganho vem na direcaomainpara PR (cache criado nomainfica disponivel para os PRs, e nao o contrario). Como omainainda nao rodou com esse cache, o primeiro PR sempre paga o custo cheio.Fora do escopo: o workflow testa com V
ee3ef57e oDockerfilepublica comcf7a81e, ou seja, os testes validam um compilador diferente do que gera o binario. Nao alterei isso aqui.