自动重建容器映像,以同步基础映像更新


借助 Cloud Workstations,您可以为工作站创建和使用自定义映像。使用自定义映像后,自动重新构建自定义映像有助于提取基础映像中提供的修复和更新。

在本教程中,您将了解如何构建自动化流水线,以帮助确保在自定义工作站映像中添加安全更新和补丁。

目标

按照本教程进行操作,您将按照以下步骤为基础映像构建自动化流水线:

  1. 创建 Artifact Registry 代码库以存储和扫描您的自定义映像。
  2. 使用 Google Cloud 配置 GitHub 以存储您的映像配置。
  3. 创建 Cloud Build 触发器以自动创建自定义映像并将其部署到 Artifact Registry。
  4. 配置 Cloud Scheduler 以定期启动构建。
  5. 查看自动化流程的结果。

费用

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

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

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

准备工作

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  4. 启用 Artifact Registry、Container Scanning API、Cloud Build 和 Cloud Scheduler API。

    启用 API

  5. 安装 Google Cloud CLI。
  6. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  9. 启用 Artifact Registry、Container Scanning API、Cloud Build 和 Cloud Scheduler API。

    启用 API

  10. 安装 Google Cloud CLI。
  11. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init

准备环境

在继续操作之前,请确保已设置以下环境变量。

  1. 为您计划使用的 Cloud 项目设置项目 ID:

    PROJECT_ID=$PROJECT_ID
    
  2. 设置您计划用于存储代码库的 GitHub 用户名:

    GITHUB_USER=$GITHUB_ID
    
  3. 设置要在整个过程中使用的 PROJECT_NUMBERREGION 变量:

    PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID \
        --format='value(projectNumber)')
    
    REGION=$REGION
    

    在前面的示例中,将 $REGION 替换为您打算使用的区域名称(例如 us-central1)。

    如需详细了解可用区域,请参阅 Cloud Workstations 位置

创建 Artifact Registry 代码库

在本教程中,您将使用 Artifact Registry 存储和扫描映像。

  1. 使用以下命令创建代码库:

    gcloud artifacts repositories create custom-images \
          --repository-format=docker \
          --location=$REGION \
          --description="Docker repository"
    

    $REGION 替换为您打算使用的区域名称。

  2. 将 Docker 配置为使用您的 gcloud CLI 凭据访问 Artifact Registry。

    gcloud auth configure-docker $REGION-docker.pkg.dev
    

    如需关闭 Artifact Analysis,请运行以下命令:

    gcloud services disable containerscanning.googleapis.com
    

配置 GitHub 代码库

在实际使用中,您需要将自定义映像的 Dockerfile 保存在 Git 代码库中。自动化过程会在构建流程中访问该代码库,以拉取相关配置和 Dockerfile。

复刻示例代码库

如需对提供容器定义的示例代码库进行复刻,请按以下步骤操作:

  1. 点击此链接为 software-delivery-workshop 代码库创建新分支
  2. 如果系统提示,请登录 GitHub。
  3. 选择您的 GitHub 用户名作为 Owner。代码库名称显示为 software-delivery-workshop
  4. 点击创建分支,然后等待几秒钟,以便此过程完成。

将 Cloud Build 关联到 GitHub

接下来,使用内置的 GitHub 连接功能将该代码库连接到 Cloud Build。点击指向 GitHub 代码库的链接,然后按照说明完成该过程的说明进行操作。您无需在向导的最后一步中创建触发器,并且可以跳过最后的步骤,因为稍后您可以从命令行创建触发器。

如果您使用其他 Git 代码库解决方案,也可以按照说明将 Cloud Build 连接到 GitLabBitbucket

创建 Cloud Build 触发器

示例代码库包含容器定义和用于构建容器映像的 Cloud Build 配置。在此步骤中,您将创建一个 Cloud Build 触发器,用于运行 cloudbuild.yaml 文件中的说明,该文件位于 labs/cloudbuild-scheduled-jobs/code-oss-java 文件夹中。

