Azure DevOps Pipeline单代理如何完成当前构建再执行下一个?
单代理环境下实现流水线串行执行的配置方案
针对单代理被新构建抢占中断的问题,不同主流CI平台的配置方案如下:
GitHub Actions
通过concurrency关键字控制构建的并发策略,禁止中断正在运行的任务,让新构建排队等待:
concurrency: # 可根据需求调整分组规则,比如所有PR构建共用一个组就设为"pr-builds" group: ${{ github.workflow }}-${{ github.ref }} # 核心配置:不取消正在进行的构建 cancel-in-progress: false
配置后,新触发的构建会进入队列,直到当前构建的所有作业完成后才会启动。
GitLab CI
使用resource_group限制同一资源组内的任务串行执行,确保同一时间只有一个构建在代理上运行:
# 全局配置,让整个流水线的所有作业都遵循串行规则 workflow: resource_group: single-agent-build-queue # 也可以针对单个作业单独配置(如果仅部分作业需要串行) build-job-1: script: - echo "执行第一个构建作业" resource_group: single-agent-build-queue build-job-2: script: - echo "执行第二个构建作业" resource_group: single-agent-build-queue
同一resource_group下的任务会自动排队,不会中断正在运行的任务。
Azure DevOps
有两种简单的实现方式:
- 调整代理池队列并行度:进入Azure DevOps的代理池设置,找到你的代理所在队列,将「最大并行作业数」设为1。这种方式直接限制代理同一时间仅处理一个作业,所有新构建都会排队等待。
- 使用资源锁机制:通过自定义能力和任务实现锁,确保作业执行前获取锁,完成后释放:
pool: name: Your-Agent-Pool demands: - build-lock -equals available steps: - script: echo "获取构建锁" displayName: "Acquire Build Lock" # 这里可以配合脚本更新代理的自定义能力为"locked" # 你的构建作业步骤 - script: echo "释放构建锁" displayName: "Release Build Lock" # 更新代理的自定义能力为"available"
通用核心思路
所有方案的本质都是两点:
- 关闭CI工具的「新构建抢占中断正在运行任务」的默认设置;
- 限制代理同一时间仅能处理一个作业,让新构建进入等待队列而非直接抢占。
内容的提问来源于stack exchange,提问作者Linux Dev
相关产品推荐
相关产品推荐

