如何防止云构建并行运行构建?

时间:2019-04-29 14:08:02

标签: google-cloud-build

我们正在使用云构建在GCP上进行连续部署。当快速提交提交时(例如在开发中),触发的构建并行运行。有时那些会互相干扰。例如,当两个App Engine部署同时运行时。

是否有一种方法或最佳实践来强制由同一构建触发器触发的构建依次运行?

关于, 卡斯滕

3 个答案:

答案 0 :(得分:2)

我通过在 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

答案 1 :(得分:0)

您无法通过设置进行设置。但是您可以定义自定义生成器。创建一个版本库,以检查您的项目是否正在与您的存储库一起运行。如果是,则返回错误代码并使构建过程崩溃,否则,继续进行处理。

答案 2 :(得分:0)

我通过使用 Logging Router + Pub/Sub 触发器实现了顺序构建。

我的第一个构建是由提交触发并构建一个图像。 我检查了日志,发现构建完成后,我们有一条类似 textPayload="Pushing gcr.io/my-project/my-repo/my_image:latest" 的消息。

通过将上述内容用作过滤器,然后可以将其路由到 Pub/Sub 主题,从而触发我使用第一个图像的第二个构建。

可能不适用于所有用例,因为您需要找到一个发出的表示构建成功的事件,但在使用上述方法构建图像时绝对有效。