You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 15:07:05