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


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

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

目标

按照本教程中的步骤,您可以为基础映像构建自动化流水线:

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

费用

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

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

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

准备工作

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Artifact Registry, Container Scanning API, Cloud Build, and Cloud Scheduler APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    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. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Artifact Registry, Container Scanning API, Cloud Build, and Cloud Scheduler APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init

准备环境

在继续操作之前,请务必设置以下环境变量。

  1. 为您计划使用的云项目设置项目 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 配置为在访问 Artifact Registry 时使用您的 gcloud CLI 凭据。

    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 用户名作为所有者。代码库名称显示为 software-delivery-workshop
  4. 点击创建分支,然后等待几秒钟,让该过程完成。

将 Cloud Build 连接到 GitHub

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

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

创建 Cloud Build 触发器

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

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. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

gcloud

    Delete a Google Cloud project:

    gcloud projects delete PROJECT_ID

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

后续步骤