Azure Pipeline多分支用同一构建代理时,如何让排队流水线等当前流水线完成?
解决Azure Pipeline多分支下流水线排队等待的问题
要实现排队中的Azure Pipeline等待当前流水线所有阶段完成后再启动,核心是利用Azure Pipeline的**互斥锁(Mutex)**功能,通过自定义锁控制流水线的执行顺序。以下分两种常见场景给出实现方案:
场景1:同一分支内的流水线串行执行
如果希望同一代码分支的后续流水线等待当前流水线全阶段完成再启动,可以为每个分支创建专属锁:
trigger: branches: include: - main - develop - feature/* pool: vmImage: 'ubuntu-latest' stages: - stage: Build jobs: - job: BuildJob lockBehavior: wait lock: name: '$(Build.SourceBranchName)-Pipeline-Lock' type: 'mutex' steps: - script: echo 构建分支 $(Build.SourceBranchName) displayName: '执行构建' - stage: Test dependsOn: Build jobs: - job: TestJob lockBehavior: wait lock: name: '$(Build.SourceBranchName)-Pipeline-Lock' type: 'mutex' steps: - script: echo 测试分支 $(Build.SourceBranchName) displayName: '执行测试' - stage: Deploy dependsOn: Test jobs: - job: DeployJob lockBehavior: wait lock: name: '$(Build.SourceBranchName)-Pipeline-Lock' type: 'mutex' steps: - script: echo 部署分支 $(Build.SourceBranchName) displayName: '执行部署'
说明
$(Build.SourceBranchName)会自动替换为当前分支名称,确保每个分支拥有独立的锁lockBehavior: wait指定锁被占用时,作业会排队等待而非直接失败- 当前分支的流水线所有作业完成后,锁会自动释放,后续排队的同分支流水线即可启动
场景2:所有分支的流水线全局串行执行
如果希望所有分支的流水线都串行执行(无论哪个分支,同一时间仅能运行一条),可以使用全局固定锁:
trigger: branches: include: - main - develop - feature/* pool: vmImage: 'ubuntu-latest' stages: - stage: 获取全局锁 jobs: - job: AcquireGlobalLock lockBehavior: wait lock: name: 'Global-Pipeline-Exclusive-Lock' type: 'mutex' steps: - script: echo 获取全局锁,启动流水线执行 displayName: '获取锁' - stage: Build dependsOn: 获取全局锁 jobs: - job: BuildJob steps: - script: echo 构建分支 $(Build.SourceBranchName) displayName: '执行构建' - stage: Test dependsOn: Build jobs: - job: TestJob steps: - script: echo 测试分支 $(Build.SourceBranchName) displayName: '执行测试' - stage: Deploy dependsOn: Test jobs: - job: DeployJob steps: - script: echo 部署分支 $(Build.SourceBranchName) displayName: '执行部署' - stage: 释放全局锁 dependsOn: Deploy jobs: - job: ReleaseGlobalLock lock: name: 'Global-Pipeline-Exclusive-Lock' type: 'mutex' release: true steps: - script: echo 释放全局锁,允许后续流水线启动 displayName: '释放锁'
说明
- 第一个阶段的作业专门获取全局锁,最后一个阶段的作业手动释放锁
- 整个流水线从启动到结束期间持有全局锁,所有分支的后续流水线都会排队等待锁释放
release: true用于手动释放锁,确保锁仅在全阶段完成后才释放
内容的提问来源于stack exchange,提问作者Girish Bellamkonda
相关产品推荐
相关产品推荐

