使用 Cloud Build 通过 Git 代码库部署工作流

您可以使用 Cloud Build 触发器从 Git 代码库自动启动构建和部署工作流。您可以将触发器配置为针对源代码库的任何更改部署工作流,或者仅在更改符合特定条件时才部署工作流。

此方法可以帮助您管理部署生命周期。例如,您可以在预演环境中部署对工作流的更改,针对该环境运行测试,然后将这些更改逐步发布到生产环境。

准备工作

以下说明假定您在 Google Cloud 项目中拥有 Cloud Build Editor 角色 (roles/cloudbuild.builds.editor),因此可以创建触发器。此外,您还需要像 GitHub 或 Bitbucket 等源代码库中工作流。

控制台

  1. 启用 Cloud Build API 和 Workflows API。

    启用 API

  2. 向 Cloud Build 服务帐号授予 Workflows Admin 角色 (roles/workflows.admin):

    1. 在 Google Cloud 控制台中,转到 IAM 页面。

      进入 IAM

    2. 选择您的项目。

    3. 在 Cloud Build 服务帐号 (PROJECT_NUMBER@cloudbuild.gserviceaccount.com) 对应的行中,点击 修改主帐号

    4. 点击添加其他角色

    5. 角色列表中,选择 Workflows Admin 角色。

    6. 点击保存

  3. 将 Compute Engine 默认服务帐号上的 Service Account User 角色 (roles/iam.serviceAccountUser) 授予 Cloud Build 服务帐号。启用 Compute Engine API 后,Compute Engine 默认服务帐号为 PROJECT_NUMBER-compute@developer.gserviceaccount.com

    1. 在 Google Cloud 控制台中,转到服务账号页面。

      进入“服务账号”

    2. 选择您的项目。

    3. 点击 Compute Engine 默认服务帐号 (PROJECT_NUMBER-compute@developer.gserviceaccount.com) 的电子邮件地址。

    4. 点击权限标签页。

    5. 点击 授予访问权限按钮。

    6. 如需添加新的主账号,请输入您的服务帐号 (SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com) 的电子邮件地址。

    7. 选择角色列表中,依次选择服务帐号 > Service Account User 角色。

    8. 点击保存

gcloud

  1. 启用 Cloud Build API 和 Workflows API。

    gcloud services enable cloudbuild.googleapis.com \
      workflows.googleapis.com
    
  2. 向 Cloud Build 服务帐号授予 Workflows Admin 角色 (roles/workflows.admin):

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

    PROJECT_ID 替换为您的 Google Cloud 项目的 ID。

  3. 将 Compute Engine 默认服务帐号上的 Service Account User 角色 (roles/iam.serviceAccountUser) 授予 Cloud Build 服务帐号。启用 Compute Engine API 后,Compute Engine 默认服务帐号为 PROJECT_NUMBER-compute@developer.gserviceaccount.com

    gcloud iam service-accounts add-iam-policy-binding \
      $PROJECT_NUMBER-compute@developer.gserviceaccount.com \
      --member=serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
      --role=roles/iam.serviceAccountUser
    

连接到您的源代码库

您必须将 Cloud Build 连接到源代码库,以便 Cloud Build 可以自动进行构建以响应代码库中发生的事件。

如需连接到 GitHub 或 Bitbucket,请完成以下步骤:

  1. 在 Google Cloud 控制台中,转到 Cloud Build 触发器页面:

    前往“触发器”

  2. 如有必要,请选择您的项目并点击打开

  3. 区域列表中,选择要创建触发器的区域。

  4. 点击连接代码库

  5. 选择存储源代码的源代码库。

    例如:GitHub(Cloud Build GitHub 应用)

  6. 点击继续

  7. 使用您的用户名和密码向您的源代码库进行身份验证。

    如果您要登录 GitHub,系统会要求您授权 Google Cloud Build GitHub 应用访问您的 GitHub 帐号,以便继续操作。

  8. 从可用代码库列表中,选择所需的代码库,然后点击确定

    对于 GitHub 和 Bitbucket 等外部代码库,您必须拥有正在处理的 Google Cloud 项目的所有者级别权限。

  9. 阅读免责声明,并选中旁边的复选框,以表示您同意这些条款。

  10. 点击连接

  11. 如需继续创建构建触发器,以便为代码库中的源代码自动进行构建,请点击创建触发器。否则,请点击完成

创建 Cloud Build 配置文件

build 配置文件定义使用构建触发器启动构建时所需的字段。在项目根目录中创建配置文件,并使用 YAML 或 JSON 编写该文件。

例如,以下配置文件会部署并运行测试工作流,然后使用脚本检查输出。如果测试通过,则部署工作流:

steps:
# Deploy the test workflow with the commit sha
- id: 'deploy-test-workflow'
  name: 'gcr.io/cloud-builders/gcloud'
  args: ['workflows', 'deploy', '$_WORKFLOW_NAME-$BRANCH_NAME-$SHORT_SHA', '--source', 'gitops/workflow.yaml']

