如何防止云构建并行运行构建?
Posted
技术标签:
【中文标题】如何防止云构建并行运行构建?【英文标题】:How to prevent cloud build from running builds in parallel? 【发布时间】:2019-09-18 04:22:00 【问题描述】:我们正在使用云构建在 GCP 上进行持续部署。当推动提交快速(例如在开发中)时,触发的构建并行运行。有时它们会互相干扰。例如,当两个应用引擎部署同时运行时。
有没有一种方法或最佳实践来强制从同一个构建触发器触发的构建一个接一个地运行?
问候, 卡斯滕
【问题讨论】:
我也在想同样的事情。您找到解决方案了吗? 【参考方案1】:我通过在我的cloudbuild.yaml
文件中添加一个初始步骤来完成此操作。它的作用是:
gcloud builds list --ongoing --format='value(id)' --filter="substitutions.TRIGGER_NAME=$TRIGGER_NAME"
获取所有正在进行的构建ID。
遍历它但跳过第一个,列表按最新创建时间排序,因此它不会停止作为第一个索引的最新构建
运行gcloud builds cancel $on_going_build[i]
取消构建
请看下面的cloudbuild.yaml
steps:
- id: "Stop Other Ongoing Build"
name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args:
- -c
- |
on_going_build=($(gcloud builds list --ongoing --format='value(id)' --filter="substitutions.TRIGGER_NAME=$TRIGGER_NAME" | xargs))
for (( i=0; i<$#on_going_build[@]; i++ )); do
if [ "$i" -gt "0" ]; then # skip current
echo "Cancelling build $on_going_build[i]"
gcloud builds cancel $on_going_build[i]
fi
done
【讨论】:
【参考方案2】:你不能通过设置。但是您可以定义自定义构建器。创建一个检查是否正在使用您的存储库为您的项目运行构建。如果是,则返回错误代码并使构建过程崩溃,否则,继续处理。
【讨论】:
这不是解决方案...我认为 GCP 也没有解决方案 您还可以限制同一项目中并行Cloud Build的数量。但它适用于所有构建,不仅适用于某些分支或存储库。【参考方案3】:我已经通过使用 Logging Router + Pub/Sub 触发器实现了顺序构建。
我的第一个构建是由提交触发并构建一个图像。
我检查了日志,发现构建完成时我们只有一条消息,例如 textPayload="Pushing gcr.io/my-project/my-repo/my_image:latest"
。
通过将上述内容用作过滤器,然后可以将其路由到 Pub/Sub 主题,该主题会触发我使用第一个图像的第二个构建。
可能不适用于所有用例,因为您需要找到一个发出的表示成功构建的事件,但在使用上述构建图像时它绝对有效。
【讨论】:
我不确定这是否解决了使事情顺序化的问题?如果您同时推送 2 次提交,您不会构建两次映像,并有 2 次“推送 ...”日志消息,然后导致 2 次新构建?以上是关于如何防止云构建并行运行构建?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Travis CI 中为 C++ 项目并行运行多个构建,每个构建都有单独的脚本?
如何让 Intellij IDEA 使用并行和 gradle 构建缓存进行构建