Amazon S3 缓存 - AWS CodeBuild

Amazon S3 缓存

Amazon S3 缓存将缓存存储在跨多个构建主机可用的 Amazon S3 存储桶中。对于构建成本高于下载成本的中小型构建构件,这是一个很好的选择。

要在构建中使用 Amazon S3,您可以为要在 buildspec.yml 中缓存的文件指定路径。CodeBuild 将自动存储缓存,并将缓存更新到在项目上配置的 Amazon S3 位置。如果您未指定文件路径,CodeBuild 将尽最大努力缓存公共语言依赖项,以协助您加快构建速度。您可以在构建日志中查看缓存详细信息。

此外,如果您想拥有多个版本的缓存,可以在 buildspec.yml 中定义缓存键。CodeBuild 将缓存存储在此缓存键的上下文下,并创建一个在创建后将不会更新的唯一缓存副本。也可以跨项目共享缓存键。动态键、缓存版本控制和跨构建共享缓存等功能只有在指定键时才可用。

要了解有关 buildspec 文件中的缓存语法的更多信息,请参阅 buildspec 参考中的cache

生成动态键

缓存键可以包含 Shell 命令和环境变量以使其独一无二,从而在键更改时自动更新缓存。例如,您可以使用 package-lock.json 文件的哈希值定义键。当该文件中的依赖项发生变化时,哈希值(因而缓存键)会发生变化,从而触发自动创建新缓存。

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

CodeBuild 将评估表达式 $(codebuild-hash-files package-lock.json) 以获得最终键:

npm-key-abc123

您也可以使用环境变量定义缓存键,例如 CODEBUILD_RESOLVED_SOURCE_VERSION。这可确保每当源发生变化时,都会生成一个新键,从而自动保存一个新缓存:

cache: key: npm-key-$CODEBUILD_RESOLVED_SOURCE_VERSION

CodeBuild 将评估表达式并获得最终键:

npm-key-046e8b67481d53bdc86c3f6affdd5d1afae6d369

codebuild-hash-files

codebuild-hash-files 是一个 CLI 工具,它使用 glob 模式计算 CodeBuild 源目录中一组文件的 SHA-256 哈希值:

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

下面是一些使用 codebuild-hash-files 的示例:

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

缓存版本

缓存版本是根据正在缓存的目录的路径生成的哈希值。如果两个缓存的版本不同,则在匹配过程中它们将被视为不同的缓存。例如,以下两个缓存被认为是不同的,因为它们引用不同的路径:

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/**/*"

项目之间的缓存共享

您可以使用 cache 部分下的 cacheNamespace API 字段在多个项目之间共享缓存。此字段定义缓存的范围。要共享缓存,必须执行以下操作:

  • 使用相同的 cacheNamespace

  • 指定相同的缓存 key

  • 定义相同的缓存路径。

  • 使用相同的 Amazon S3 存储桶和 pathPrefix(如果已设置)。

这可以确保一致性并支持跨项目共享缓存。

指定缓存命名空间(控制台)

  1. https://console.aws.amazon.com/codesuite/codebuild/home 打开 AWS CodeBuild 控制台。

  2. 选择创建项目。有关更多信息,请参阅 创建构建项目(控制台)运行构建(控制台)

  3. 构件中,选择其他配置

  4. 对于缓存类型,选择 Amazon S3

  5. 对于缓存命名空间 - 可选,输入命名空间值。

    CodeBuild 控制台中的缓存命名空间参数。
  6. 继续使用默认值,然后选择创建构建项目

指定缓存命名空间(AWS CLI)

您可以在 AWS CLI 中使用 --cache 参数来指定缓存命名空间。

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

Buildspec 示例

以下是常用语言的若干 buildspec 示例:

缓存 Node.js 依赖项

如果您的项目包含 package-lock.json 文件并使用 npm 来管理 Node.js 依赖项,则以下示例说明如何设置缓存。默认情况下,npm 将依赖项安装到 node_modules 目录中。

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

缓存 Python 依赖项

如果您的项目包含 requirements.txt 文件并使用 pip 来管理 Python 依赖项,则以下示例演示如何配置缓存。默认情况下,pip 将软件包安装到系统的 site-packages 目录中。

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/**/*"

此外,您可以将依赖项安装到特定目录中,并为该目录配置缓存。

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/**/*"

缓存 Ruby 依赖项

如果您的项目包含 Gemfile.lock 文件并使用 Bundler 来管理 gem 依赖项,则以下示例演示了如何有效地配置缓存。

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

缓存 Go 依赖项

如果您的项目包含 go.sum 文件并使用 Go 模块来管理依赖项,则以下示例演示如何配置缓存。默认情况下,将 Go 模块下载并存储在 ${GOPATH}/pkg/mod 目录中。

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