GitHub Cloud Build Integration 与 monorepo 中的多个 cloudbuild.yamls

GitHub Cloud Build Integration with multiple cloudbuild.yamls in monorepo

GitHub 的 Google Cloud Build integration 不会检测到 cloudbuild.yamlDockerfile 如果它不在存储库的根目录中。

使用包含多个 cloudbuild.yamls 的 monorepo 时,如何配置 GitHub 的 Google Cloud Build 集成以检测正确的 cloudbuild.yaml

文件路径:

services/api/cloudbuild.yaml
services/nginx/cloudbuild.yaml
services/websocket/cloudbuild.yaml

Cloud Build 集成输出:

您可以为您的存储库创建一个 build trigger。在为构建配置设置 cloudbuild.yaml 触发器时,您需要提供存储库中 cloudbuild.yaml 的路径。

我们现在正在迁移到 mono-repo,我还没有找到任何 CI/CD 解决方案可以很好地处理这个问题。

关键是不仅要检测更改,还要检测依赖于该更改的任何服务。这是我们正在做的事情:

  • 要求每个服务都有一个带有构建命令的 MAKEFILE。
  • 将 cloudbuild.yaml 放在单声道存储库的根目录下
  • 然后我们 运行 使用这个小工具(旧但似乎仍然有效)的自定义构建步骤 https://github.com/jharlap/affected 它列出了所有已更改的包以及依赖于这些包的所有包等.
  • 然后 shell 脚本将 运行 make build 在任何受更改影响的服务上。

到目前为止它运行良好,但我完全理解这是否不适合您的工作流程。

许多人使用的另一个选项是 Bazel。不是最简单的工具,但如果您有许多不同的语言或在您的单一存储库中构建流程,则特别有用。

您可以通过 gcr.io/cloud-builders/gcloud 步骤在存储库的根目录中添加 cloudbuild.yaml 来完成此操作。这一步应该:

  1. 遍历每个子目录或使用 find 查找其他 cloudbuild.yaml 个文件。
  2. 对于每个找到的 cloudbuild.yaml,分叉并提交 运行 gcloud builds submit 的构建。
  3. 等待所有分支 gcloud 命令完成。

the root cloudbuild.yaml within the GoogleCloudPlatform/cloud-builders-community repo.

中有一个很好的例子来说明如何做到这一点

如果我们去掉非必要的部分,基本上你有这样的东西:

steps:
- name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: 'bash'
  args:
  - '-c'
  - |
    for d in */; do
      config="${d}cloudbuild.yaml"
      if [[ ! -f "${config}" ]]; then
        continue
      fi

      echo "Building $d ... "
      (
        gcloud builds submit $d --config=${config}
      ) &
    done
    wait