如何中断触发的gitlab管道

时间:2020-02-09 11:18:26

标签: gitlab-ci gitlab-ci-runner

我正在使用一个Webhook来触发我的Gitlab管道。有时,会多次触发此触发器,但是我的管道仅需运行最后一个(静态站点生成)。现在,它将运行与我触发的一样多的管道。我的管道需要20分钟,因此有时一天中的其余时间都在运行,这完全没有必要。

https://docs.gitlab.com/ee/ci/yaml/#interruptiblehttps://docs.gitlab.com/ee/user/project/pipelines/settings.html#auto-cancel-pending-pipelines仅适用于推送提交,不适用于触发器

1 个答案:

答案 0 :(得分:0)

gitlab-org/gitlab-foss issue 41560

中讨论了类似的问题

用例示例:

我想始终推送相同的Docker“ image:tag”,例如:“ myapp:dev-CI”。这个想法是“ myapp:dev-CI”应该始终是与develop分支的HEAD相匹配的应用程序的最新Docker镜像。
但是,如果推送了2次提交,则将在paralell中触发并执行2条管道。然后,最新触发的管道通常在最旧的管道之前完成。
结果,推送的Docker镜像不是最新的。

Proposition

作为* nix的一种解决方法,您可以从API获取正在运行的管道,然后等待它们完成或使用相同的API取消它们。
在下面的示例中,脚本检查同一分支和睡眠状态的ID较低的正在运行的管道。
要使此代码正常工作,必须使用jq软件包。

Or

  • 创建一个新的跑步者实例
  • 配置它以运行标记为concurrency 1的作业
  • 将deploy标签添加到CD作业中。

现在不可能同时运行两个部署作业。

为了防止较旧的管道可能在新管道之后运行的情况,如果当前管道ID小于当前部署,请在您的部署作业中添加一个检查以退出。

Slight modification

对我来说,有一个小变化:我将全局concurrency设置为相同(我的计算机上有8个运行程序,因此并发:8)。
但是,我用deploy标记了一名赛跑者,并在其配置中添加了limit: 1
然后,我将.gitlab-ci.yml更新为在我的deploy作业中使用deploy标记。
完美运行:我的code_tests作业可以同时在7个运行程序上运行,但是deploy是“单线程”,其他任何deploy作业都进入待处理状态,直到该运行程序被释放。