体验CICD
首先
这篇文章是关于观看了一个名为”Serverless is simple. Do I need CI/CD?”的视频后,写成了一篇名为”实际尝试过的”文章。
CI/CD 的流程是做什么的?
从将代码提交到仓库的那一刻起,直到这些变更向用户展示,至少需要执行几个步骤。

激活谷歌云API。
连接到想要构建此CI/CD的GCP项目的控制台。
Cloud Build API 云构建API
Artifact Registry API 构件注册API
Cloud Run Admin API 云服务管理API
激活这些API。
此外,对于其他API的激活,应根据需要适时进行。
我想要复制这段示范代码。

请选择一种编程语言。
请根据个人喜好选择,示例代码可用于多种编程语言。
在本文中,我们选择了Golang,并操作cloud-code-samples/golang/go-cloud-run-hello-world这个目录。

让我们准备在Artifact Registry中创建容器镜像。
将容器镜像保存的repository部署到Artifact Registry中。
存储库名称:请随意命名。
格式:Docker
地区:请选择最近的地区。
其他项目则默认设置。

创建 Cloud Build 触发器。
CloudBuild 是一种无服务器平台,可以创建CICD流水线。
触发器名称:Hello-Cloud-Run-Pipeline
区域:选择最近的区域
事件:推送到分支
仓库:github.account/cloud-code-samples
※ 如果仓库不在选择页面上,请连接到新仓库。
分支:v1(这次选择默认分支)
格式:cloudbuild配置文件
位置:仓库
cloudbuild配置文件位置:参考下图截屏。
在这篇文章中,只需要将 Cloud Build 構成ファイル的路径更改即可,而基本上和视频的说明一样进行就没有问题。
这篇文章是为了在`golang/go-cloud-run-hello-world`项目中创建`cloudbuild.yaml`而存在的。

创建cloudbuild.yaml文件
打开VS Code等编辑工具,创建一个cloudbuild.yaml文件。
由于该yaml文件选择了asia-northeast1地区,请根据最近的地区进行适当的修改。
另外,由于选择了Golang,所以如果选择其他编程语言,同样需要进行相应的修改。
steps:
# Build app
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-f', 'golang/go-cloud-run-hello-world/Dockerfile', '-t', 'asia-northeast1-docker.pkg.dev/$PROJECT_ID/my-repo/hello:$COMMIT_SHA', './golang/go-cloud-run-hello-world']
id: BUILD
# Storage of the image
- name: 'gcr.io/cloud-builders/docker'
args: ['push', 'asia-northeast1-docker.pkg.dev/$PROJECT_ID/my-repo/hello:$COMMIT_SHA']
id: STORAGE
# Deploy app
- name: 'gcr.io/cloud-builders/gcloud'
args: ['run', 'deploy', 'hello-site',
'--image', 'asia-northeast1-docker.pkg.dev/$PROJECT_ID/my-repo/hello:$COMMIT_SHA',
'--region', 'asia-northeast1',
'--platform', 'managed',
'--allow-unauthenticated']
id: DEPLOY

让我们修复这个错误。
在视频中,虽然没有发生错误,但实际尝试时可能由于API未启用或服务账户权限不足而导致错误。
API的启用在本文开头有解释,
当执行云构建触发器时,如果服务帐号权限不足,
则会输出以下错误并导致触发器异常终止。
Step #2: ERROR: (gcloud.run.deploy) PERMISSION_DENIED: Permission 'run.services.get' denied on resource ...
为了解决这个问题,您需要针对Cloud Build服务账号(@cloudbuild.gserviceaccount.com)执行以下操作:
-
- Cloud Run管理者ロール(run.admin)
- サービスアカウントユーザーロール(iam.serviceAccountUser)
必须分配给。

试试运行Cloud Run。
当错误解决完毕并且云构建触发器正常完成时,您最终可以执行已部署的Cloud Run服务的链接,以确认应用程序正在运行。

让我们进行Cloud Run的金丝雀测试发布。
最后,我希望可以实施Canary Test的发布,并用此作为本文的结尾。
这边也会根据视频的内容进行,但是要做的事情有两个。
-
- 作成した cloudbuild.yaml の Deploy App step で、–no-traffic を追加する。
Canary release step を追記する。
以下是已对Canary Test release进行修正的cloudbuild.yaml文件。
steps:
# Build app
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-f', 'golang/go-cloud-run-hello-world/Dockerfile', '-t', 'asia-northeast1-docker.pkg.dev/$PROJECT_ID/my-repo/hello:$COMMIT_SHA', './golang/go-cloud-run-hello-world']
id: BUILD
# Storage of the image
- name: 'gcr.io/cloud-builders/docker'
args: ['push', 'asia-northeast1-docker.pkg.dev/$PROJECT_ID/my-repo/hello:$COMMIT_SHA']
id: STORAGE
# Deploy app
- name: 'gcr.io/cloud-builders/gcloud'
args: ['run', 'deploy', 'hello-site',
'--image', 'asia-northeast1-docker.pkg.dev/$PROJECT_ID/my-repo/hello:$COMMIT_SHA',
'--region', 'asia-northeast1',
'--platform', 'managed',
'--allow-unauthenticated',
'--no-traffic']
id: DEPLOY
# Canary release
- name: 'gcr.io/cloud-builders/gcloud'
args: ['run', 'services', 'update-traffic', 'hello-site',
'--region', 'asia-northeast1',
'--to-revisions=LATEST=50']
id: CANARY
将此cloudbuild.yaml推送到GitHub,Cloud Build触发器将会执行并成功完成,然后Cloud Run内的版本流量将会被分割,从而实现金丝雀测试发布。


结束
我看了视频后,写了一篇关于实际操作的内容。
在实际尝试中,我也遇到了一些困难。
对那些想要尝试CICD管道的人来说,如果您在观看视频并尝试实际操作时遇到了困难,希望您能参考一下。
如果您之后有想要“仔细阅读”或“反复阅读”的意愿,可以将此文章注册到“收藏夹”。对于那些正在阅读本文的人来说,如果这篇文章对他们有所参考,您可以给予“点赞”以鼓励。谢谢您的支持!