本教程适用于公共和私有 GitHub 代码库。请注意,预览版本身将设为公开,如果模糊处理,则为网址。
目标
- 创建 Cloud Run 服务。
- 在 GitHub 上实现基于源代码控制的持续集成。
- 通过 Secret Manager 创建和管理对 Secret 的访问权限。
- 部署自定义 Cloud Build 构建器。
- 创建 Cloud Build 触发器,以便基于 GitHub 拉取请求调用构建。
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
准备工作
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Run, Cloud Build, and Secret Manager APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Run, Cloud Build, and Secret Manager APIs.
所需的角色
如需获得完成本教程所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:
-
Cloud Build Editor (
roles/cloudbuild.builds.editor
) -
Cloud Run Admin (
roles/run.admin
) -
Create Service Accounts (
roles/iam.serviceAccountCreator
) -
Secret Manager Admin (
roles/secretmanager.admin
)
如需详细了解如何授予角色,请参阅管理访问权限。
检索代码示例
为便于本教程使用,您将创建一个新的 GitHub 代码库,其中包含基于模板的 Hello World 应用副本。然后,您将使用自定义 Cloud Build 配置将新文件添加到此代码库中。
- 登录 GitHub 并导航到模板代码库。
- 点击“使用此模板”,以使用此模板创建新的代码库。
- 将您的代码库命名为
helloworld-python
。 - 为代码库选择“公开”或“专用”。
- 点击基于模板创建代码库。
- 将您的代码库命名为
在您的代码库中创建新的 Cloud Build 配置文件(完整说明):
- 在代码库页面上,依次点击添加文件 > 新建文件
- 将新文件命名为
cloudbuild.yaml
将以下代码复制到
cloudbuild.yaml
:保留默认的“直接提交到
main
分支中”选项。点击提交新文件 (Commit new file)。
使用构建触发器部署服务
本教程介绍了如何设置构建触发器,以在您每次更新代码库的主分支时自动启动构建。此外,您还可以在每次部署更改时通过调用 Cloud Build 来手动部署您的服务。
在本教程中,使用 cloudbuild.yaml
文件部署名为 myservice
的示例服务。
向 Cloud Build 服务账号授予 Cloud Run Admin 和 Service Account User 角色(完整说明):
在 Google Cloud 控制台中,转到 Cloud Build 账号设置页面。
启用 Cloud Run Admin 角色。
在确认对话框中,点击授予对所有服务账号的访问权限。
将您的 GitHub 账号连接到 Cloud Build(完整说明):
在 Google Cloud 控制台中,转到 Cloud Build 触发器页面。
点击关联代码库。
选择 GitHub(Cloud Build GitHub 应用)作为来源,然后逐步完成身份验证和授权对话框。
选择“GITHUB_USER_NAME/helloworld-python”代码库。
点击连接代码库。
在“创建触发器(可选)”中,点击创建触发器。
创建 Cloud Build 触发器(完整说明):
- 在“Cloud Build 触发器”页面中,点击创建触发器。
- 输入以下详细信息:
- 名称:
prod-deploy
- 事件:推送至分支
- 源代码库:“GITHUB_USER_NAME/helloworld-python”
- 源分支:
^main$
- 构建配置:Cloud Build 配置文件(yaml 或 json)
- Cloud Build 配置文件位置:
cloudbuild.yaml
- 名称:
- 点击创建。
手动运行新触发器:
- 在新触发器列表中,点击运行。
- 在弹出式窗口中,确认分支名称 (
main
),然后点击运行触发器。 - 转到 Cloud Build 历史记录以检查构建进度。
- 等待构建完成。
确认部署成功。
在 Google Cloud Console 中,转到 Cloud Run 页面。
确认服务是否具有绿色对勾标记,表示部署成功。
点击“修订版本”标签页,并确认服务具有 1 个修订版本,处理 100% 的流量,从“myservice-00001-”开始。
点击服务的网址,并确认服务显示“Hello World!”。
创建令牌和配置
在上一部分中创建的 prod-deploy 触发器会在推送到主分支时部署服务。现在,您将创建第二个触发器,每次在您的代码库中创建或更新拉取请求时都会运行该触发器。
设置新的触发器后,系统将部署预览,但在拉取请求中不会提供链接到预览的信息。如需设置此功能,您需要完成以下额外的配置步骤:
- 创建 GitHub 令牌
- 将此令牌存储在 Secret Manager 中
- 创建自定义映像,用作 Cloud Build 中的一个步骤。
创建和存储 GitHub 令牌
- 创建 GitHub 令牌以允许回写到拉取请求(完整说明):
- 转到 GitHub 个人访问令牌设置页面。
- 点击生成新令牌。
- 输入以下详细信息:
- 注意:
preview-deploy
- 有效期:30 天
- 范围:
- 对于公共代码库:
repo:status
(“访问提交状态”) - 对于私有代码库:
repo
(“完全控制私有代码库”)
- 对于公共代码库:
- 注意:
- 点击 生成令牌。
- 复制生成的令牌的值。
将 GitHub 令牌存储在 Secret Manager 中:
在 Google Cloud 控制台中,转到 Secret Manager 页面。
点击创建 Secret。
输入以下详细信息:
- 名称:
github_token
。 - Secret 值:粘贴您从 GitHub 复制的令牌值。
- 名称:
点击创建 Secret。
允许 Cloud Build 访问此 Secret:
在新的浏览器标签页中,转到 Google Cloud 控制台中的 Cloud Build 设置页面。
复制“服务账号电子邮件”的值。
- 电子邮件为
PROJECT_NUM@cloudbuild.gserviceaccount.com
- 电子邮件为
返回 Secret Manager,然后点击权限标签页,然后点击
添加- 新的主账号:
PROJECT_NUM@cloudbuild.gserviceaccount.com
- 角色:Secret Manager Secret Accessor
- 新的主账号:
点击保存。
GitHub 建议为个人访问令牌设置有效期,并在令牌设置为失效时发送提醒电子邮件。如果您继续使用部署预览,请在重新生成令牌时创建新版本的 github_token
。下一步中的构建器会检索令牌的最新版本,因此预览将继续有效。
为 Cloud Build 创建新映像
将“Deployment Preview”通知写入拉取请求的脚本位于 Python 文档示例中。除了选择将此脚本添加到源代码中之外,您还可以选择将此脚本构建到项目内的容器中,并在 Cloud Build 配置中作为一个步骤运行该容器。
您可以使用 Cloud Shell 或本地机器(如果您安装和配置了 git
和 Google Cloud CLI)按照以下说明操作。以下说明介绍了两种方法。
-
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.
- 配置 Google Cloud CLI 以使用您的项目,注意将
PROJECT_ID
替换为您的项目 ID: 如果使用 Cloud Shell,您可能需要授权 Google Cloud CLI 进行 Google Cloud API 调用。点击授权以允许此操作继续进行。export PROJECT_ID=PROJECT_ID gcloud config set project $PROJECT_ID
- 创建一个新的容器映像:
git clone https://github.com/GoogleCloudPlatform/python-docs-samples cd python-docs-samples/ gcloud builds submit --tag gcr.io/$PROJECT_ID/deployment-previews run/deployment-previews
- 确认该容器已创建:
gcloud container images list
- 移除克隆的代码库:
cd .. rm -rf python-docs-samples
添加新的 Cloud Build 配置
您的代码库已有在主分支上使用的 cloudbuild.yaml
文件。现在,您将为这个新的触发器创建一个新配置。
在 GitHub 代码库页面上,依次点击添加文件 > 新建文件
- 将新文件命名为
cloudbuild-preview.yaml
- 复制下面的代码并粘贴到新文件中:
- 将新文件命名为
提交对代码库的主分支的更改。
创建辅助触发器
现在,所有基础工作都已就绪,请创建新的触发器。
创建新的 Cloud Build 触发器(完整说明):
在 Google Cloud 控制台中,转到 Cloud Build 触发器页面。
点击创建触发器。
输入以下详细信息:
- 名称:
preview-deploy
- 事件:拉取请求
- 源代码库:“GITHUB_USER_NAME/helloworld-python”
- 基本分支:
^main$
- 评论控制:必需(所有者和协作者除外)
- 作为代码库的所有者,您创建的拉取请求上会自动构建预览。
- 如果要允许任何人预览其更改,请详细了解选择“不需要”的安全隐患。
- 配置:Cloud Build 配置文件
- Cloud Build 配置文件位置:
cloudbuild-preview.yaml
- 名称:
点击创建。
检查操作是否成功
由于创建新的拉取请求时会触发这个新触发器,因此,为了测试新触发器,您需要创建新的拉取请求。
- 转到您的代码库,然后在新分支中对
app.py
进行可视化更改。- 转到
app.py
,然后点击铅笔图标 ( )。 - 进行更改;例如,将“Hello”更改为“Greetings”。
- 选择为此提交创建新分支并启动拉取请求 (Create a new branch for this commit and start a pull request),然后点击建议更改 (Propose change)。
- 转到
使用此分支创建新的拉取请求。
如果触发器配置正确,则在您创建拉取请求后不久即会显示一项新检查:
检查的名称是触发器的名称和项目 ID。通过点击详细信息 > 查看有关 Google Cloud Build 的更多详情,查看构建进度。
如果触发器失败,您需要重新提交构建,或者如果要对拉取请求进行其他更改,则需要将更改提交到同一分支。每次针对拉取请求提交的新内容都会触发新构建。
触发器完成后,系统会为拉取请求显示名为“部署预览”的新状态检查。显示的图标是您的头像,因为您的账号拥有所用令牌:
点击详细信息以导航至预览。显示的网址与原始服务网址相同,但以“PR-1---”为前缀。
请注意,如果您导航至原始服务网址,则系统会显示原始内容:
查看服务的修订版本列表以检查 Cloud Run 中的服务状态:现在有两种修订版本可以处理流量:原始版本和预览版本:
通过将新提交添加到分支,继续对拉取请求进行更改。每次提交时,
preview-deploy
触发器都会触发,同时创建一个新的服务修订版本,并且可在同一网址获取该修订版本:准备好合并更改后,点击合并拉取请求。原始的
prod-deploy
触发器会运行,并且拉取请求的更改会反映在原始网址中:新修订版本会在主网址中处理 100% 的流量,但拉取请求的预览网址仍然附加到该拉取请求的最新提交中,因此链接将继续有效:
限制
可以创建的修订版本网址数量存在限制。如果您预计您的代码库将有 1000 个以上的拉取请求,请考虑执行清理标记的过程,如 cloudbuild-cleanup.yaml
所示。
了解代码
cloudbuild.yaml
此代码基于 Cloud Build 提供的示例 cloudbuild.yaml
,但带有一个著名的更新:用于运行 update-traffic
的第四步。
cloudbuild.yaml
中的配置可以更改流量拆分。--to-latest
参数提供的功能与 Cloud Run 页面中“立即提供此修订版本”复选框相同。它可确保服务的修订版本可立即处理所有流量。
cloudbuild-preview.yaml
此代码与 cloudbuild.yaml
类似,但前者增加了步骤:
构建和推送服务映像后,
cloudbuild-preview.yaml
会使用--no-traffic
标志部署该服务。这意味着,即使这是最新修订版本,它也不会用于处理流量。cloudbuild-preview.yaml
会根据拉取请求编号添加自定义标记。此例中,字符串的前缀为“pr-”并以拉取请求数结尾。此时,修订版本网址可以正常工作,但提交拉取请求的人员无法确定这一点,因为无法从 GitHub 查看 Cloud Build 日志:只能看到指向日志的链接。只有拥有足够权限、经过身份验证的 Cloud Build 项目用户才能查看日志。
cloudbuild-preview.yaml
使用 Cloud Build 提供的内置替换参数运行check_status.py
脚本。操作 GitHub 代码库时,您可以使用许多参数,例如拉取请求编号、代码库名称和提交 SHA。
如需重新运行此触发器,请在 GitHub 中提交另一个提交。此触发器无法从控制台中的 Cloud Build 页面重新运行。
cloudbuild-cleanup.yaml
此代码可以替代 cloudbuild.yaml
,前者增加了清理功能。初始步骤执行部署,然后功能会按以下所述扩展:
使用 Discovery API 和 GitHub API,确定服务的哪些标记用于已关闭的拉取请求。至少会有一个拉取请求已合并,从而触发此触发器。
删除已标识的标记。
check_status.py
check_status.py
脚本会提取有关 Cloud Run 服务、GitHub 代码库和提交的信息,然后执行以下操作:
- 使用 Google API Python 客户端检索服务名称、标记和修订版本网址。
- 从 Secret Manager 提供的环境变量中检索 GitHub 令牌。
- 使用 Python 版 GitHub Client API,为给定提交创建状态,并链接到检索到的修订版本网址。
清除数据
如果您为本教程创建了一个新项目,请删除项目。 如果您使用的是现有项目,希望保留此项目且不保留本教程中添加的任何更改,请删除为教程创建的资源。 此外,您还需要删除为教程创建的 GitHub 配置。
删除项目
为了避免产生费用,最简单的方法是删除您为本教程创建的项目。
如需删除项目,请执行以下操作:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
删除教程资源
删除您在本教程中部署的 Cloud Run 服务:
- 导航到 Cloud Run 控制台。
- 选择“myservice”列表,然后点击删除。
- 在确认对话框中点击删除。
删除在本教程中创建的其他 Google Cloud 资源:
- 从 Container Registry 中删除 deployment-preview 容器映像(名为
gcr.io/PROJECT_ID/deployment-preview
)。 - 从 Container Registry 中删除 Helloworld 容器映像(名为
gcr.io/PROJECT_ID/helloworld
)。 - 删除 Cloud Build 触发器。
- 删除 Secret Manager Secret。
- 从 Container Registry 中删除 deployment-preview 容器映像(名为
删除教程配置
如需清理 GitHub 中的配置,您需要从 GitHub 中移除 Google Cloud Build 应用:
- 导航到 GitHub 应用设置
- 在 Google Cloud Build 列表中,点击配置。
- 在危险地区部分,点击卸载。
- 在确认对话框中点击确定。
您还需要删除创建的 GitHub 令牌:
- 导航到 GitHub 个人访问令牌页面。
- 在 preview-deploy 列表中,点击 Delete。
- 在确认对话框中,点击我了解,删除此令牌。
您还需要删除 GitHub 代码库:
- 导航至您创建的 GitHub 代码库,然后点击“设置”标签页。
- 在危险地区部分中,点击删除此代码库。
- 在确认对话框中,输入代码库的全名,然后点击我了解后果,删除此代码库。
后续步骤
- 详细了解 Cloud Run 中的回滚、逐步发布和流量迁移。
- 详细了解 Cloud Build 中的 GitHub 应用触发器。