gcloud builds triggers create manual \
    --name=custom-image-trigger \
    --repo=$GITHUB_USER/software-delivery-workshop \
    --repo-type=GITHUB \
    --branch=main \
    --build-config=labs/cloudbuild-scheduled-jobs/code-oss-java/cloudbuild.yaml \
    --substitutions=_REGION=$REGION,_AR_REPO_NAME=custom-images,_AR_IMAGE_NAME=code-oss-java,_IMAGE_DIR=labs/cloudbuild-scheduled-jobs/code-oss-java

TRIGGER_ID=$(gcloud builds triggers list \
    --filter=name="custom-image-trigger" --format="value(id)")

此示例进行了以下配置:

  • gcloud CLI 命令会在 Cloud Build 中创建一个名为 custom-image-trigger手动触发器,如第二行的 name 标志所示。
  • 接下来三行包含与 GitHub 源代码代码库相关的标志:
  • build-config 标志指示 Git 代码库中 Cloud Build 文件的路径。
  • 如需将作业设为动态,请使用 substitutions 标志。对于此作业,该命令会传入以下变量:

    • 区域,$_REGION
    • Artifact Registry 代码库名称,$_AR_REPO_NAME
    • 容器映像名称,$_AR_IMAGE_NAME
    • 要构建的 Dockerfile 的位置,$_IMAGE_DIR

    请查看 cloudbuild.yaml 文件,以了解这些变量在此过程中的使用方式。

  • 创建触发器后,系统会检索触发器的唯一名称,并将其存储在 $TRIGGER_ID 环境变量中以供日后使用。

配置 Cloud Scheduler

为帮助确保您的映像是最新的更新和补丁程序,请使用 Cloud Scheduler 按设置的频率执行 Cloud Build 触发器。在本教程中,该作业每天运行。在实践中,请将其设置为与您的组织需求相符的频率,以帮助确保始终包含最新的更新。

  1. 向默认服务帐号授予所需的角色以调用 Cloud Build 触发器:

    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
        --role="roles/cloudbuild.builds.editor"
    
  2. 向 Cloud Build 服务帐号授予所需的角色,以将映像上传到 Artifact Registry:

    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member=serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
        --role="roles/artifactregistry.admin"
    
  3. 使用以下命令创建 Cloud Scheduler 作业:

    gcloud scheduler jobs create http run-build \
        --schedule='0 1 * * *' \
        --uri=https://cloudbuild.googleapis.com/v1/projects/$PROJECT_ID/locations/global/triggers/$TRIGGER_ID:run \
        --location=us-central1 \
        --oauth-service-account-email=$PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --oauth-token-scope=https://www.googleapis.com/auth/cloud-platform
    
  4. 该作业设置为每天执行一次;但是,如需立即测试该功能,请通过 Cloud Scheduler 手动运行该作业:

    转到 Cloud Scheduler

    1. 在 Cloud Scheduler 页面上,找到您刚刚创建的名为 run-build 的条目。
    2. 在“操作”列中,点击该行对应的 more_vert 选项菜单。
    3. 点击强制运行作业以手动测试系统。
    4. 命令成功执行后,切换到 Cloud Build 历史记录页面以查看进度:

      转到 Cloud Build 历史记录

查看结果

由于您在设置过程中启用了 Container Scanning API,因此 Artifact Registry 会自动扫描映像是否存在安全漏洞。

如需查看这些漏洞,请执行以下操作:

  1. 打开 Artifact Registry 代码库页面:

    转到 Artifact Registry 代码库

  2. 在代码库列表中,点击一个代码库。

  3. 点击图片名称。漏洞列中会显示每个映像摘要的漏洞总数。

    显示示例映像名称的 Artifact Registry 代码库页面

  4. 如需查看映像的漏洞列表,请点击漏洞列中的链接。漏洞列表会显示漏洞的严重程度、可修复情况以及包含漏洞的软件包的名称。

    显示漏洞示例列表的 Artifact Registry 漏洞列表

清理

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

为避免系统因此页面中使用的资源向您的 Google Cloud 帐号收取费用,请务必删除不再需要的资源。

如需从 Google Cloud 控制台或 gcloud CLI 中删除 Google Cloud 项目,请执行以下操作:

控制台

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

    转到“管理资源”

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

gcloud

    删除 Google Cloud 项目:

    gcloud projects delete PROJECT_ID

如需详细了解如何删除其他资源(例如工作站集群、工作站配置和工作站),请参阅删除资源

后续步骤