

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Amazon S3 缓存
<a name="caching-s3"></a>

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

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

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

要了解有关 buildspec 文件中的缓存语法的更多信息，请参阅 buildspec 参考中的[cache](build-spec-ref.md#build-spec.cache)。

**Topics**
+ [生成动态键](#caching-s3-dynamic)
+ [codebuild-hash-files](#caching-s3-dynamic.codebuild-hash-files)
+ [缓存版本](#caching-s3-version)
+ [项目之间的缓存共享](#caching-s3-sharing)
+ [Buildspec 示例](#caching-s3-examples)

## 生成动态键
<a name="caching-s3-dynamic"></a>

缓存键可能包含 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
<a name="caching-s3-dynamic.codebuild-hash-files"></a>

`codebuild-hash-files`是一个 CLI 工具，它使用全局模式计算 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'
```

## 缓存版本
<a name="caching-s3-version"></a>

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

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

## 项目之间的缓存共享
<a name="caching-s3-sharing"></a>

您可以使用 `cache` 部分下的 `cacheNamespace` API 字段在多个项目之间共享缓存。此字段用于定义缓存的范围。要共享缓存，必须执行以下操作：
+ 使用相同的 `cacheNamespace`。
+ 指定相同的缓存 `key`。
+ 定义相同的缓存路径。
+ 使用相同的 Amazon S3 存储桶和 `pathPrefix`（如果已设置）。

这样可以确保一致性并可在项目间共享缓存。

### 指定缓存命名空间（控制台）
<a name="caching-s3-sharing.console"></a>

1. 在 [https://console.aws.amazon.com/codesuite/codebuild](https://console.aws.amazon.com/codesuite/codebuild/home) /home 中打开 AWS CodeBuild 控制台。

1. 选择**创建项目**。有关更多信息，请参阅 [创建构建项目（控制台）](create-project.md#create-project-console) 和 [运行构建（控制台）](run-build-console.md)。

1. 在**构件**中，选择**其他配置**。

1. 对于**缓存类型**，选择 **Amazon S3**。

1. 对于**缓存命名空间 - 可选**，输入命名空间值。  
![\[CodeBuild 控制台中的缓存命名空间参数。\]](http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/images/s3-cache-namespace.png)

1. 继续使用默认值，然后选择**创建构建项目**。

### 指定缓存命名空间（AWS CLI）
<a name="caching-s3-sharing.cli"></a>

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

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

## Buildspec 示例
<a name="caching-s3-examples"></a>

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

**Topics**
+ [缓存 Node.js 依赖项](#caching-s3-examples.nodejs)
+ [缓存 Python 依赖项](#caching-s3-examples.python)
+ [缓存 Ruby 依赖项](#caching-s3-examples.ruby)
+ [缓存 Go 依赖项](#caching-s3-examples.go)

### 缓存 Node.js 依赖项
<a name="caching-s3-examples.nodejs"></a>

如果您的项目包含一个 `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 依赖项
<a name="caching-s3-examples.python"></a>

如果您的项目包含一个 `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 依赖项
<a name="caching-s3-examples.ruby"></a>

如果您的项目包含 `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 依赖项
<a name="caching-s3-examples.go"></a>

如果您的项目包含 `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/**/*"
```