使用 CI/CD 流水线开发和部署容器化应用

Last reviewed 2022-11-18 UTC

本部署指南介绍了如何使用一组集成的 Google Cloud 工具来设置和使用开发、持续集成 (CI) 和持续交付 (CD) 系统。您可以使用此系统开发应用并将其部署到 Google Kubernetes Engine (GKE)。

本指南介绍了如何创建用于开发和交付容器化应用的部署流水线中所述的架构。

本部署指南适用于软件开发者和运维人员,完成之后,您将担任以下角色:

  • 首先,您充当操作者来设置 CI/CD 流水线。此流水线的主要组件是 Cloud BuildArtifact RegistryCloud Deploy
  • 然后,以开发者的身份使用 Cloud Code 更改应用。作为开发者,您会看到此流水线提供的集成式体验。
  • 最后,您将充当操作员,并完成将应用部署到生产环境的步骤。

本部署指南假定您熟知如何在 Google Cloud 上运行 gcloud 命令,以及如何将应用容器部署到 GKE。

架构

下图展示了此部署指南中使用的资源:

使用 Cloud Code、Cloud Build、Artifact Registry、Cloud Deploy 和 GKE 开发和部署系统

如需详细了解此架构中使用的组件,请参阅用于开发和交付容器化应用的部署流水线

目标

作为操作员,您可以执行以下操作:

  • 设置 CI 流水线和 CD 流水线。此设置包括以下内容:
    • 设置所需的权限。
    • 为预演环境和生产环境创建 GKE 集群。
    • 在 Cloud Source Repositories 中为源代码创建代码库。
    • 在 Artifact Registry 中为应用容器创建代码库。
    • 在 GitHub 主代码库上创建 Cloud Build 触发器。
    • 创建 Cloud Deploy 交付流水线和目标。目标是预演环境和生产环境。
  • 启动 CI/CD 流程以部署到预演环境,然后提升到生产环境。

作为开发者,您可以对应用进行更改。为此,请执行以下操作:

  • 克隆代码库以使用预配置的开发环境。
  • 在开发者工作区中对应用进行更改。
  • 构建和测试更改。这些测试包括针对治理的验证测试。
  • 查看并验证开发集群中的更改。此集群在 minikube 上运行。
  • 将更改提交到主代码库中。

费用

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

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

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

准备工作

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  3. Enable the Artifact Registry, Cloud Build, Cloud Deploy, Cloud Source Repositories, Google Kubernetes Engine, Resource Manager, and Service Networking APIs.

    Enable the APIs

  4. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

准备环境

在本部分中,您将充当应用操作员并执行以下操作:

  • 设置所需的权限。
  • 为预演环境和生产环境创建 GKE 集群。
  • 克隆源代码库。
  • 在 Cloud Source Repositories 中为源代码创建代码库。
  • 在 Artifact Registry 中为容器应用创建一个代码库。

设置权限

在本部分中,您将授予设置 CI/CD 流水线所需的权限。

  1. 如果您使用的是 Cloud Shell Editor 的新实例,请指定要用于本部署指南的项目:

    gcloud config set project PROJECT_ID
    

    PROJECT_ID 替换为您为本部署指南选择或创建的项目的 ID。

    如果出现对话框,请点击授权

  2. 确保默认 Compute Engine 服务账号拥有在 Cloud Deploy 中运行作业并从 Artifact Registry 中拉取容器的足够权限。Cloud Build 和 Cloud Deploy 使用此默认服务账号。

    此服务账号可能已经拥有必要的权限。 此步骤可确保为针对默认服务账号停用自动角色授予的项目授予必要的权限。

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
        --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
        --role="roles/clouddeploy.jobRunner"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
        --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
        --role="roles/artifactregistry.reader"
    
  3. 授予 Cloud Build 服务账号使用 Cloud Deploy 调用部署以及更新交付流水线和目标定义的权限:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
        --format="value(projectNumber)")@cloudbuild.gserviceaccount.com \
        --role="roles/clouddeploy.operator"
    

    如需详细了解此 IAM 角色,请参阅 clouddeploy.operator 角色。

  4. 授予 Cloud Build 和 Cloud Deploy 服务账号部署到 GKE 的权限:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
        --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
        --role="roles/container.admin"
    

    如需详细了解此 IAM 角色,请参阅 container.admin 角色。

  5. 向 Cloud Build 服务账号授予调用 Cloud Deploy 操作所需的权限:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
        --format="value(projectNumber)")@cloudbuild.gserviceaccount.com \
        --role="roles/iam.serviceAccountUser"
    

    Cloud Build 调用 Cloud Deploy 时,会使用 Compute Engine 服务账号创建版本,因此需要此权限。

    如需详细了解此 IAM 角色,请参阅 iam.serviceAccountUser 角色。

现在,您已被授予 CI/CD 流水线所需的权限。

创建 GKE 集群

在本部分中,您将创建预演环境和生产环境,它们都是 GKE 集群。(您无需在此处设置开发集群,因为它使用 minikube)。

  1. 创建预演和生产 GKE 集群:

    gcloud container clusters create-auto staging \
        --region us-central1 \
        --project=$(gcloud config get-value project) \
        --async
    
    gcloud container clusters create-auto prod \
        --region us-central1 \
        --project=$(gcloud config get-value project) \
        --async
    

    在暂存集群中,您可以测试对代码所做的更改。确认预演环境中的部署不对应用产生负面影响后,即可部署到生产环境。

  2. 运行以下命令,并确保输出具有预演集群和生产集群的 STATUS: RUNNING

    gcloud container clusters list
    
  3. 检索预演集群和生产集群的 kubeconfig 文件的凭据。

    gcloud container clusters get-credentials staging --region us-central1
    
    gcloud container clusters get-credentials prod --region us-central1
    

    您可以使用这些凭据与 GKE 集群进行交互,例如检查应用是否正常运行。

现在,您已经为预演和生产环境创建了 GKE 集群。

打开 IDE 并克隆代码库

如需克隆代码库并在开发环境中查看应用,请执行以下操作:

  1. 将 GitHub 代码库克隆到 Cloud Shell。

    在 Cloud Shell 中打开

  2. 点击确认

    Cloud Shell Editor 会打开并克隆示例代码库。

    现在,您可以在 Cloud Shell Editor 中查看应用的代码。

  3. 指定要用于本部署指南的项目:

    gcloud config set project PROJECT_ID
    

    如果出现对话框,请点击授权

现在,您已拥有开发环境中应用的源代码。

此源代码库包含 CI/CD 流水线所需的 Cloud Build 和 Cloud Deploy 文件。

为源代码和容器创建代码库

