GitLab Runner - 如何一次只允许运行一个管道

问题描述 投票:0回答:5

我是 GitLab 新手,面临一个问题:如果我在同一个 gitlab-runner 上同时触发两个管道,它们都会并行运行并导致失败。我想要的是将运行限制为一次只运行一个管道,而其他管道则在队列中运行。

我已经在 config.toml 中设置了

concurrent = 1
并重新启动了运行器,但没有帮助。我的最终目标是防止runner上多管道运行。

谢谢。

gitlab gitlab-ci gitlab-ci-runner
5个回答
15
投票

在作业中设置

resource_group
,并为所有其他应阻止的任务指定唯一的名称。

来自文档的示例:

deploy-to-production:
  script: deploy
  resource_group: production

5
投票

@phihag 的答案也适用于具有多个作业的管道。唯一缺少的是资源组的特定配置
设置 process_mode=oldest_first

curl --request PUT --data "process_mode=oldest_first" \
     --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/resource_groups/production"

0
投票

正如其他人提到的,

resource_groups
是您需要的关键功能。

正如您已经提到的,将

concurrent

 设置为 
1
 内的 
config.toml
 是不够的。尽管 Gitlab 会一个接一个地执行作业,但它会以无序的方式从不同的管道中获取作业,这可能是一个问题,正如您已经提到的,特别是当您使用 
shell
 执行器并且来自不同管道的作业运行时相同的构建。

您可以做的就是为所有作业提供相同的资源组,然后(现在这很重要)进行 API 调用并将该资源组的

process_mode

 设置为 
oldest_first
,因为默认值为 
unordered

现在第二个管道将不会启动并等待第一个管道完成,因此,一次运行一个管道,这正是您想要的。


0
投票
我在一个项目中遇到了类似的问题,我需要通过并行作业管理管道中的多个阶段,同时还在所有阶段之间维护一种“互斥”。

基于此处已提供的解决方案,我成功地通过

父子管道与“resource_groups”相结合来完成这项工作。

为了实现此目的,我为父作业使用了

resource_group

,并使用 
strategy: depend
 配置了它,以确保父作业等待子管道完成。该解决方案的好处是,独立于运行器配置和子管道配置。

父管道

.gitlab-ci.yml

stages: - trigger parent: stage: trigger resource_group: mutex trigger: include: - local: '.gitlab-ci-child.yml' strategy: depend
实际管道配置已移至

.gitlab-ci-child.yml


-7
投票
将配置的

runners 部分

中的 
limit 关键字设置为 1。

limit

限制此令牌可以同时处理的作业数量。 0(默认)只是意味着不限制

然后重新启动你的跑步者

© www.soinside.com 2019 - 2024. All rights reserved.