# Run the test workflow and capture the output
- id: 'run-test-workflow'
  name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: 'bash'
  args: ['-c', 'gcloud workflows run $_WORKFLOW_NAME-$BRANCH_NAME-$SHORT_SHA > /workspace/testoutput.log']

# Delete the test workflow
- id: 'delete-test-workflow'
  name: 'gcr.io/cloud-builders/gcloud'
  args: ['workflows', 'delete', '$_WORKFLOW_NAME-$BRANCH_NAME-$SHORT_SHA', '--quiet']

# Check the test output
- id: 'check-test-workflow'
  name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: 'bash'
  args: ['gitops/test-$BRANCH_NAME.sh']

# Deploy the workflow
- id: 'deploy-workflow'
  name: 'gcr.io/cloud-builders/gcloud'
  args: ['workflows', 'deploy', '$_WORKFLOW_NAME-$BRANCH_NAME', '--source', 'gitops/workflow.yaml']

从 Git 代码库触发构建时,Cloud Build 会填充 $BRANCH_NAME$SHORT_SHA 替代变量。它们分别表示分支的名称,以及与您的 build 关联的提交 ID 的前七位字符。

$_WORKFLOW_NAME 替代变量允许您重复使用具有不同变量值的配置文件。您可以在创建构建触发器时指定其值。

如需了解详情,请参阅创建构建配置文件

创建构建触发器

您可以通过创建 Cloud Build 触发器来自动部署工作流。

如需在上一部分中为配置文件创建构建触发器,请执行以下操作:

  1. 在 Google Cloud 控制台中,转到 Cloud Build 触发器页面:

    前往“触发器”

  2. 点击创建触发器

  3. 名称字段中,为触发器输入名称。

  4. 对于事件,请选择要调用触发器的事件。

    例如:推送到分支

  5. 来源部分,选择您的代码库,以及将启动触发器的分支或标记名称。您可以使用正则表达式来指定与分支或标记的匹配。

    例如:GoogleCloudPlatform/workflows-demos(仓库)和 ^main$|^staging$(与 mainstaging 分支匹配)

  6. 展开显示包含的文件和忽略的文件过滤条件部分,将工作流指定为包含的文件,以便在发生更改时调用 build。

    例如:gitops/workflow.yaml

  7. 对于配置,选择 Cloud Build 配置文件(YAML 或 JSON)作为类型,选择代码库作为位置。

  8. Cloud Build 配置文件位置字段中,指定文件的位置。

    例如:gitops/cloudbuild.yaml

  9. (可选)如需添加替代变量,请点击添加变量,然后指定键和值的组合。

    例如:_WORKFLOW_NAME(变量)和 workflows-gitops(值)

  10. 如需保存构建触发器,请点击创建

当将任何更改推送到 Git 代码库的指定分支中的工作流时,它会自动触发 Cloud Build 部署工作流。

如需了解详情,请参阅创建和管理构建触发器

测试构建触发器

您可以测试前面部分中的构建触发器和配置文件。

  1. 在 Git 代码库的 staging 分支中,修改 workflow.yaml,并将 Hello World 更改为 Bye World

    main:
      steps:
        - init:
            assign:
              - message: "Hello World"
        - returnResult:
            return: ${message}
  2. 提交更改并将其推送到 staging 分支。

    git add workflow.yaml
    git commit -m "Update workflow.yaml in staging"
    git push
    

    Cloud Build 触发器运行并启动构建。

  3. 如需确认构建成功,请在 Google Cloud 控制台中前往构建记录页面:

    转到“构建记录”

    构建完成后,Cloud Build 会提供构建以及每个构建步骤的总体状态。如需了解详情,请参阅查看构建结果

  4. 如需确认已部署预演工作流,请在 Google Cloud 控制台中转到工作流页面:

    前往 Workflows

    您应该会看到其中列出了一个名为 workflows-gitops-staging 的工作流。

  5. 如需将预演工作流部署到生产环境,请将 staging 分支合并到 main 分支:

    git checkout main
    git merge staging
    git push
    

    请注意,由于 test-main.sh 需要工作流输出 Hello World,因此构建将失败:

    RESULT_EXPECTED="result: '\"Hello World\"'"
    RESULT_ACTUAL=$(grep "result: " $FILE)
    if [[ $RESULT_EXPECTED == $RESULT_ACTUAL ]]; then
      echo "Result test passed"
    else
      echo "Result test failed. Expected: $RESULT_EXPECTED Actual: $RESULT_ACTUAL"; exit 1;
    fi
  6. 为了成功部署生产工作流,请在 staging 分支中再次修改 workflow.yaml 并将字符串改回 Hello World

  7. 提交更改并将其推送到 staging 分支,然后将 staging 分支合并到 main 分支。

  8. 如需确认生产工作流已部署,请在 Google Cloud 控制台中转到工作流页面:

    前往 Workflows

    您应该会看到其中列出了一个名为 workflows-gitops-main 的工作流。

后续步骤