diff --git a/.changes/imagens-nao-reinstalam-dependencias-a-cada-versao.md b/.changes/imagens-nao-reinstalam-dependencias-a-cada-versao.md index e1ee7abe4..9c7456a38 100644 --- a/.changes/imagens-nao-reinstalam-dependencias-a-cada-versao.md +++ b/.changes/imagens-nao-reinstalam-dependencias-a-cada-versao.md @@ -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). diff --git a/Dockerfile.voice-agent b/Dockerfile.voice-agent index b872302a1..fdfd031c1 100644 --- a/Dockerfile.voice-agent +++ b/Dockerfile.voice-agent @@ -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"] diff --git a/tests/unit/packaging-artefato-do-cliente.test.ts b/tests/unit/packaging-artefato-do-cliente.test.ts index 6ae45fa2e..7eb864aa5 100644 --- a/tests/unit/packaging-artefato-do-cliente.test.ts +++ b/tests/unit/packaging-artefato-do-cliente.test.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 [