Montar SquadSolicitar Orçamento

Blog

Nossas últimas novidades
Tempo de Leitura
4
min

Cache no CI/CD: como desenhar keys e evitar cache inválido (GitHub e GitLab)

Aprenda a acelerar pipelines com cache sem criar bugs: como desenhar cache keys, usar restore/fallback, separar por arquitetura (ARM/x64) e evitar cache contaminado.
23 de fevereiro de 2026

Cache é uma das maiores alavancas de performance em CI/CD. Também é uma das maiores fontes de bugs intermitentes.

O objetivo deste post é prático: ensinar a desenhar cache keys que aceleram o pipeline sem deixar você com builds “assombrados”.

Este post faz parte da série:

Mapa da série CI/CD

Cache vs artifacts: comece separando o que é o quê

Regra de bolso:

  • Cache = reutilizar diretórios reconstruíveis (dependências, downloads).
  • Artifacts = transportar resultado do build entre jobs (dist, binário, relatório).

Quando você usa cache para transportar output de build, você aumenta o risco de:

  • um job consumir um output “antigo”
  • resultados inconsistentes por branch/arquitetura

1) Como desenhar cache keys (o que entra e o que não entra)

Um cache key bom costuma ter:

  • Sistema operacional
  • Arquitetura (ARM64/x64)
  • Hash do lockfile
  • Versão do runtime (quando necessário)

Um cache key ruim costuma ter:

  • SHA do commit (invalida a cada commit)
  • timestamp
  • nome de branch sem normalização (explode número de caches)

1.1 Exemplo (GitHub Actions)

- name: Cache npm
  uses: actions/cache@v4
  with:
    path: ~/.npm
    key: ${{ runner.os }}-${{ runner.arch }}-npm-${{ hashFiles('**/package-lock.json') }}
    restore-keys: |
      ${{ runner.os }}-${{ runner.arch }}-npm-

Por que isso funciona:

  • O hash do lockfile só muda quando dependência muda.
  • O prefixo em restore-keys permite reaproveitar cache “próximo” quando o exato não existe.
  • runner.arch evita misturar ARM64 e x64.

1.2 Exemplo (GitLab CI/CD)

cache:
  key: "node-${CI_RUNNER_EXECUTABLE_ARCH}-${CI_COMMIT_REF_SLUG}-${CI_PROJECT_NAME}"
  paths:
    - .npm/
  fallback_keys:
    - "node-${CI_RUNNER_EXECUTABLE_ARCH}-main-${CI_PROJECT_NAME}"
    - "node-${CI_RUNNER_EXECUTABLE_ARCH}-default-${CI_PROJECT_NAME}"

Por que isso funciona:

  • Separa por arquitetura.
  • Permite fallback da branch principal para branches novas.
  • Evita cache “cross-project” (quando você tem múltiplos projetos e runners compartilhados).

2) Onde cachear (Node, Python, Java, Ruby)

Regra geral: cacheie o “cache do gerenciador”, não necessariamente a pasta final.

  • Node (npm): ~/.npm
  • Node (pnpm): ~/.pnpm-store
  • Python (pip): ~/.cache/pip
  • Java/Gradle: ~/.gradle/caches
  • Ruby/bundler: vendor/bundle (com critério)

O que evitar como primeiro passo:

  • cachear node_modules indiscriminadamente (pode ser enorme e instável)
  • cachear outputs de build (isso é artifact)

3) Invalidação: o que muda cache (e como evitar “cache inútil”)

Três causas clássicas de cache “sempre miss”:

  1. O key muda a cada commit (ex.: inclui SHA).
  2. O lockfile não está sendo incluído no hash (cache fica stale e pode quebrar).
  3. Você está cacheando um diretório que muda por execução.

Checklist para corrigir:

  • lockfile faz parte do key (hashFiles(...) ou equivalente).
  • arquitetura faz parte do key.
  • os paths de cache realmente existem (não inventar diretório).
  • o cache é restaurado antes de instalar dependências.

4) Cache em pipelines com ARM64 e x64

Quando você tem ARM64 e x64:

  • caches de dependências nativas não podem ser compartilhados
  • caches precisam ser duplicados (um por arquitetura)

Regra prática:

  • nunca compartilhe cache entre arquiteturas sem colocar arch no key

Checklist final

  • Cache key inclui lockfile hash.
  • Cache key inclui OS + arquitetura.
  • restore/fallback keys existem (mas não para output de build).
  • Cache é para dependências (artifact é para outputs).
  • Métrica observável: tempo economizado por job (antes/depois).

Referências

    Compartilhar

Inscreva-se em nossa newsletter

Posts semelhantes

Tempo de Leitura
3
min
GitLab CI: tags de runner e roteamento de jobs (sem dor)

Acelere a sua empresa com a X-Apps

Alocar profissionaisSolicitar Orçamento
A X-Apps é um provedor de TI parceiro e aconselhada pelo
Receba nossos e-mails
Siga nossas redes sociais
O seu time de TI. Desenvolvimento de software sob demanda e alocação de profissionais.
Vamos conversar?
comercial@x-apps.com.br11 5083-0122

Rua Rodrigo Vieira, 126

Jardim Vila Mariana. São Paulo, SP.

CEP: 04115-060

Mapa do site
Termos de serviçoTermos de privacidade
Available in English