1. 准备工作
自定进度的环境设置
- 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个。
- 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串,您可以随时对其进行更新。
- 项目 ID 在所有 Google Cloud 项目中必须是唯一的,并且不可变(一经设置便无法更改)。Cloud Console 会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(它通常标识为
PROJECT_ID
),因此如果您不喜欢某个 ID,请再生成一个随机 ID,还可以尝试自己创建一个,并确认是否可用。然后,项目创建后,ID 会处于“冻结”状态。 - 第三个值是一些 API 使用的项目编号。如需详细了解所有这三个值,请参阅文档。
- 接下来,您需要在 Cloud Console 中启用结算功能,才能使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。要关闭资源以避免产生超出本教程范围的费用,请按照此 Codelab 末尾提供的任何“清理”说明操作。Google Cloud 的新用户符合参与 $300 USD 免费试用计划的条件。
2. 准备工作区
- 访问以下网址打开 Cloud Shell 编辑器
https://ide.cloud.google.com
- 确保在 CLI 中设置了项目名称
gcloud config set project {{project-id}}
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
- 启用 API
gcloud services enable \
cloudbuild.googleapis.com \
secretmanager.googleapis.com
- 向 CloudDeploy 提供权限
gcloud projects add-iam-policy-binding --member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" --role roles/clouddeploy.admin ${PROJECT_ID}
gcloud projects add-iam-policy-binding --member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" --role roles/container.developer ${PROJECT_ID}
gcloud projects add-iam-policy-binding --member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" --role roles/iam.serviceAccountUser ${PROJECT_ID}
gcloud projects add-iam-policy-binding --member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" --role roles/clouddeploy.jobRunner ${PROJECT_ID}
- 在终端窗口中,使用以下命令克隆应用源代码:
git clone https://github.com/GoogleCloudPlatform/software-delivery-workshop.git
- 切换到该目录,并将 IDE 工作区设置为代码库根目录
cd software-delivery-workshop && rm -rf .git
cd delivery-platform && cloudshell workspace .
3. 利用预定义和自定义应用模板
开发者应能够从组织内常用的一组模板中进行选择。初始配置流程会创建一组集中存储在 GitHub 账号中的模板代码库。在后续步骤中,这些模板仓库将被复制和修改,以用作新应用的基础。在本实验中,您将使用此处提供的示例结构为模板代码库进行初始化。您可以通过添加以示例为模板的其他文件夹来添加自己的模板。
在此步骤中,您将根据提供的示例文件创建自己的代码库来存放应用模板。我们提供了一个帮助程序脚本,用于简化与 GitHub 的互动。
这些是用于填充模板代码库的一次性步骤。后续步骤将会重复使用这些代码库。
配置 GitHub 访问权限
本教程中的步骤会调用 GitHub API 来创建和配置代码库。在接下来的多个步骤中,您需要使用 GitHub 用户名和个人访问令牌。以下脚本可帮助您获取这些值并将其存储为本地变量以供日后使用。
source ./onboard-env.sh
echo Git Username: $GIT_USERNAME
echo Git Base URL: $GIT_BASE_URL
创建应用模板代码库
本实验随附了应用模板示例,以便您了解如何集成自己的基础模板。在此步骤中,您需要在 GitHub 账号中创建一个名为 mcd-app-templates
的代码库,并在其中创建这些文件的副本。
- 将模板复制到工作目录
cp -R $BASE_DIR/resources/repos/app-templates $WORK_DIR
cd $WORK_DIR/app-templates
- 在 GitHub 账号中创建一个空的远程代码库
$BASE_DIR/scripts/git/gh.sh create mcd-app-templates
- 将模板代码库推送到远程代码库
git init && git symbolic-ref HEAD refs/heads/main && git add . && git commit -m "initial commit"
git remote add origin $GIT_BASE_URL/mcd-app-templates
git push origin main
- 清理工作目录
cd $BASE_DIR
rm -rf $WORK_DIR/app-templates
创建共享基本配置代码库
本教程使用了一个名为 Kustomize 的工具,该工具使用多个团队共享的基础配置文件,然后在其上叠加应用专用配置。这样,平台团队就可以跨多个团队和环境进行扩展。
在此步骤中,您将根据提供的示例创建名为 mcd-shared_kustomize
的共享配置仓库
- 将模板复制到工作目录
cp -R $BASE_DIR/resources/repos/shared-kustomize $WORK_DIR
cd $WORK_DIR/shared-kustomize
- 在 GitHub 账号中创建一个空的远程代码库
$BASE_DIR/scripts/git/gh.sh create mcd-shared_kustomize
- 将模板代码库推送到远程代码库
git init && git symbolic-ref HEAD refs/heads/main && git add . && git commit -m "initial commit"
git remote add origin $GIT_BASE_URL/mcd-shared_kustomize
git push origin main
- 清理工作目录
cd $BASE_DIR
rm -rf $WORK_DIR/shared-kustomize
模板代码库已创建完毕,您可以使用它们创建应用实例了
4. 创建应用的新实例
若要根据模板创建新应用,通常需要在模板结构中的多个文件中将占位符变量替换为实际值。替换完成后,系统会为新的应用实例创建一个新的代码库。开发者将在日常开发中克隆并使用此应用实例代码库。
在此步骤中,您将替换应用模板中的值,并将生成的文件发布到新的代码库。
为新应用定义名称
export APP_NAME=my-app
检索 Golang 模板代码库
cd $WORK_DIR/
git clone -b main $GIT_BASE_URL/mcd-app-templates app-templates
rm -rf app-templates/.git
cd app-templates/golang
替换占位符值
新手入门最常见的需求之一是将模板中的变量替换为应用中使用的实际实例。例如,提供应用名称。以下命令使用环境变量中存储的值创建所有 .tmpl 文件的实例。
for template in $(find . -name '*.tmpl'); do envsubst < ${template} > ${template%.*}; done
创建一个新的代码库并存储更新后的文件
- 在 GitHub 账号中创建一个空的远程代码库
$BASE_DIR/scripts/git/gh.sh create ${APP_NAME}
- 将模板代码库推送到远程代码库
git init && git symbolic-ref HEAD refs/heads/main && git add . && git commit -m "initial commit"
git remote add origin $GIT_BASE_URL/${APP_NAME}
git push origin main
现在,应用实例已创建完毕,接下来可以实现持续构建了。
5. 配置自动化流水线执行
持续集成系统的核心是能够基于源自源控制系统的事件执行流水线逻辑。当开发者在代码库中提交代码时,系统会触发事件,这些事件可配置为触发其他系统中的进程。
在此步骤中,您将配置 GitHub,使其每当用户在代码库中提交代码或标记代码时,都调用 Google Cloud Build 并执行流水线。
启用安全访问
您需要两个元素才能配置对应用流水线的安全访问。流水线独有的 API 密钥和密文。
API 密钥
API 密钥用于识别调用给定 API 的客户端。在本例中,客户端将是 GitHub。这里未介绍的最佳实践是,将 API 密钥的范围锁定为仅限客户端将要访问的特定 API。您在上一步中创建了该密钥。
- 您可以点击此链接查看密钥
- 您可以通过运行以下命令来确保已设置该值
echo $API_KEY_VALUE
流水线 Secret
这些密钥用于向调用方授权,并确保他们有权使用特定的 Cloud Build 目标作业。您在 GitHub 中可能有 2 个不同的代码库,它们应仅有权访问自己的流水线。虽然 API_KEY 限制了 github 可以使用哪些 API(在本例中,调用的是 Cloud Build API),但 Secret 限制了客户端可以执行 Cloud Build API 中的哪些作业。
- 定义 Secret 名称、位置和值
SECRET_NAME=${APP_NAME}-webhook-trigger-cd-secret
SECRET_PATH=projects/${PROJECT_NUMBER}/secrets/${SECRET_NAME}/versions/1
SECRET_VALUE=$(sed "s/[^a-zA-Z0-9]//g" <<< $(openssl rand -base64 15))
- 创建 Secret
printf ${SECRET_VALUE} | gcloud secrets create ${SECRET_NAME} --data-file=-
- 允许 Cloud Build 读取 Secret
gcloud secrets add-iam-policy-binding ${SECRET_NAME} \
--member=serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-cloudbuild.iam.gserviceaccount.com \
--role='roles/secretmanager.secretAccessor'
创建 Cloud Build 触发器
Cloud Build 触发器是实际执行 CICD 流程的配置。
在创建作业时,需要提供一些关键值,以便正确配置触发器。
- 定义触发器的名称以及配置文件的位置
export TRIGGER_NAME=${APP_NAME}-clouddeploy-webhook-trigger
export BUILD_YAML_PATH=$WORK_DIR/app-templates/golang/build/cloudbuild-cd.yaml
- 定义共享基础配置代码库的位置。
export KUSTOMIZE_REPO=${GIT_BASE_URL}/mcd-shared_kustomize
- 在 onboard-env.sh 脚本中设置了一个变量,用于定义项目的容器注册库。使用以下命令查看该值。
echo $IMAGE_REPO
- 使用之前创建的变量创建 CloudBuild 网络钩子触发器。应用代码库位置是从 GitHub 请求正文中提取的。以下值引用请求正文中相应内容所在的路径
gcloud alpha builds triggers create webhook \
`--name=${TRIGGER_NAME} \` `--substitutions='_APP_NAME='${APP_NAME}',_APP_REPO=$(body.repository.git_url),_CONFIG_REPO='${GIT_BASE_URL}'/'${CLUSTER_CONFIG_REPO}',_DEFAULT_IMAGE_REPO='${IMAGE_REPO}',_KUSTOMIZE_REPO='${GIT_BASE_URL}'/'${SHARED_KUSTOMIZE_REPO}',_REF=$(body.ref)' \` `--inline-config=$BUILD_YAML_PATH \` `--secret=${SECRET_PATH}`
- 访问此链接,在控制台中查看新创建的 Cloud Build 触发器
- 为端点网址定义一个变量,GitHub 将在下一步中使用该变量
WEBHOOK_URL="https://cloudbuild.googleapis.com/v1/projects/${PROJECT_ID}/triggers/${TRIGGER_NAME}:webhook?key=${API_KEY_VALUE}&secret=${SECRET_VALUE}"
配置 GitHub webhook
- 在 GitHub 中配置 webhook
$BASE_DIR/scripts/git/gh.sh create_webhook ${APP_NAME} $WEBHOOK_URL
- 前往应用代码库,查看新配置的网络钩子
REPO_URL=${GIT_BASE_URL}/${APP_NAME}/settings/hooks
echo $REPO_URL
现在,您已手动完成创建新应用所需的所有步骤,接下来可以使用脚本自动执行这些步骤了。
6. 自动执行所有初始配置步骤
在实践中,并非针对每个新应用执行上述所有步骤。而应将逻辑整合到脚本中,以便轻松执行。上述步骤已包含在脚本中,供您使用。
在此步骤中,您将使用提供的脚本创建一个新应用
创建新应用
- 确保您位于正确的目录中
cd $BASE_DIR
- 创建新应用
export APP_NAME=demo-app
./app.sh create ${APP_NAME}
系统会自动执行所有步骤。
查看 GitHub 代码库
此时,您将能够在 GitHub 中查看新代码库
- 通过执行以下命令检索 GitHub 代码库网址
echo ${GIT_BASE_URL}/demo-app
- 使用网络浏览器打开该网址以查看新应用
- 请注意,以下网址中的示例将模板变量替换为了实例值
echo ${GIT_BASE_URL}/demo-app/blob/main/k8s/prod/deployment.yaml#L24
- 查看在以下网址配置的 webhook
echo ${GIT_BASE_URL}/demo-app/settings/hooks
查看 CloudBuild 触发器
触发器由脚本自动设置