本页面介绍加快 Cloud Build 构建速度的最佳做法。
构建更精简的容器
当您对应用进行容器化时,运行时不需要的文件(例如构建时依赖项和中间文件)可能会意外包含在容器映像中。当映像在您的容器映像注册表和容器运行时之间移动时,这些不需要的文件会增加容器映像的大小,从而增加额外时间和费用。
为了帮助减小容器映像的大小,请将应用的构建(以及构建应用所用的工具)与运行时容器的组建分开。
如需了解详情,请参阅构建更精简的容器。
使用 Kaniko 缓存
Kaniko 缓存是一项 Cloud Build 功能,通过在可供后续构建使用的容器映像注册表(例如 Google 自己的 Container Registry)中存储中间层并编制中间层的索引,缓存容器构建工件。如需了解详情,请参阅使用 Kaniko 缓存。
使用缓存的 Docker 映像
加快 Docker 映像构建速度的最简单方法是指定可用于后续构建的缓存映像。您可以通过在构建配置文件中添加 --cache-from
参数来指定缓存的映像,这将指示 Docker 使用该映像作为缓存源进行构建。
每个 Docker 映像由堆叠层组成。使用 --cache-from
会重建所有层(从已更改的层开始直至构建结束);因此如果您在 Docker 构建的早期阶段中更改了某个层,则使用 --cache-from
是没有好处的。
建议您始终对构建使用 --cache-from
,但请牢记以下注意事项:
- 您需要使用先前构建的 Docker 映像来缓存。
- 您只能将
--cache-from
用于 Docker 构建;不能将其用于创建其他种类的工件的构建器。 - 必须从注册表中检索缓存的映像,这可能会增加构建所需的时间。
以下步骤说明了如何使用先前缓存的映像进行构建:
YAML
在构建配置中添加相关指令,以执行以下操作:
- 从 Container Registry 中拉取缓存的映像。请注意,下面的
docker pull
构建步骤将entrypoint
设置为bash
,允许您运行命令并忽略返回的错误。第一次构建映像时,这是必需操作,docker pull
没有可供拉取的现有映像。 添加
--cache-from
参数以使用该映像进行重建。steps: - name: 'gcr.io/cloud-builders/docker' entrypoint: 'bash' args: ['-c', 'docker pull gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest || exit 0'] - name: 'gcr.io/cloud-builders/docker' args: [ 'build', '-t', 'gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest', '--cache-from', 'gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest', '.' ] images: ['gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest']
其中 [IMAGE_NAME] 是映像的名称。
- 从 Container Registry 中拉取缓存的映像。请注意,下面的
使用上面的构建配置构建您的映像:
gcloud builds submit --config cloudbuild.yaml .
JSON
在构建配置中添加相关指令,以执行以下操作:
- 从 Container Registry 中拉取缓存的映像。请注意,下面的
docker pull
构建步骤将entrypoint
设置为bash
,允许您运行命令并忽略返回的错误。第一次构建映像时,这是必需操作,docker pull
没有可供拉取的现有映像。 添加
--cache-from
参数以使用该映像进行重建。{ "steps": [ { "name": "gcr.io/cloud-builders/docker", "entrypoint": "bash", "args": ["-c", "docker pull gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest || exit 0"] }, { "name": "gcr.io/cloud-builders/docker", "args": [ "build", "-t", "gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest", "--cache-from", "gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest", "." ] } ], "images": ["gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest"] }
其中 [IMAGE_NAME] 是映像的名称。
- 从 Container Registry 中拉取缓存的映像。请注意,下面的
使用上面的构建配置构建您的映像:
gcloud builds submit --config cloudbuild.json .
使用 Google Cloud Storage 缓存目录
要加快构建速度,可以重复使用以前构建的结果。您可以将以前构建的结果复制到 Google Cloud Storage 存储分区、使用该结果进行更快速的计算,然后将新结果复制回存储分区。如果您的构建需要很长时间并生成少量文件,可以使用此方法,这些文件无需较长时间来复制到 Google Cloud Storage 以及从 Google Cloud Storage 中复制。
与仅适用于 Docker 构建的 --cache-from
不同,Google Cloud Storage 缓存可以用于 Cloud Build 支持的任何构建器。
按照以下步骤即可使用 Google Cloud Storage 缓存目录:
YAML
在构建配置文件中添加相关指令,以执行以下操作:
- 从 Google Cloud Storage 存储分区中复制以前构建的结果。
- 使用当前构建的结果。
将新结果复制回存储分区。
steps: - name: gcr.io/cloud-builders/gsutil args: ['cp', 'gs://mybucket/results.zip', 'previous_results.zip'] # operations that use previous_results.zip and produce new_results.zip - name: gcr.io/cloud-builders/gsutil args: ['cp', 'new_results.zip', 'gs://mybucket/results.zip']
使用上面的构建配置构建您的代码:
gcloud builds submit --config cloudbuild.yaml .
JSON
在构建配置文件中添加相关指令,以执行以下操作:
- 从 Google Cloud Storage 存储分区中复制以前构建的结果。
- 使用当前构建的结果。
将新结果复制回存储分区。
{ "steps": [ { "name": "gcr.io/cloud-builders/gsutil", "args": ["cp", "gs://mybucket/results.zip", "previous_results.zip"] }, { // operations that use previous_results.zip and produce new_results.zip }, { "name": "gcr.io/cloud-builders/gsutil", "args": ["cp", "new_results.zip", "gs://mybucket/results.zip"] } ] }
使用上面的构建配置构建您的代码:
gcloud builds submit --config cloudbuild.json .
避免上传不必要的文件
构建触发时,将上传您的代码目录,以供 Cloud Build 使用。
您可以使用
.gcloudignore
文件,以优化上传时间。
通常被排除的文件包括:
- 项目开发者的文档和示例代码
- 生成的基架代码、二进制文件、
*.jar
文件或已编译的用于开发的 Web 资源。 - 通过 vendor 方法添加的用于本地开发的第三方依赖项
如需准备 .gcloudignore
文件以解决这些情况,请在您的项目根目录中创建一个包含如下内容的文件:
.git
dist
node_modules
vendor
*.jar
通过排除已编译的代码和第三方依赖项,构建流程将更加一致,仍处于积极开发阶段的代码的意外部署风险将降低。
后续步骤
- 了解如何为 build 增加 vCPU。