Repository navigation
ci: CD da Buzzlabs — build da imagem e bump no Infra a cada commit na develop - #19
Conversation
… develop Workflow novo (não mexe em nenhum workflow upstream, para não atrapalhar merge/rebase com o element-web original). Roda nos runners efêmeros do ARC no k3d do Hetzner, builda apps/web/Dockerfile, empurra docker.buzzlabs.com.br/element-grupos:<AAAAMMDD-HHMMSS-sha7> e commita o bump da tag na main do repo Infra — o deploy em si é do ArgoCD (app matrix-buzzlabs / chat.buzzlabs.com.br). O HEAD é destacado antes do build: o scripts/docker-link-repos.sh linka o js-sdk `develop` quando o HEAD está numa branch com esse nome, e isso quebra o build pelo pin do pnpm. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- token da GitHub App escopado com permission-contents: write (era o único erro; sem isso o token herda todas as permissões da instalação) - secrets/vars/outputs saem do `run:` e passam por `env:` (template-injection) - persist-credentials: false no checkout do Infra; o push passa o token explicitamente (artipacked) - cancel-in-progress: false explícito (concurrency-limits) - comentário do pin do actions/checkout corrigido: aquele SHA é v6.0.3, não v6 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
🟡 Changes recommended
Manual dispatch is not restricted to trusted develop, and concurrency can drop pending commits.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
Automates Buzzlabs CD from develop, building and publishing the Element image and updating the Infra deployment.
Changes:
- Adds timestamp/SHA image tagging with registry caching.
- Authenticates and updates the Infra repository via GitHub App.
- Adds serialized deployment updates with retry logic.
File summaries
| File | Description | Findings |
|---|---|---|
.github/workflows/buzzlabs-cd.yaml |
New Buzzlabs build, publish, and Infra bump workflow. | Critical (3 votes): Manual dispatch can deploy arbitrary branches. Moderate (2 votes): Concurrency can drop pending commits. |
Review details
- Files reviewed: 1/1 changed files
- Comments generated: 2
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| build-and-deploy: | ||
| name: Build, push e bump no Infra | ||
| runs-on: buzzlabs |
There was a problem hiding this comment.
Procedente, e era pior do que parece: a descrição deste PR sugeria usar o workflow_dispatch para testar o primeiro run — o que teria deployado a branch de teste em chat.buzzlabs.com.br.
Adicionado if: github.ref == 'refs/heads/develop' no job. O dispatch continua existindo (serve para repetir um deploy sem commit novo), mas de qualquer outra ref o job aparece como pulado em vez de deployar.
| concurrency: | ||
| # Serializa: dois bumps concorrentes na main do Infra dariam corrida de push. | ||
| group: buzzlabs-cd | ||
| # Um build cancelado no meio do push deixaria imagem publicada sem bump. | ||
| cancel-in-progress: false |
There was a problem hiding this comment.
A descrição do comportamento está certa e meu comentário no arquivo estava errado — dizia "serializa", que não é o que o GitHub faz.
Fiquei com a segunda opção que você sugere (deixar explícito que é latest-commit-only), não com a fila FIFO: para um CD que publica a ponta da develop, buildar e deployar commits intermediários já superados é trabalho jogado fora num runner que é o de menor prioridade do cluster, e ainda faria o ArgoCD passar por versões intermediárias. Coalescing é o comportamento desejado; o que não pode é cancelar um run em andamento, senão sobra imagem publicada sem o bump — daí o cancel-in-progress: false continuar.
Comentário reescrito dizendo isso, inclusive que quem quiser a imagem de um commit intermediário precisa buildar à mão.
- `if: github.ref == 'refs/heads/develop'` no job. O workflow_dispatch aceita qualquer ref, então um run manual a partir de uma branch de feature buildaria aquele código e o deployaria em chat.buzzlabs.com.br. - o comentário do concurrency dizia "serializa", o que não é verdade: o GitHub guarda um run pendente por grupo e descarta o anterior. O comportamento real é coalescing para o commit mais novo — que é o desejado num CD — e agora está escrito assim. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Fecha o ciclo que hoje é manual: build da imagem à mão →
docker push→ editar a tag no repo Infra.Par deste PR: Buzzlabs/Infra#69 (documentação do fluxo do lado da infra).
O fluxo
O runner não fala com o apiserver — quem deploya é o ArgoCD, lendo o repo Infra. Rollback = revert do commit de deploy lá.
Só o
matrix-buzzlabsé bumpado. O element do nexojornal (comunidades.nexojornal.com.br, nsdefault) segue com bump manual: é produção de cliente e temignoreDifferencesdeimageno Application.Decisões
cd.yaml/docker.yaml. Aqueles são upstream e mexer neles cria conflito em todo merge do element-web original.buzzlabs-cd.yamlé só nosso.git checkout --detachantes do build. Oscripts/docker-link-repos.shfazUSE_CUSTOM_SDKS=true+JS_SDK_BRANCH=developquandogit rev-parse --abbrev-ref HEADdevolvedevelop— e oactions/checkoutcria exatamente essa branch local num push. O js-sdkdevelopquebra o build pelo pin do pnpm; era por isso que a build manual era feita a partir de uma branchimage-build(ver o plano2026-07-24-jitsi-jwt-minterno repo Infra). Com HEAD destacado o atalho não dispara e o.gitcontinua disponível para o bind mount do Dockerfile.concurrency: buzzlabs-cdcomcancel-in-progress: false. Dois jobs concorrentes disputariam o push na main do Infra, e cancelar um no meio publicaria imagem sem o bump correspondente. Runs pendentes coalescem para o commit mais novo (comportamento do GitHub, e o desejado aqui — ver a discussão com o Copilot); o push tem retry compull --rebasepara o caso de outra automação commitar junto.refs/heads/develop. Oworkflow_dispatchaceita qualquer ref; sem a guarda, um run manual de uma branch de feature deployaria aquele código emchat.buzzlabs.com.br.<data>-<hora>-<sha7>e commitdeploy(element): <tag>, iguais ao que oclock-buzzjá usa no Infra.lint:workflows).Antes de mergear
O workflow usa os mesmos segredos do
arc-canary.ymldo repo Infra:vars.BUZZLABS_REGISTRY_USER,secrets.BUZZLABS_REGISTRY_PASSWORD,vars.BUZZLABS_APP_ID,secrets.BUZZLABS_APP_PRIVATE_KEY. Eles são de organização — vale conferir se oelement-webestá na lista de repositórios com acesso (não consegui ler isso com meu token) e se a GitHub Appbuzzlabs-appestá instalada noInfracom permissão de escrita em conteúdo.O primeiro run é o teste de verdade: o build do Element é mais pesado que qualquer coisa que já rodou nesses runners (limite de 2 CPU / 8Gi no container do runner). Se der OOM ou estourar tempo, o caminho é subir o teto do scale set. Dá para disparar por
workflow_dispatchsem esperar um commit — a partir dadevelop, que é a única ref que o job aceita.Vale registrar: o build da imagem (
apps/web/Dockerfile) está verde, mas adeveloptem CI vermelho em lint/tipos/testes de código, anterior a este PR. Este workflow não tem portão de qualidade na frente — publica o que estiver na ponta dadevelop. Pôr umneeds:num job de lint só faz sentido depois que essa dívida for paga, senão trava todo deploy.🤖 Generated with Claude Code