Armazenamento em cache do Amazon S3 - AWS CodeBuild

Armazenamento em cache do Amazon S3

O armazenamento em cache do Amazon S3 armazena o cache em um bucket do Amazon S3 que está disponível em vários hosts de compilação. Esta é uma boa opção para artefatos de compilação pequenos a intermediários que são mais caras para criar do que para baixar.

Para usar o Amazon S3 em uma compilação, é possível especificar os caminhos dos arquivos nos quais deseja armazenar em cache no buildspec.yml. O CodeBuild armazenará e atualizará automaticamente o cache no local do Amazon S3 configurado no projeto. Se você não especificar os caminhos do arquivo, o CodeBuild fará o melhor esforço para armazenar em cache as dependências de linguagem comum para ajudar a acelerar as compilações. Você pode visualizar os detalhes do cache nos logs da compilação.

Além disso, se quiser ter várias versões de cache, você poderá definir uma chave de cache no buildspec.yml. O CodeBuild armazena o cache no contexto dessa chave de cache e cria uma cópia de cache exclusiva que não será atualizada depois de criada. As chaves de cache também podem ser compartilhadas entre projetos. Recursos como chaves dinâmicas, versionamento de cache e compartilhamento de cache entre compilações só estão disponíveis quando uma chave é especificada.

Para saber mais sobre a sintaxe do cache no arquivo buildspec, consulte cache na referência do buildspec.

Gerar chaves dinâmicas

Uma chave de cache pode incluir comandos de shell e variáveis de ambiente para torná-la única, permitindo atualizações automáticas de cache quando a chave é alterada. Por exemplo, é possível definir uma chave usando o hash do arquivo package-lock.json. Quando as dependências nesse arquivo mudam, o hash, e, portanto, a chave do cache, muda, acionando a criação automática de um novo cache.

cache: key: npm-key-$(codebuild-hash-files package-lock.json)

O CodeBuild avaliará a expressão $(codebuild-hash-files package-lock.json) para obter a chave final:

npm-key-abc123

Você também pode definir uma chave de cache usando variáveis de ambiente, como CODEBUILD_RESOLVED_SOURCE_VERSION. Isso garante que sempre que a origem mudar, uma nova chave seja gerada, resultando em um novo cache sendo salvo automaticamente:

cache: key: npm-key-$CODEBUILD_RESOLVED_SOURCE_VERSION

O CodeBuild avaliará a expressão e obterá a chave final:

npm-key-046e8b67481d53bdc86c3f6affdd5d1afae6d369

codebuild-hash-files

O codebuild-hash-files é uma ferramenta da CLI que calcula um hash SHA-256 para um conjunto de arquivos no diretório de origem do CodeBuild usando padrões globais:

codebuild-hash-files <glob-pattern-1> <glob-pattern-2> ...

Veja alguns exemplos usando a codebuild-hash-files:

codebuild-hash-files package-lock.json codebuild-hash-files '**/*.md'

Versão do cache

A versão do cache é um hash gerado a partir dos caminhos dos diretórios que estão sendo armazenados em cache. Se dois caches tiverem versões diferentes, eles serão tratados como caches distintos durante o processo de correspondência. Por exemplo, os dois caches a seguir são considerados diferentes porque fazem referência a caminhos diferentes:

version: 0.2 phases: build: commands: - pip install pandas==2.2.3 --target pip-dependencies cache: key: pip-dependencies paths: - "pip-dependencies/**/*"
version: 0.2 phases: build: commands: - pip install pandas==2.2.3 --target tmp/pip-dependencies cache: key: pip-dependencies paths: - "tmp/pip-dependencies/**/*"

Compartilhamento de cache entre projetos

É possível usar o campo da API cacheNamespace na seção cache para compartilhar um cache entre vários projetos. Esse campo define o escopo do cache. Para compartilhar um cache, faça o seguinte:

  • Usar o mesmo cacheNamespace.

  • Especifique o mesmo cache key.

  • Defina caminhos de cache idênticos.

  • Use os mesmos buckets do Amazon S3 e pathPrefix, se definido.

Isso garante a consistência e permite o compartilhamento de cache entre projetos.

Especificar um namespace de cache (console)

  1. Abra o console do AWS CodeBuild em https://console.aws.amazon.com/codesuite/codebuild/home.

  2. Escolha Criar projeto. Para obter informações, consulte Criar um projeto de compilação (console) e Executar uma compilação (console).

  3. Em Artefatos, escolha Configuração adicional.

  4. Em Tipo de cache, selecione Amazon S3.

  5. Em Namespace do cache: opcional, insira um valor de namespace.

    Parâmetro de namespace do cache no console do CodeBuild.
  6. Continue com os valores padrão e escolha Criar projeto de compilação.

Especificar um namespace do cache (AWS CLI)

É possível usar o parâmetro --cache na AWS CLI para especificar um namespace de cache.

--cache '{"type": "S3", "location": "your-s3-bucket", "cacheNamespace": "test-cache-namespace"}'

Exemplo de buildspec

Aqui estão vários exemplos de buildspec para linguagens comuns:

Dependências Node.js de cache

Se o projeto inclui um arquivo package-lock.json e usa npm para gerenciar dependências do Node.js, o exemplo a seguir mostra como configurar o armazenamento em cache. Por padrão, npm instala dependências no diretório node_modules.

version: 0.2 phases: build: commands: - npm install cache: key: npm-$(codebuild-hash-files package-lock.json) paths: - "node_modules/**/*"

Armazenar em cache as dependências do Python

Se o projeto inclui um arquivo requirements.txt e usa pip para gerenciar dependências do Python, o exemplo a seguir demonstra como configurar o armazenamento em cache. Por padrão, o pip instala pacotes no diretório site-packages do sistema.

version: 0.2 phases: build: commands: - pip install -r requirements.txt cache: key: python-$(codebuild-hash-files requirements.txt) paths: - "/root/.pyenv/versions/${python_version}/lib/python${python_major_version}/site-packages/**/*"

Além disso, é possível instalar dependências em um diretório específico e configurar o armazenamento em cache para esse diretório.

version: 0.2 phases: build: commands: - pip install -r requirements.txt --target python-dependencies cache: key: python-$(codebuild-hash-files requirements.txt) paths: - "python-dependencies/**/*"

Armazenar em cache as dependências do Ruby

Se o projeto inclui um arquivo Gemfile.lock e usa Bundler para gerenciar dependências de gem, o exemplo a seguir demonstra como configurar o armazenamento em cache com eficácia.

version: 0.2 phases: build: commands: - bundle install --path vendor/bundle cache: key: ruby-$(codebuild-hash-files Gemfile.lock) paths: - "vendor/bundle/**/*"

Armazenar em cache as dependências do Go

Se o projeto inclui um arquivo go.sum e usa módulos do Go para gerenciar dependências, o exemplo a seguir demonstra como configurar o armazenamento em cache. Por padrão, os módulos do Go são baixados e armazenados no diretório ${GOPATH}/pkg/mod.

version: 0.2 phases: build: commands: - go mod download cache: key: go-$(codebuild-hash-files go.sum) paths: - "/go/pkg/mod/**/*"