Amazon S3 缓存 - Amazon CodeBuild
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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 打开 Amazon CodeBuild 控制台。

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

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

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

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

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

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

您可以在 Amazon 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/**/*"