为 IoT 设备构建多架构容器映像


本文是系列文章中的一篇,该系列讨论了如何构建自动持续集成 (CI) 流水线以在 Google Cloud 上构建多架构容器映像。

在本教程中,您将实现一个流水线,它使用如下工具构建多架构容器映像:Cloud BuildContainer Registry。本教程展示了本系列第 1 部分中实现多架构容器映像构建流水线部分中所述的多架构构建策略。

例如,假设您维护着一组物联网 (IoT) 设备。随着物联网解决方案的新要求不断出现,您需要新的硬件设备。如果新设备的硬件架构与现有设备的架构不同,您需要修改构建流水线以支持新架构。

本教程面向想要简化构建容器映像的复杂流水线或扩展这些流水线以构建多架构映像的 IT 专业人员。

本教程假定您具备以下工具的基础知识:

  • Terraform,用于在 Google Cloud 上创建基础架构。
  • Google Cloud CLI,用于在 Google Cloud 上执行平台任务。
  • Cloud Shell,用于在本教程中运行命令。本教程中使用的所有工具都预安装在 Cloud Shell 中。
  • Cloud Build,用于设置 CI 流水线。
  • Docker,作为容器管理平台。
  • Container Registry,用于存储构建过程生成的容器映像。

在本教程中,您将使用 Terraform 设置所需的资源,以预配和配置用于构建容器映像的流水线。

架构

下图演示了您在本教程中创建的用于构建容器映像的流水线的工作流。

包含代码库、Cloud Build 和 Container Registry 的流水线。

更改容器映像的源代码会触发 Cloud Build 构建多架构容器映像。完成构建后,多架构容器映像将存储在 Container Registry 中。

目标

  • 使用 Terraform 预配在 Google Cloud 上构建容器映像的流水线。
  • 修改容器映像的源代码以触发新构建。
  • 检查存储在 Container Registry 中的容器映像。

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

准备工作

  1. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  2. 确保您的 Google Cloud 项目已启用结算功能

完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理

准备环境

在本教程中,您将在 Cloud Shell 中运行所有命令。

  1. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

    Cloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。

  2. 克隆示例代码库:

    cd "$HOME"
    git clone \
    https://github.com/GoogleCloudPlatform/solutions-build-multi-architecture-images-tutorial.git
    
  3. 生成应用默认凭据

    gcloud auth application-default login --quiet
    

    输出类似于以下内容:

    Go to the following link in your browser:
        https://accounts.google.com/o/oauth2/auth?code_challenge=...
    Enter verification code:
    
  4. 在浏览器窗口中,打开在生成应用默认凭据的输出中显示的 URL(前一步)。

  5. 选择允许以继续操作。

  6. 复制屏幕上的代码,然后将其输入 Cloud Shell。

    输出类似于以下内容:

    /tmp/tmp.xxxxxxxxxx/application_default_credentials.json
    

    请注意 application_default_credentials.json 文件的路径。在下一部分中,您将使用此路径设置环境变量。

设置环境变量

您需要先初始化并导出以下环境变量,然后才能为本教程预配必要的基础架构:

  1. 在 Cloud Shell 中,创建环境变量以存储 Terraform 用于预配资源的 Google Cloud 服务账号名称:

    export TF_SERVICE_ACCOUNT_NAME=tf-service-account
    
  2. 创建一个环境变量,以存储 Terraform 用于存储状态的 Google Cloud 项目 ID:

    export TF_STATE_PROJECT=${DEVSHELL_PROJECT_ID}
    
  3. 创建一个环境变量,以存储 Terraform 用于保存状态文件的 Cloud Storage 存储分区:

    export TF_STATE_BUCKET=tf-state-bucket-${TF_STATE_PROJECT}
    
  4. 创建一个环境变量,以存储包含容器映像构建流水线的资源的 Google Cloud 项目 ID:

    export GOOGLE_CLOUD_PROJECT=${DEVSHELL_PROJECT_ID}
    
  5. 创建一个环境变量,以存储默认 Google Cloud 应用默认凭据的路径,这是您在上一部分中记录的值:

    export GOOGLE_APPLICATION_CREDENTIALS=PATH
    

    替换以下内容:

    • PATHapplication_default_credentials.json 文件的路径

