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


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

在本教程中,您将了解如何构建自动化流水线, 在自定义工作站映像中包含安全更新和补丁。

目标

按照本教程的说明,您可以为基础映像构建自动化流水线 具体步骤如下:

  1. 创建 Artifact Registry 制品库以存储和扫描自定义映像。
  2. 将 GitHub 与 Google Cloud 配置为存储映像配置。
  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. 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. 确保您的 Google Cloud 项目已启用结算功能

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

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

    如需关闭工件分析,请运行以下命令:

    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

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

后续步骤