在本部分中,您将在 Cloud Source Repositories 中设置源代码的代码库,并在 Artifact Registry 中设置代码库,用于存储 CI/CD 流水线构建的容器。

  1. 在 Cloud Source Repositories 中创建一个代码库来存储源代码并将其与 CI/CD 过程关联:

    gcloud source repos create cicd-sample
    
  2. 确保 Cloud Deploy 配置指向正确的项目:

    sed -i s/project-id-placeholder/$(gcloud config get-value project)/g deploy/*
    git config --global credential.https://source.developers.google.com.helper gcloud.sh
    git remote add google https://source.developers.google.com/p/$(gcloud config get-value project)/r/cicd-sample
    
  3. 将源代码推送到代码库:

    git push --all google
    
  4. 在 Artifact Registry 中创建映像代码库:

    gcloud artifacts repositories create cicd-sample-repo \
        --repository-format=Docker \
        --location us-central1
    

您现在已经有了 Cloud Source Repositories 中的源代码库和 Artifact Registry 中的应用容器的代码库。借助 Cloud Source Repositories 代码库,您可以克隆源代码并将其连接到 CI/CD 流水线。

配置 CI/CD 流水线

在本部分中,您将充当应用操作员并配置 CI/CD 流水线。该流水线使用 Cloud Build 实现 CI,使用 Cloud Deploy 实现 CD。流水线的步骤在 Cloud Build 触发器中定义。

  1. 为 Cloud Build 创建一个 Cloud Storage 存储桶以存储 artifacts.json 文件(用于跟踪 Skaffold 为每个版本生成的工件):

    gcloud storage buckets create gs://$(gcloud config get-value project)-gceme-artifacts/
    

    将每个版本的 artifacts.json 文件存储在一个集中位置是一种很好的做法,因为它提供了可跟踪性,可以简化问题排查。

  2. 查看 cloudbuild.yaml 文件,该文件定义了 Cloud Build 触发器且已在您克隆的源代码代码库中配置。

    此文件定义了每当有源代码推送到源代码库的主分支时调用的触发器。

    cloudbuild.yaml 文件中定义了 CI/CD 流水线的以下步骤:

    • Cloud Build 使用 Skaffold 构建应用容器。

    • Cloud Build 将构建的 artifacts.json 文件放在 Cloud Storage 存储桶中。

    • Cloud Build 将应用容器放在 Artifact Registry 中。

    • Cloud Build 在应用容器上运行测试。

    • gcloud deploy apply 命令可向 Cloud Deploy 服务注册以下文件:

      • deploy/pipeline.yaml,这是交付流水线
      • deploy/staging.yamldeploy/prod.yaml,这是目标文件

      注册文件后,Cloud Deploy 会创建流水线和目标(如果它们尚不存在),并在配置发生更改时重新创建。目标是预演环境和生产环境。

    • Cloud Deploy 为交付流水线创建新版本。

      此版本引用在 CI 过程中构建和测试的应用容器。

    • Cloud Deploy 会将版本部署到预演环境。

    交付流水线和目标由 Cloud Deploy 管理,并与源代码分离。这种分离意味着当应用的源代码发生更改时,您无需更新交付流水线和目标文件。

  3. 创建 Cloud Build 触发器:

    gcloud beta builds triggers create cloud-source-repositories \
        --name="cicd-sample-main" \
        --repo="cicd-sample" \
        --branch-pattern="main" \
        --build-config="cloudbuild.yaml"
    

    此触发器会告知 Cloud Build 监控源代码库并使用 cloudbuild.yaml 文件来响应代码库的任何更改。每当有新推送到主分支时,都会调用此触发器。

  4. 转到 Google Cloud 控制台中的“Cloud Build”页面。

    转至 Cloud Build

    请注意,没有适用于您的应用的 build。

现在,您已经设置了 CI 和 CD 流水线,并在代码库的主分支上创建了一个触发器。

在开发者工作区中对您的应用进行更改

在本部分中,您将充当应用开发者。

在开发应用时,您可以使用 Cloud Code 作为开发工作区,对应用进行迭代更改并验证:

  • 对应用进行更改。
  • 构建并测试新代码。
  • 将应用部署到 minikube 集群,并验证面向用户的更改。
  • 将更改提交到主代码库。

当此更改提交到主代码库时,Cloud Build 触发器会启动 CI/CD 流水线。

构建、测试和运行应用

在本部分中,您将构建、测试、部署和访问应用。

使用您在上一部分中使用的 Cloud Shell Editor 实例。如果您关闭了编辑器,则在浏览器中转到 ide.cloud.google.com,以打开 Cloud Shell Editor。

  1. 在终端中,启动 minikube:

    minikube start
    

    minikube 在您的 Cloud Shell 中设置本地 Kubernetes 集群。此操作需要几分钟时间才能完成。minikube 进程完成后,该进程会在 Cloud Shell 实例上在后台运行。

  2. 在 Cloud Shell Editor 底部的窗格中,选择 Cloud Code

  3. 在终端和编辑器之间显示的精简面板中,选择在 Kubernetes 上运行

    如果您看到一条提示“Use current context (minikube) to run the app?”,请点击

    此命令会构建源代码并运行测试。此过程可能需要几分钟的时间。测试包括单元测试和预配置的验证步骤,用于检查为部署环境设置的规则。这样可以确保您仍在开发环境中工作时收到有关部署问题的警告。

    输出标签页显示 Skaffold 在构建和部署应用时的进度。

    此标签在整个部分中保持打开状态

    构建和测试完成后,输出标签页将显示 Update succeeded,并显示两个网址。

    构建和测试应用时,Cloud Code 会流式传回输出标签页中的日志和网址。在开发环境中进行更改并运行测试时,您可以查看开发环境的应用版本,并验证其是否正常运行。

    输出结果还会显示 Watching for changes...,这意味着已启用观察模式。当 Cloud Code 处于观察模式时,该服务会检测代码库中所有已保存的更改,并自动重建应用并重新部署包含最新更改的应用。

  4. 在 Cloud Code 终端中,将指针悬停在输出中的第一个网址 (http://localhost:8080) 上。

  5. 在显示的工具提示中,选择打开网页预览

    在后台,Cloud Code 会自动将流量转发到在 minikube 上运行的 cicd-sample 服务。

  6. 在浏览器中,刷新页面。

    计数器旁边的数字会增加,表示应用正在响应您的刷新。

    在浏览器中,让此页面保持打开状态,以便在本地环境中进行任何更改时查看该应用。

您现在已在开发环境中构建和测试应用。 您已将应用部署到在 minikube 上运行的开发集群中,并查看应用面向用户的行为。

更改

在本部分中,您将对应用进行更改,并在应用在开发集群中运行时查看更改。

  1. 在 Cloud Shell Editor 中,打开 index.html 文件。

  2. 搜索字符串 Sample App Info 并将其更改为 sample app info,以便标题现在使用小写字母。

    该文件会自动保存,从而触发应用容器的重新构建。

    Cloud Code 会检测更改并自动重新部署。输出标签页显示 Update initiated。此重新部署需要几分钟时间才能完成。

    此自动重新部署功能适用于在 Kubernetes 集群上运行的任何应用。

  3. 构建完成后,转到已打开应用的浏览器,然后刷新页面。

    刷新时,您会看到该文本现在使用小写字母。

此设置允许您使用任何组件自动重新加载任何架构。当您使用 Cloud Code 和 minikube 时,在 Kubernetes 中运行的任何内容都具有此热代码重新加载功能。

您可以调试在 Cloud Code 中部署到 Kubernetes 集群的应用。本部署指南中未介绍这些步骤,但如需了解详情,请参阅调试 Kubernetes 应用

提交代码

现在,您已经对应用进行了更改,接下来可以提交代码了。

  1. 配置您的 Git 身份:

    git config --global user.email "YOU@EXAMPLE.COM"
    git config --global user.name "NAME"
    

    请替换以下内容:

    • YOU@EXAMPLE.COM:与您的 GitHub 账号关联的电子邮件地址。
    • NAME:与您的 GitHub 账号关联的名称。
  2. 从终端提交代码:

    git add .
    git commit -m "use lowercase for: sample app info"
    

    您无需在此处运行 git push 命令。以后再说。

在开发环境中,您现在已经对应用进行了更改,构建并测试了更改,并验证了向用户显示的这些更改行为。开发环境中的测试包括治理检查,可让您解决导致生产环境出现问题的问题。

在本部署指南中,当您将代码提交到主代码库时,无需进行代码审核。但是,审核代码或批准更改是推荐的软件开发流程。

如需详细了解变更审核流程的最佳实践,请参阅简化变更审核流程

将更改部署到生产环境

在本部分中,您将充当应用操作员并执行以下操作:

  • 触发 CI/CD 流水线,该流水线会将版本部署到预演环境。
  • 提升并批准发布到生产环境。

启动 CI/CD 流水线并部署到预演环境

在本部分中,您将通过调用 Cloud Build 触发器来启动 CI/CD 流水线。每当有更改提交到主代码库时,系统都会调用此触发器。您还可以使用手动触发器启动 CI 系统。

  1. 在 Cloud Shell Editor 中,运行以下命令以触发构建:

    git push google
    

    此构建包含您对 cicd-sample 所做的更改。

  2. 返回 Cloud Build 信息中心,查看构建是否已创建。

  3. 点击右侧构建日志中的 Running: cicd-sample - cicd-sample-main,并查找用于表示每个步骤开始和结束的蓝色文本。

    步骤 0 显示 cloudbuild.yaml 文件中的 skaffold buildskaffold test 指令的输出。步骤 0 中的构建和测试任务(流水线的 CI 部分)已通过,因此步骤 1 中的部署任务(流水线的 CD 部分)。

    此步骤已完成,并显示以下消息:

    Created Cloud Deploy rollout ROLLOUT_NAME in target staging

  4. 打开 Cloud Deploy 交付流水线页面,然后点击 cicd-sample delivery 流水线。

    应用部署在预演环境中,而不是生产环境中。

  5. 验证应用是否可在预演环境中成功运行:

    kubectl proxy --port 8001 --context gke_$(gcloud config get-value project)_us-central1_staging
    

    此命令会设置 kubectl 代理以访问应用。

  6. 从 Cloud Shell 访问应用:

    1. 在 Cloud Shell Editor 中,打开一个新终端标签页。

    2. localhost 发送请求以增加计数器:

      curl -s http://localhost:8001/api/v1/namespaces/default/services/cicd-sample:8080/proxy/ | grep -A 1 Counter
      

      您可以多次运行此命令,并观察计数器值每次递增。

      查看应用时,请注意您更改的文本位于您在语言环境中部署的应用版本中。

    3. 关闭第二个标签页。

    4. 在第一个标签页中,按 Control+C 以停止代理。

现在,您已调用 Cloud Build 触发器来启动 CI 过程,其中包括构建应用、将其部署到预演环境以及运行测试以验证应用是否在预演环境中正常工作。

当代码构建和测试在预演环境中通过时,CI 过程就会成功。CI 过程成功后,将在 Cloud Deploy 中启动 CD 系统。

将版本提升到生产环境

在本部分中,您将版本从预演环境提升到生产环境。生产环境目标已预先配置为需要批准,因此您需要手动批准。

对于您自己的 CI/CD 流水线,您可能需要使用部署策略,即在完全部署到生产环境之前逐步启动部署。逐步启动部署可以更轻松地检测问题,并在需要时恢复先前版本。

如需将该版本提升到生产环境,请执行以下操作:

  1. 打开 Cloud Deploy 交付流水线概览,然后选择 cicd-sample 流水线。

  2. 将部署从预演环境提升到生产环境。若要进行测试,请按以下步骤操作:

    1. 在页面顶部的流水线图中,点击预演框中的蓝色提升按钮。

    2. 在打开的窗口中,点击底部的提升按钮。

    部署尚未在生产环境中运行。正在等待手动批准。

  3. 手动批准部署:

    1. 在流水线可视化中,点击预演和生产框之间的审核按钮。

    2. 在打开的窗口中,点击审核按钮。

    3. 在下一个窗口中,点击批准

    4. 返回到 Cloud Deploy 交付流水线概览,然后选择 cicd-sample 流水线。

  4. 在流水线可视化将 prod 框显示为绿色(表示成功发布)后,通过设置用于访问应用的 kubectl 代理来验证应用是否在生产环境中正常运行:

    kubectl proxy --port 8002 --context gke_$(gcloud config get-value project)_us-central1_prod
    
  5. 从 Cloud Shell 访问应用:

    1. 在 Cloud Shell Editor 中,打开一个新终端标签页。

    2. 递增计数器:

      curl -s http://localhost:8002/api/v1/namespaces/default/services/cicd-sample:8080/proxy/ | grep -A 1 Counter
      

      您可以多次运行此命令,并观察计数器值每次递增。

    3. 关闭第二个终端标签页。

    4. 在第一个标签页中,按 Control+C 以停止代理。

您现在已经提升并批准生产部署。包含近期更改的应用现在在生产环境中运行。

清理

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

选项 1:删除项目

  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.

选项 2:删除单个资源

  1. 删除 Cloud Deploy 流水线:

    gcloud deploy delivery-pipelines delete cicd-sample --region=us-central1 --force
    
  2. 删除 Cloud Build 触发器:

    gcloud beta builds triggers delete cicd-sample-main
    
  3. 删除预演集群和生产集群:

    gcloud container clusters delete staging
    
    gcloud container clusters delete prod
    
  4. 在 Cloud Source Repositories 中删除代码库:

    gcloud source repos delete cicd-sample
    
  5. 删除 Cloud Storage 存储桶:

    gcloud storage rm -r gs://$(gcloud config get-value project)-gceme-artifacts/
    
    gcloud storage rm -r gs://$(gcloud config get-value project)_clouddeploy/
    
  6. 删除 Artifact Registry 中的代码库:

    gcloud artifacts repositories delete cicd-sample-repo \
        --location us-central1
    

后续步骤