fix(imagens): a imagem de voz também declara a versão depois do pnpm install (#1569)

O PR corrigiu app, worker e scheduler, mas o workflow publica QUATRO
imagens: o Dockerfile.voice-agent ainda declarava ARG/ENV APP_VERSION
antes do `pnpm install`, e refazia a instalação inteira a cada release.

- Dockerfile.voice-agent: ARG/ENV APP_VERSION descem para depois de
  `COPY . .`, no mesmo padrão do Dockerfile.worker do PR.
- Teste de packaging: nenhum `RUN` pode vir depois de `ARG APP_VERSION`
  nos quatro Dockerfiles publicados. Sabotado: com o voice-agent do head
  do PR, reprova citando Dockerfile.voice-agent.
- Fragmento: "três imagens" passa a "quatro", o agente de voz entra na
  frase do pnpm install, e o crédito segue o formato dos demais
  ("Contribuição de @bonito-system (#1569).").

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N9fyW7pXJCsyDPtu5PoQpN
This commit is contained in:
melgarafael
2026-09-24 01:57:35 -03:00
co-authored by Claude Opus 5.5
parent 61c4b46dd2
commit 492d4a2b44
3 changed files with 25 additions and 3 deletions
@@ -4,4 +4,4 @@ secao: alterado
titulo: A construção das imagens não reinstala as dependências só porque o número da versão mudou
---
As três imagens declaravam o número da versão antes das etapas mais demoradas da construção, e isso fazia o Docker refazer essas etapas em toda versão nova: no worker, a instalação inteira das dependências; no app e no scheduler, a instalação dos pacotes do sistema. Agora o número entra no fim, e essas etapas são reaproveitadas de uma versão para a outra. Nada muda no que a imagem contém nem no que quem opera precisa fazer. Crédito: @bonito-system.
As quatro imagens declaravam o número da versão antes das etapas mais demoradas da construção, e isso fazia o Docker refazer essas etapas em toda versão nova: no worker e no agente de voz, a instalação inteira das dependências; no app e no scheduler, a instalação dos pacotes do sistema. Agora o número entra no fim, e essas etapas são reaproveitadas de uma versão para a outra. Nada muda no que a imagem contém nem no que quem opera precisa fazer. Contribuição de @bonito-system (#1569).
+7 -2
View File
@@ -8,8 +8,6 @@ LABEL org.opencontainers.image.source="https://github.com/melgarafael/DeskcommCR
org.opencontainers.image.licenses="MIT" \
org.opencontainers.image.title="DeskcommCRM voice-agent"
ARG APP_VERSION=dev
ENV APP_VERSION=$APP_VERSION
RUN corepack enable && corepack prepare pnpm@9.15.9 --activate
COPY package.json pnpm-lock.yaml ./
@@ -22,4 +20,11 @@ RUN pnpm install --frozen-lockfile
COPY . .
# A versão por ÚLTIMO, como no Dockerfile.worker. Declarada antes do `pnpm install`,
# a instrução `ARG` entrava na chave de cache de tudo o que vem depois e a
# instalação INTEIRA de dependências era refeita a cada release, só porque o
# número mudou. Aqui ela só invalida o que não custa nada.
ARG APP_VERSION=dev
ENV APP_VERSION=$APP_VERSION
CMD ["pnpm", "exec", "tsx", "workers/voice-agent/index.ts"]
@@ -249,6 +249,23 @@ describe("packaging — o artefato que o cliente instala", () => {
}
});
it("a versão vem depois das camadas caras em cada Dockerfile publicado", () => {
// `ARG` entra na chave de cache de toda instrução seguinte do estágio. Com
// APP_VERSION acima de um `RUN`, cada release refaz esse `RUN` (o `pnpm
// install` inteiro, no worker e na voz) só porque o número mudou (#1569).
for (const arquivo of [
"Dockerfile",
"Dockerfile.worker",
"Dockerfile.scheduler",
"Dockerfile.voice-agent",
]) {
const linhas = fs.readFileSync(path.join(RAIZ, arquivo), "utf8").split("\n");
const arg = linhas.findIndex((l) => /^ARG APP_VERSION/.test(l));
const runsDepois = linhas.slice(arg + 1).filter((l) => /^RUN /.test(l));
expect(runsDepois, `${arquivo}: RUN depois de ARG APP_VERSION`).toEqual([]);
}
});
it("o workflow publica as quatro imagens e injeta APP_VERSION", () => {
const wf = fs.readFileSync(path.join(RAIZ, ".github/workflows/publish-image.yml"), "utf8");
for (const imagem of [