我是 GitLab 新手,面临一个问题:如果我在同一个 gitlab-runner 上同时触发两个管道,它们都会并行运行并导致失败。我想要的是将运行限制为一次只运行一个管道,而其他管道则在队列中运行。
我已经在 config.toml 中设置了
concurrent = 1
并重新启动了运行器,但没有帮助。我的最终目标是防止runner上多管道运行。
谢谢。
在作业中设置
resource_group
,并为所有其他应阻止的任务指定唯一的名称。
来自文档的示例:
deploy-to-production:
script: deploy
resource_group: production
@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"
正如其他人提到的,
resource_groups
是您需要的关键功能。
正如您已经提到的,将 concurrent
设置为
1
内的
config.toml
是不够的。尽管 Gitlab 会一个接一个地执行作业,但它会以无序的方式从不同的管道中获取作业,这可能是一个问题,正如您已经提到的,特别是当您使用
shell
执行器并且来自不同管道的作业运行时相同的构建。您可以做的就是为所有作业提供相同的资源组,然后(现在这很重要)进行 API 调用并将该资源组的
process_mode
设置为
oldest_first
,因为默认值为
unordered
。现在第二个管道将不会启动并等待第一个管道完成,因此,一次运行一个管道,这正是您想要的。
基于此处已提供的解决方案,我成功地通过
父子管道与“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
。