恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
GitLab_Pipeline 级限制 Job 并发实例
首页
资讯中心
/
GitLab_Pipeline 级限制 Job 并发实例
GitLab_Pipeline 级限制 Job 并发实例
发布时间:2026/8/25 6:04:13
Pipeline 级限制 Job 并发实例背景与问题GitLab CI/CD 默认并发执行流水线。当短时间内推送多个 commit 时多条流水线会同时运行可能导致多个部署或测试 job 同时访问同一基础设施造成冲突或状态损坏。某项目的测试阶段需要将构建产物部署到两台测试服务器Windows 10 与 Windows Server 2019并执行自动化测试。如果多条流水线的测试阶段并发运行会同时向同一批测试服务器部署和测试产生资源竞争与状态混乱。解决方案Pipeline 级并发锁通过在trigger job上设置resource_group将整个下游子Pipeline 作为一个并发锁单位。这样可以实现非敏感 job如 build仍可跨流水线并发执行最大化效率。包含测试 job 的子 Pipeline 被串行化同一时间只有一条流水线的测试阶段在运行。子 Pipeline 内部的多个 job 仍可并行执行。核心配置要素配置项作用resource_group在 trigger job 上声明资源组对该 job及其触发的子 Pipeline加并发锁trigger.include指定子 Pipeline 的配置文件local / project / templatestrategy: mirror必须设置。使 trigger job 等待子 Pipeline 完成后才释放锁否则锁在子 Pipeline 启动后即释放无法实现 Pipeline 级控制资源组处理模式资源组支持四种处理模式控制等待中的 job 执行顺序处理模式说明unordered默认模式。job 就绪即执行不保证顺序oldest_first按 pipeline ID 升序先执行最旧流水线的 jobnewest_first按 pipeline ID 降序先执行最新流水线的 job每个 job 须幂等newest_ready_first优先执行已就绪的最新流水线避免 newest_first 抢占当前流水线项目实例项目采用父子 Pipeline 架构父 Pipeline.gitlab-ci.yml负责构建并触发测试子 Pipeline.gitlab-ci-test.yml。测试子 Pipeline 内两台测试服务器并行执行但多条流水线的测试子 Pipeline 之间串行执行。父 Pipeline 关键配置以下仅保留.gitlab-ci.yml中与并发控制相关的关键配置stages:-build-test-deploybuild-job:stage:build# ... 编译并打包 artifacts.rar ...artifacts:paths:-artifacts.rar# 测试阶段以整个子 Pipeline 为并发锁单位test-pipeline:stage:testresource_group:test# 关键以整个子 Pipeline 为并发锁单位variables:PARENT_PIPELINE_ID:$CI_PIPELINE_ID# 传递父 Pipeline ID 供子 Pipeline 下载产物trigger:include:-local:.gitlab-ci-test.ymlstrategy:mirror# 关键等待子 Pipeline 结束后才释放锁deploy-job:stage:deployrules:-if:$CI_COMMIT_TAG子 Pipeline 关键配置以下仅保留.gitlab-ci-test.yml中与并发控制和测试分发相关的关键配置stages:-test.test:stage:test# ... 通过 PSSession 远程拉取代码、拷贝产物、执行自动化测试 ...# 子 Pipeline 不自动继承父 Pipeline 的 artifacts需显式下载needs:-pipeline:$PARENT_PIPELINE_ID# 引用父 Pipeline 传入的 IDjob:build-jobartifacts:trueartifacts:reports:junit:test-reports/*.xml# 两台测试服务器在子 Pipeline 内并行执行test-in-windows10:extends:.testvariables:PLATFORM:windows10IP:10.10.10.101test-in-windowsserver2019:extends:.testvariables:PLATFORM:windows server 2019IP:10.10.10.146并发控制效果当短时间内推送多个 commit 触发多条流水线时并发控制效果如下层级job / Pipeline并发行为跨流水线build-job并发执行互不阻塞跨流水线test-pipeline触发子 Pipeline串行执行。resource_group: test 保证同一时间只有一条子 Pipeline 运行子 Pipeline 内test-in-windows10 / test-in-windowsserver2019并行执行两台服务器同时测试注意事项strategy: mirror 不可省略若未设置strategy: mirrortrigger job 会在子 Pipeline 启动后立即结束并释放资源锁无法实现 Pipeline 级并发控制。避免死锁若父 Pipeline 和子 Pipeline 请求同一 resource_group且处理模式为oldest_first可能产生死锁——子 Pipeline 等待父 Pipeline 的 deploy job 释放锁而 deploy job 又在等待子 Pipeline 完成。正确做法是在父 Pipeline 的 trigger job上声明 resource_group而非在子 Pipeline 内部声明。子 Pipeline 产物继承子 Pipeline 不会自动继承父 Pipeline 的 artifacts。需通过needs关键字配合pipeline: $PARENT_PIPELINE_ID显式下载父 Pipeline 的构建产物。参考文档GitLab Resource Groups — Pipeline-level concurrency control