本教程介绍了如何使用一组集成的 Google Cloud 工具来设置和使用开发、持续集成 (CI) 和持续交付 (CD) 系统。您可以使用此系统开发应用并将其部署到 Google Kubernetes Engine (GKE)。
本教程适用于软件开发者和操作员,您在完成本教程的过程中需要扮演这两个角色。首先,您充当操作者来设置 CI/CD 流水线。此流水线的主要组件是 Cloud Build、Artifact Registry 和 Google Cloud Deploy。
然后,以开发者的身份使用 Cloud Code 更改应用。作为开发者,您会看到此流水线提供的集成式体验。
最后,您将充当操作员,并完成将应用部署到生产环境的步骤。
本教程假定您熟知如何在 Google Cloud 上运行 gcloud
命令,以及如何将应用容器部署到 GKE。
以下是此集成式系统的主要功能:
更快地开发和部署。
开发循环非常高效,因为您可以在开发者工作区中验证更改。部署速度快,因为自动化 CI/CD 系统和跨环境的对等性让您在将更改部署到生产环境时可以检测更多问题。
开发、预演和生产中更高的对等性也让您受益匪浅。
此系统的组件使用一组通用的 Google Cloud 工具。
在不同环境中重复使用配置。
此重复使用操作通过 Skaffold 完成,它提供了一种适用于不同环境的通用配置格式。它还允许开发者和运营商更新并使用相同的配置。
在工作流中尽早应用治理。
该系统在生产环境以及 CI 系统和开发环境中针对治理应用验证测试。通过在开发环境中应用治理,您可以尽早发现并解决问题。
使用专业工具来管理软件交付。
持续交付是完全代管的,将 CD 流水线的各个阶段与渲染和部署的详细信息分开。
架构概览
下图显示了本教程中使用的资源:
此流水线的三个主要组件是:
Cloud Code,作为开发工作区
作为此工作区的一部分,您可以看到在 minikube 上运行的开发集群中的更改。您可以在 Cloud Shell 中运行 Cloud Code 和 minikube 集群。Cloud Shell 是一个可从浏览器访问的在线开发环境。它包含计算资源、内存、集成开发环境 (IDE),还安装了 Cloud Code。
Cloud Build,用于构建和测试应用,即流水线的“CI”部分
流水线的这一部分包括以下操作:
- Cloud Build 使用 Cloud Build 触发器监控源代码库的更改。
- 当更改提交到主分支后,Cloud Build 触发器将执行以下操作:
- 重新构建应用容器。
- 将构建工件放在 Cloud Storage 存储桶中。
- 将应用容器放入 Artifact Registry 中。
- 在容器上运行测试。
- 调用 Google Cloud Deploy 以将容器部署到预演环境。在本教程中,预演环境是 Google Kubernetes Engine 集群。
- 如果构建和测试成功,则您可以使用 Google Cloud Deploy 将容器从预演环境提升到生产环境。
Google Cloud Deploy,用于管理部署,即流水线的“CD”部分
在流水线的这一部分中,Google Cloud Deploy 执行以下操作:
Skaffold,一个命令行工具,有助于为 Kubernetes 原生应用持续开发,充当这些基础组件的基础,允许在开发、预演和生产之间共享配置环境。
Google Cloud 将应用的源代码存储在 GitHub 中,在本教程中,您需要将该代码库克隆到 Cloud Source Repositories 中,以将其连接到 CI/CD 流水线。
本教程将 Google Cloud 产品用于系统的大多数组件,而 Skaffold 则允许集成系统。由于 Skaffold 是开源的,因此您可以根据这些原则,结合使用 Google Cloud、内部组件和第三方组件来创建类似的系统。此解决方案的模块化意味着您可以在开发和部署流水线中逐步采用此解决方案。
目标
作为操作员,您可以执行以下操作:
- 设置 CI 流水线和 CD 流水线。此设置包括以下内容:
- 设置所需的权限。
- 为预演环境和生产环境创建 GKE 集群。
- 在 Cloud Source Repositories 中为源代码创建代码库。
- 在 Artifact Registry 中为应用容器创建代码库。
- 在 GitHub 主代码库上创建 Cloud Build 触发器。
- 创建 Google Cloud Deploy 交付流水线和目标。目标是预演环境和生产环境。
- 启动 CI/CD 流程以部署到预演环境,然后提升到生产环境。
作为开发者,您可以对应用进行更改。为此,请执行以下操作:
- 克隆代码库以使用预配置的开发环境。
- 在开发者工作区中对应用进行更改。
- 构建和测试更改。这些测试包括针对治理的验证测试。
- 查看并验证开发集群中的更改。此集群在 minikube 上运行。
- 将更改提交到主代码库中。
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
- Cloud Build
- Google Cloud Deploy
- Artifact Registry
- Google Kubernetes Engine
- Cloud Source Repositories
- Cloud Storage
您可使用价格计算器根据您的预计使用情况来估算费用。
完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理。
准备工作
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
启用 Artifact Registry, Cloud Build, Google Cloud Deploy, Cloud Source Repositories, Google Kubernetes Engine, Resource Manager, and Service Networking API。
-
In the Google Cloud console, 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 流水线所需的权限。
如果您使用的是 Cloud Shell Editor 的新实例,请指定要用于本教程的项目:
gcloud config set project PROJECT_ID
将 PROJECT_ID 替换为您为本教程选择或创建的项目的 ID。
如果出现对话框,请点击授权。
为服务帐号授予所需的权限:
确保默认 Compute Engine 服务帐号拥有在 Google Cloud Deploy 中运行作业并从 Artifact Registry 中拉取容器的足够权限。Cloud Build 和 Google Cloud Deploy 使用此默认服务帐号。
此服务帐号可能已经拥有必要的权限。 此步骤可确保为针对默认服务帐号停用自动角色授予的项目授予必要的权限。
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")[email protected] \ --role="roles/clouddeploy.jobRunner" gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")[email protected] \ --role="roles/artifactregistry.reader"
授予 Cloud Build 服务帐号使用 Google 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 角色。
授予 Cloud Build 和 Google Cloud Deploy 服务帐号部署到 GKE 的权限:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")[email protected] \ --role="roles/container.admin"
如需详细了解此 IAM 角色,请参阅 container.admin 角色。
向 Cloud Build 服务帐号授予调用 Google 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 调用 Google Cloud Deploy 时,会使用 Compute Engine 服务帐号创建版本,因此需要此权限。
如需详细了解此 IAM 角色,请参阅 iam.serviceAccountUser 角色。
现在,您已授予 CI/CD 流水线所需的权限。
创建 GKE 集群
在本部分中,您将创建预演环境和生产环境,它们都是 GKE 集群。(您无需在此处设置开发集群,因为它使用 minikube)。
创建预演和生产 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
在暂存集群中,您可以测试对代码所做的更改。确认预演环境中的部署不对应用产生负面影响后,即可部署到生产环境。
运行以下命令,并确保输出具有预演集群和生产集群的
STATUS: RUNNING
:gcloud container clusters list
检索预演集群和生产集群的
kubeconfig
文件的凭据。您可以使用这些凭据与 GKE 集群进行交互,例如检查应用是否正常运行。
gcloud container clusters get-credentials staging --region us-central1
gcloud container clusters get-credentials prod --region us-central1
现在,您已经为预演和生产环境创建了 GKE 集群。
打开 IDE 并克隆代码库
如需克隆代码库并在开发环境中查看应用,请执行以下操作:
点击确认。
Cloud Shell Editor 会打开并克隆示例代码库。
现在,您可以在 Cloud Shell Editor 中查看应用的代码。
指定本教程中使用的项目:
gcloud config set project PROJECT_ID
如果出现对话框,请点击授权。
现在,您已拥有开发环境中应用的源代码。
此源代码库包含 CI/CD 流水线所需的 Cloud Build 和 Google Cloud Deploy 文件。
为源代码和容器创建代码库
在本部分中,您将在 Cloud Source Repositories 中设置源代码的代码库,并在 Artifact Registry 中设置代码库,用于存储 CI/CD 流水线构建的容器。
在 Cloud Source Repositories 中创建一个代码库来存储源代码并将其与 CI/CD 过程关联:
gcloud source repos create cicd-sample
确保 Google 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
将源代码推送到代码库:
git push --all google
在 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,使用 Google Cloud Deploy 实现 CD。流水线的步骤在 Cloud Build 触发器中定义。
为 Cloud Build 创建一个 Cloud Storage 存储桶以存储
artifacts.json
文件(用于跟踪 Skaffold 为每个版本生成的工件):gsutil mb gs://$(gcloud config get-value project)-gceme-artifacts/
将每个版本的
artifacts.json
文件存储在一个集中位置是一种很好的做法,因为它提供了可跟踪性,可以简化问题排查。查看
cloudbuild.yaml
文件,该文件定义了 Cloud Build 触发器且已在您克隆的源代码代码库中配置。此文件定义了每当有源代码推送到源代码库的主分支时调用的触发器。
CI/CD 流水线的步骤在此文件中定义:
Cloud Build 使用 Skaffold 构建应用容器。
Cloud Build 将构建的
artifacts.json
文件放在 Cloud Storage 存储桶中。Cloud Build 将应用容器放在 Artifact Registry 中。
Cloud Build 在应用容器上运行测试。
gcloud deploy apply
命令可向 Google Cloud Deploy 服务注册以下文件:deploy/pipeline.yaml
,这是交付流水线deploy/staging.yaml
和deploy/prod.yaml
,这是目标文件注册文件后,Google Cloud Deploy 会创建流水线和目标(如果它们尚不存在),并在配置发生更改时重新创建。目标是预演环境和生产环境。
Google Cloud Deploy 为交付流水线创建新版本。
此版本引用在 CI 过程中构建和测试的应用容器。
Google Cloud Deploy 会将版本部署到预演环境。
交付流水线和目标由 Google Cloud Deploy 管理,并与源代码分离。这种分离意味着当应用的源代码发生更改时,您无需更新交付流水线和目标文件。
创建 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
文件来响应代码库的任何更改。每当有新推送到主分支时,都会调用此触发器。转到 Cloud Build,并注意您的应用没有构建。
现在,您已经设置了 CI 和 CD 流水线,并在代码库的主分支上创建了一个触发器。
在开发者工作区中对您的应用进行更改
在本部分中,您将充当应用开发者。
在开发应用时,您可以使用 Cloud Code 作为开发工作区,对应用进行迭代更改并验证:
- 对应用进行更改。
- 构建并测试新代码。
- 将应用部署到 minikube 集群,并验证面向用户的更改。
- 将更改提交到主代码库。
当此更改提交到主代码库时,Cloud Build 触发器会启动 CI/CD 流水线。
构建、测试和运行应用
在本部分中,您将构建、测试、部署和访问应用。
使用您在上一部分中使用的 Cloud Shell Editor 实例。如果您关闭了编辑器,则在浏览器中导航到 ide.cloud.google.com,以打开 Cloud Shell Editor。
在终端中,启动 minikube:
minikube start
minikube 在您的 Cloud Shell 中设置本地 Kubernetes 集群。此操作需要几分钟时间才能完成。minikube 进程完成后,该进程会在 Cloud Shell 实例上在后台运行。
在 Cloud Shell Editor 底部的窗格中,选择 Cloud Code。
在终端和编辑器之间显示的精简面板中,选择在 Kubernetes 上运行。
如果您看到一条提示“
Use current context (minikube) to run the app?
”,请点击是。此命令会构建源代码并运行测试。此过程可能需要几分钟的时间。测试包括单元测试和预配置的验证步骤,用于检查为部署环境设置的规则。这样可以确保您仍在开发环境中工作时收到有关部署问题的警告。
输出标签页显示 Skaffold 在构建和部署应用时的进度。
此标签在整个部分中保持打开状态。
构建和测试完成后,输出标签页将显示
Update succeeded
,并显示两个网址。构建和测试应用时,Cloud Code 会流式传回输出标签页中的日志和网址。在开发环境中进行更改并运行测试时,您可以查看开发环境的应用版本,并验证其是否正常运行。
输出结果还会显示
Watching for changes...
,这意味着已启用观察模式。当 Cloud Code 处于观察模式时,该服务会检测代码库中所有已保存的更改,并自动重建应用并重新部署包含最新更改的应用。在 Cloud Code 终端中,将指针悬停在输出中的第一个网址 (
http://localhost:8080
) 上。在显示的工具提示中,选择打开网页预览。
在后台,Cloud Code 会自动将流量转发到在 minikube 上运行的
cicd-sample
服务。在浏览器中,刷新页面。
计数器旁边的数字会增加,表示应用正在响应您的刷新。
在浏览器中,让此页面保持打开状态,以便在本地环境中进行任何更改时查看该应用。
您现在已在开发环境中构建和测试应用。 您已将应用部署到在 minikube 上运行的开发集群中,并查看应用面向用户的行为。
更改
在本部分中,您将对应用进行更改,并在应用在开发集群中运行时查看更改。
在 Cloud Shell Editor 中,打开
index.html
文件。搜索字符串
Sample App Info
并将其更改为sample app info
,以便标题现在使用小写字母。该文件会自动保存,从而触发应用容器的重新构建。
Cloud Code 会检测更改并自动重新部署。输出标签页显示
Update initiated
。此重新部署需要几分钟时间才能完成。此自动重新部署功能适用于在 Kubernetes 集群上运行的任何应用。
构建完成后,转到已打开应用的浏览器,然后刷新页面。
刷新时,您会看到该文本现在使用小写字母。
此设置允许您使用任何组件自动重新加载任何架构。当您使用 Cloud Code 和 minikube 时,在 Kubernetes 中运行的任何内容都具有此热代码重新加载功能。
您可以调试在 Cloud Code 中部署到 Kubernetes 集群的应用。本教程不介绍这些步骤,但如需了解详情,请参阅调试 Kubernetes 应用。
提交代码
现在,您已经对应用进行了更改,请提交代码:
配置您的 Git 身份:
git config --global user.email "[email protected]" git config --global user.name "NAME"
替换以下内容:
- 将 [email protected] 替换为与您的 GitHub 帐号关联的电子邮件地址
- 将 NAME 替换为与您的 GitHub 帐号相关联的名称
从终端提交代码:
git add . git commit -m "use lowercase for: sample app info"
您无需在此处运行
git push
命令。以后再说。
在开发环境中,您现在已经对应用进行了更改,构建并测试了更改,并验证了向用户显示的这些更改行为。开发环境中的测试包括治理检查,可让您解决导致生产环境出现问题的问题。
在本教程中,当您将代码提交到主代码库时,无需进行代码审核。但是,审核代码或批准更改是推荐的软件开发流程。
如需详细了解变更审核流程的最佳实践,请参阅简化变更审核流程。
将更改部署到生产环境
在本部分中,您将充当应用操作员并执行以下操作:
- 触发 CI/CD 流水线,该流水线会将版本部署到预演环境。
- 提升并批准发布到生产环境。
启动 CI/CD 流水线并部署到预演环境
在本部分中,您将通过调用 Cloud Build 触发器来启动 CI/CD 流水线。每当有更改提交到主代码库时,系统都会调用此触发器。您还可以使用手动触发器启动 CI 系统。
在 Cloud Shell Editor 中,运行以下命令以触发构建:
git push google
此构建包含您对
cicd-sample
所做的更改。返回 Cloud Build 信息中心,查看构建是否已创建。
点击右侧构建日志中的 Running: cicd-sample - cicd-sample-main,并查找用于表示每个步骤开始和结束的蓝色文本。
步骤 0 显示
cloudbuild.yaml
文件中的skaffold build
和skaffold test
指令的输出。步骤 0 中的构建和测试任务(流水线的 CI 部分)已通过,因此步骤 1 中的部署任务(流水线的 CD 部分)。此步骤已成功完成,并显示以下消息:
Created Google Cloud Deploy rollout ROLLOUT_NAME in target staging
打开 Google Cloud Deploy 交付流水线页面,然后点击
cicd-sample delivery
流水线。应用部署在预演环境中,而不是生产环境中。
验证应用是否可在预演环境中成功运行:
kubectl proxy --port 8001 --context gke_$(gcloud config get-value project)_us-central1_staging
此命令会设置 kubectl 代理以访问应用。
从 Cloud Shell 访问应用:
在 Cloud Shell Editor 中,打开一个新终端标签页。
向
localhost
发送请求以增加计数器:curl -s http://localhost:8001/api/v1/namespaces/default/services/cicd-sample:8080/proxy/ | grep -A 1 Counter
您可以多次运行此命令,并观察计数器值每次递增。
查看应用时,请注意您更改的文本位于您在语言环境中部署的应用版本中。
关闭第二个标签页。
在第一个标签页中,按
Control+C
以停止代理。
现在,您已调用 Cloud Build 触发器来启动 CI 过程,其中包括构建应用、将其部署到预演环境以及运行测试以验证应用是否在预演环境中正常工作。
当代码构建和测试在预演环境中通过时,CI 过程就会成功。CI 过程成功后,将在 Google Cloud Deploy 中启动 CD 系统。
将版本提升到生产环境
在本部分中,您将版本从预演环境提升到生产环境。生产环境目标已预先配置为需要批准,因此您需要手动批准。
对于您自己的 CI/CD 流水线,您可能需要使用部署策略,即在完全部署到生产环境之前逐步启动部署。逐步启动部署可以更轻松地检测问题,并在需要时恢复先前版本。
如需将该版本提升到生产环境,请执行以下操作:
打开 Google Cloud Deploy 交付流水线概览,然后选择 cicd-sample 流水线。
将部署从预演环境提升到生产环境。为此,请执行以下操作:
在页面顶部的流水线图中,点击预演框中的蓝色提升按钮。
在打开的窗口中,点击底部的提升按钮。
部署尚未在生产环境中运行。正在等待手动批准。
手动批准部署:
在流水线可视化中,点击预演和生产框之间的审核按钮。
在打开的窗口中,点击审核按钮。
在下一个窗口中,点击批准。
返回到 Google Cloud Deploy 交付流水线概览,然后选择 cicd-sample 流水线。
在流水线可视化将 prod 框显示为绿色(表示成功发布)后,通过设置用于访问应用的 kubectl 代理来验证应用是否在生产环境中正常运行:
kubectl proxy --port 8002 --context gke_$(gcloud config get-value project)_us-central1_prod
从 Cloud Shell 访问应用:
在 Cloud Shell Editor 中,打开一个新终端标签页。
递增计数器:
curl -s http://localhost:8002/api/v1/namespaces/default/services/cicd-sample:8080/proxy/ | grep -A 1 Counter
您可以多次运行此命令,并观察计数器值每次递增。
关闭第二个终端标签页。
在第一个标签页中,按
Control+C
以停止代理。
您现在已经提升并批准生产部署。包含近期更改的应用现在在生产环境中运行。
清除数据
为避免因本教程中使用的资源导致您的 Google Cloud 帐号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
选项 1:删除项目
- 在 Google Cloud 控制台中,进入管理资源页面。
- 在项目列表中,选择要删除的项目,然后点击删除。
- 在对话框中输入项目 ID,然后点击关闭以删除项目。
选项 2:删除单个资源
删除 Google Cloud Deploy 流水线:
gcloud deploy delivery-pipelines delete cicd-sample --region=us-central1 --force
删除 Cloud Build 触发器:
gcloud beta builds triggers delete cicd-sample-main
删除预演集群和生产集群:
gcloud container clusters delete staging
gcloud container clusters delete prod
在 Cloud Source Repositories 中删除代码库:
gcloud source repos delete cicd-sample
删除 Cloud Storage 存储桶:
gsutil rm -r gs://$(gcloud config get-value project)-gceme-artifacts/
gsutil rm -r gs://$(gcloud config get-value project)_clouddeploy/
删除 Artifact Registry 中的代码库:
gcloud artifacts repositories delete cicd-sample-repo \ --location us-central1
后续步骤
- 如需了解如何部署到专用 GKE 实例,请参阅部署到 Virtual Private Cloud 网络上的专用集群。
- 有关自动执行部署的最佳实践,请参阅:
- DevOps 技术:部署自动化,介绍如何实现、改进和衡量部署自动化。
- 从架构框架自动执行部署。
- 如需详细了解部署策略,请参阅:
- 如需查看更多参考架构、图表和最佳实践,请浏览云架构中心。