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

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

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

准备环境

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

  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. 点击创建 Fork,然后等待几秒钟,让该流程完成。

将 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. 点击 Force a job run(强制运行作业)以手动测试系统。
    4. 命令成功执行后,切换到 Cloud Build 历史记录页面以查看进度:

      转到 Cloud Build 历史记录

查看结果

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

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

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

    前往 Artifact Registry 制品库

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

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

    Artifact Registry 代码库页面,其中显示了示例映像名称

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

    Artifact Registry“漏洞”页面,其中显示了漏洞列表示例