加速构建的最佳做法

本页面介绍加快 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

  1. 在构建配置中添加相关指令,以执行以下操作:

    • 从 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] 是映像的名称。

  2. 使用上面的构建配置构建您的映像:

    gcloud builds submit --config cloudbuild.yaml .
    

JSON

  1. 在构建配置中添加相关指令,以执行以下操作:

    • 从 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] 是映像的名称。

  2. 使用上面的构建配置构建您的映像:

    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

  1. 在构建配置文件中添加相关指令,以执行以下操作:

    • 从 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']
      
  2. 使用上面的构建配置构建您的代码:

    gcloud builds submit --config cloudbuild.yaml .
    

JSON

  1. 在构建配置文件中添加相关指令,以执行以下操作:

    • 从 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"]
          }
          ]
      }
      
  2. 使用上面的构建配置构建您的代码:

    gcloud builds submit --config cloudbuild.json .
    

避免上传不必要的文件

构建触发时,将上传您的代码目录,以供 Cloud Build 使用。

您可以通过 .gcloudignore 文件来排除构建不需要的文件,从而优化上传时间。

通常被排除的文件包括:

  • 项目开发者的文档和示例代码
  • 生成的基架代码、二进制文件、*.jar 文件或已编译的用于开发的 Web 资源。
  • 通过 vendor 方法添加的用于本地开发的第三方依赖项

如需准备 .gcloudignore 文件以解决这些情况,请在您的项目根目录中创建一个包含如下内容的文件:

.git
dist
node_modules
vendor
*.jar

通过排除已编译的代码和第三方依赖项,构建流程将更加一致,仍处于积极开发阶段的代码的意外部署风险将降低。

后续步骤