GitLab CI/CD如何配置实现同阶段任务串行顺序执行
问题根因
调整Runner侧并发参数后同阶段任务仍然并行的核心原因:
- GitLab CI 同一
stage下的所有Job默认会被标记为待调度状态,只要有可用计算资源就会并行派发 - Runner侧的
concurrent/limit/request_concurrency参数仅能限制单台Runner同时运行的任务数,如果你环境中存在多台绑定该项目的可用Runner,或者GitLab侧没有给任务加串行调度约束,同阶段任务依然会被分配到不同Runner并行执行
解决方案
方案1:使用resource_group(最推荐,适配部署场景)
给所有需要串行执行的部署任务配置相同的resource_group,GitLab会保证同一资源组下同一时间只有1个Job运行,不管是同流水线内的任务、还是同项目不同流水线触发的任务,都会自动排队等前一个执行完成再启动,完全满足串行要求,不需要拆分原有stage结构。
配置示例:
deploy_1: script: - scp -r $CI_PROJECT_DIR/script.sh ubuntu@domain1.tld.pl:/root/script.sh stage: deploy resource_group: serial_deploy # 所有需要串行的任务填相同的自定义组名即可 only: - master deploy_2: script: - scp -r $CI_PROJECT_DIR/script.sh ubuntu@domain2.tld.pl:/root/script.sh stage: deploy resource_group: serial_deploy only: - master
方案2:拆分独立stage(适合需要严格指定执行顺序的场景)
GitLab CI的stage是严格按定义顺序执行的,前一个stage的所有Job执行成功后,才会启动下一个stage的任务。你可以把每个部署任务拆分到单独的自定义stage中,强制按顺序执行。
配置示例:
# 首先在文件最开头定义stages执行顺序,按你需要的部署先后排列 stages: - deploy_1 - deploy_2 # 后续新增部署任务就按顺序在这里追加stage名 deploy_1: script: - scp -r $CI_PROJECT_DIR/script.sh ubuntu@domain1.tld.pl:/root/script.sh stage: deploy_1 only: - master deploy_2: script: - scp -r $CI_PROJECT_DIR/script.sh ubuntu@domain2.tld.pl:/root/script.sh stage: deploy_2 only: - master
配置生效排查点
如果配置后仍然出现并行问题,逐一检查以下配置:
- 打开项目CI/CD设置的Runner列表,确认没有其他可用的共享Runner/项目Runner,避免任务被调度到其他未配置并发限制的Runner上
- 确认修改Runner的
config.toml配置文件后,已经执行gitlab-runner restart命令重启Runner服务,否则配置不会生效 - 检查所有部署Job的配置,删除
parallel这类会触发单任务多副本并行的参数
内容的提问来源于stack exchange,提问作者onev
相关产品推荐
相关产品推荐

