【发布时间】:2019-09-18 04:22:00
【问题描述】:
我们正在使用云构建在 GCP 上进行持续部署。当推动提交快速(例如在开发中)时,触发的构建并行运行。有时它们会互相干扰。例如,当两个应用引擎部署同时运行时。
有没有一种方法或最佳实践来强制从同一个构建触发器触发的构建一个接一个地运行?
问候, 卡斯滕
【问题讨论】:
-
我也在想同样的事情。您找到解决方案了吗?
我们正在使用云构建在 GCP 上进行持续部署。当推动提交快速(例如在开发中)时,触发的构建并行运行。有时它们会互相干扰。例如,当两个应用引擎部署同时运行时。
有没有一种方法或最佳实践来强制从同一个构建触发器触发的构建一个接一个地运行?
问候, 卡斯滕
【问题讨论】:
我通过在我的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
【讨论】:
你不能通过设置。但是您可以定义自定义构建器。创建一个检查是否正在使用您的存储库为您的项目运行构建。如果是,则返回错误代码并使构建过程崩溃,否则,继续处理。
【讨论】:
我已经通过使用 Logging Router + Pub/Sub 触发器实现了顺序构建。
我的第一个构建是由提交触发并构建一个图像。
我检查了日志,发现构建完成时我们只有一条消息,例如 textPayload="Pushing gcr.io/my-project/my-repo/my_image:latest"。
通过将上述内容用作过滤器,然后可以将其路由到 Pub/Sub 主题,该主题会触发我使用第一个图像的第二个构建。
可能不适用于所有用例,因为您需要找到一个发出的表示成功构建的事件,但在使用上述构建图像时它绝对有效。
【讨论】: