我正在使用一个Webhook来触发我的Gitlab管道。有时,会多次触发此触发器,但是我的管道仅需运行最后一个(静态站点生成)。现在,它将运行与我触发的一样多的管道。我的管道需要20分钟,因此有时一天中的其余时间都在运行,这完全没有必要。
https://docs.gitlab.com/ee/ci/yaml/#interruptible和https://docs.gitlab.com/ee/user/project/pipelines/settings.html#auto-cancel-pending-pipelines仅适用于推送提交,不适用于触发器
答案 0 :(得分:0)
gitlab-org/gitlab-foss
issue 41560
用例示例:
我想始终推送相同的Docker“ image:tag”,例如:“ myapp:dev-CI”。这个想法是“ myapp:dev-CI”应该始终是与develop分支的HEAD相匹配的应用程序的最新Docker镜像。
但是,如果推送了2次提交,则将在paralell中触发并执行2条管道。然后,最新触发的管道通常在最旧的管道之前完成。
结果,推送的Docker镜像不是最新的。
作为* nix的一种解决方法,您可以从API获取正在运行的管道,然后等待它们完成或使用相同的API取消它们。
在下面的示例中,脚本检查同一分支和睡眠状态的ID较低的正在运行的管道。
要使此代码正常工作,必须使用jq软件包。
Or:
- 创建一个新的跑步者实例
- 配置它以运行标记为
concurrency 1
的作业- 将deploy标签添加到CD作业中。
现在不可能同时运行两个部署作业。
为了防止较旧的管道可能在新管道之后运行的情况,如果当前管道ID小于当前部署,请在您的部署作业中添加一个检查以退出。
对我来说,有一个小变化:我将全局
concurrency
设置为相同(我的计算机上有8个运行程序,因此并发:8)。
但是,我用deploy
标记了一名赛跑者,并在其配置中添加了limit: 1
。
然后,我将.gitlab-ci.yml
更新为在我的deploy
作业中使用deploy
标记。
完美运行:我的code_tests
作业可以同时在7个运行程序上运行,但是deploy
是“单线程”,其他任何deploy
作业都进入待处理状态,直到该运行程序被释放。