预配环境

您需要运行 generate-tf-backend.sh Shell 脚本,以生成 Terraform 后端配置、必要的 Google Cloud 服务账号和 Cloud Storage 存储分区(用于存储 Terraform 远程状态相关信息。

  • 在 Cloud Shell 中,预配您的构建环境:

    cd $HOME/solutions-build-multi-architecture-images-tutorial/
    
    ./generate-tf-backend.sh
    

    该脚本具有幂等性,可以安全运行多次。

    首次成功运行脚本后,输出类似于以下内容:

    Generating the descriptor to hold backend data in terraform/backend.tf
    terraform {
       backend "gcs" {
           bucket  = "tf-state-bucket-project-id"
           prefix  = "terraform/state"
       }
    }
    

创建构建流水线

Terraform 模板文件 terraform/main.tf 定义了为本教程创建的资源。使用该描述符运行 Terraform 后,您将创建以下 Google Cloud 资源:

  • Cloud Source Repositories 代码库,用于存储容器映像描述符Cloud Build 构建配置文件
  • Pub/Sub 主题,其中 Cloud Build 会在每次源代码发生变化时发布消息。
  • 用于构建多架构容器映像的 Cloud Build 构建。
  • 用于存储容器映像的 Container Registry 代码库。

在 Cloud Shell 中,执行以下操作:

  1. 如需初始化 Terraform 工作目录,请运行 terraform init 命令:

    cd terraform
    terraform init
    
  2. (可选)要查看 Terraform 将应用的更改,请运行 terraform plan 命令:

    terraform plan
    

    该输出列出了 Terraform 为了在 Google Cloud 环境中预配资源需要执行的所有操作。所有操作的摘要如下所示:

    Plan: 8 to add, 0 to change, 0 to destroy.
    

    添加操作的总数是 8,没有更改和删除。

  3. 运行 terraform apply 命令,以在 Google Cloud 项目中创建资源:

    terraform apply
    
  4. 如需继续执行该命令,请输入 yes

将源文件推送到 Cloud Source Repositories 代码库

为了使构建流水线能够执行构建,Dockerfile 和 Cloud Build 配置文件需要存储在 Cloud Source Repositories 源代码库中。

  1. 在 Cloud Shell 中,克隆源代码库:

    cd $HOME
    gcloud source repos clone cross-build
    
  2. 将 Dockerfile 和 Cloud Build 配置文件复制到源代码库中:

    cp -r "$HOME"/solutions-build-multi-architecture-images-tutorial/terraform/cloud-build/. "$HOME"/cross-build
    
  3. 提交并推送源代码库中的文件:

    cd "$HOME"/cross-build
    git add .
    git commit -m "Initial commit"
    git push
    

检查结果

在 Cloud Build 作业运行期间以及完成后,您可以在 Cloud Build 构建记录页面上检查每个构建步骤的执行情况。

Cloud Build 构建记录页面上的构建列表。

Cloud Build 构建

构建记录页面中,您可以大致了解构建步骤以及各个步骤的运行时间,如下图所示。

Cloud Build 历史记录中的构建步骤。

如果打开构建步骤,您会看到该步骤的输出。例如,上图中的 buildx 检查步骤的构建详情显示了平台支持的不同目标平台架构:

12 Name:      mybuilder0
13 Endpoint:  unix:///var/run/docker.sock
14 Status:    running
15 Platforms: linux/amd64, linux/arm64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6

第四步的构建详情显示了每个目标架构的构建输出:

#8 0.268 I am running on linux/amd64, building for linux/amd64
#12 0.628 I am running on linux/amd64, building for linux/arm/v7
#10 0.279 I am running on linux/amd64, building for linux/arm/v6
#14 0.252 I am running on linux/amd64, building for linux/arm64

Container Registry 中的映像清单

完成构建后,您可以在 Google Cloud 控制台中的 Container Registry 映像页面上检查映像清单,如下图所示。

Container Registry 映像页面上的映像清单。

如果打开代码库列表中的测试代码库,您将看到属于测试代码库的所有容器映像版本,如下图所示。

映像版本列表。

您可以打开标记为最新的映像以打开摘要详情页面,查看该映像的相关详情,如下图所示。

映像的摘要详情。

摘要详情页面中,您可以展开清单部分,验证文件中声明了构建创建的整个目标架构,如下例所示:

{
  "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
  "schemaVersion": 2,
  "manifests": [
     {
        "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
        "digest": "sha256:839024acb1038509e3bc66f3744857840951d0d512be54fd6670ea1e8babdcb6",
        "size": 735,
        "platform": {
           "architecture": "amd64",
           "os": "linux"
        }
     },
     {
        "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
        "digest": "sha256:33489767c29efb805e446a61d91cc55e042d3cfadcd186d9a1c8698f2f12309d",
        "size": 735,
        "platform": {
           "architecture": "arm64",
           "os": "linux"
        }
     },
     {
        "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
        "digest": "sha256:f1958815778ca8c83d324bad3fc68a9e3e9d5ea48b5bb27a8aca7d8da20cf8d4",
        "size": 735,
        "platform": {
           "architecture": "arm",
           "os": "linux",
           "variant": "v7"
        }
     }
  ]
}

您还可以直接从 Cloud Shell 查看映像清单。

  • 在 Cloud Shell 中,显示映像清单:

    DOCKER_CLI_EXPERIMENTAL=enabled docker manifest inspect gcr.io/"${DEVSHELL_PROJECT_ID}"/test:latest
    

    输出与您可以在摘要详情页面上展开的清单文件相同。

通过构建流水线配置持续部署

要为新硬件架构构建容器映像,请通过添加新的目标架构来修改构建配置文件。在您提交更改并将更改推送到 Cloud Source Repositories 中的源代码库后,Cloud Build 会启动新构建。此构建会生成新版多架构容器映像,包括对新添加的硬件架构的支持。

  1. 在 Cloud Shell 中,将新的目标平台添加到构建配置文件中:

    cd "$HOME"/cross-build
    sed -i -e 's/linux\/arm\/v7/linux\/arm\/v7,linux\/386/g' build-docker-image-trigger.yaml
    
  2. 提交更改并将其推送到源代码库:

    git add .
    git commit -m "add a new target platform"
    git push
    
  3. 查看最新清单,以验证新目标平台是否属于最新容器映像:

    DOCKER_CLI_EXPERIMENTAL=enabled docker manifest inspect gcr.io/${DEVSHELL_PROJECT_ID}/test:latest
    
  4. 验证新添加的目标平台是否在清单文件中,类似于以下输出:

    {
      "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
      "schemaVersion": 2,
      "manifests": [
         {
            "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
            "digest": "sha256:bc80d063fccb4c370df9b505cbf4f8a814a366d99644de09ebee98af2ef0ff63",
            "size": 735,
            "platform": {
               "architecture": "amd64",
               "os": "linux"
            }
         },
         {
            "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
            "digest": "sha256:be10e4f01f529149815ebad7eb09edaa84ebef5b7d70d51f7d1acb5ceb1f61cd",
            "size": 735,
            "platform": {
               "architecture": "arm64",
               "os": "linux"
            }
         },
         {
            "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
            "digest": "sha256:f6ba5d5d3bc1ea0177e669517ea15a0d4fb97c06c7eca338afa43734d87af779",
            "size": 735,
            "platform": {
               "architecture": "arm",
               "os": "linux",
               "variant": "v7"
            }
         },
         {
            "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
            "digest": "sha256:a3c34621cca10974026f8ad0782af78539cd7bb0ebfa0082a27b2c3ed4418ca0",
            "size": 735,
            "platform": {
               "architecture": "386",
               "os": "linux"
            }
         }
      ]
    }
    

清理

避免产生费用的最简单方法是删除您为本教程创建的 Google Cloud 项目。或者,您也可以删除各个资源。

删除项目

  1. 在 Google Cloud 控制台中,进入管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

逐个删除资源

如果您要保留本教程中使用的项目,请执行以下步骤,删除您在本教程中创建的资源。

  1. 在 Cloud Shell 中,删除容器映像:

    gcloud container images delete gcr.io/${DEVSHELL_PROJECT_ID}/test --quiet
    
  2. 删除您使用 Terraform 预配的资源:

    cd $HOME/solutions-build-multi-architecture-images-tutorial/terraform
    terraform destroy
    
  3. 输入 yes 以确认删除。

后续步骤