GitHub Cloud Build Integration 与 monorepo 中的多个 cloudbuild.yamls
GitHub Cloud Build Integration with multiple cloudbuild.yamls in monorepo
GitHub 的 Google Cloud Build integration 不会检测到 cloudbuild.yaml
或 Dockerfile
如果它不在存储库的根目录中。
使用包含多个 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
来完成此操作。这一步应该:
- 遍历每个子目录或使用
find
查找其他 cloudbuild.yaml
个文件。
- 对于每个找到的
cloudbuild.yaml
,分叉并提交 运行 gcloud builds submit
的构建。
- 等待所有分支
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
GitHub 的 Google Cloud Build integration 不会检测到 cloudbuild.yaml
或 Dockerfile
如果它不在存储库的根目录中。
使用包含多个 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
来完成此操作。这一步应该:
- 遍历每个子目录或使用
find
查找其他cloudbuild.yaml
个文件。 - 对于每个找到的
cloudbuild.yaml
,分叉并提交 运行gcloud builds submit
的构建。 - 等待所有分支
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