Azure DevOps YAML流水线:同一阶段多节点池及优先级配置问询
Azure DevOps YAML流水线多代理池优先级调度实现方案
目前Azure DevOps没法直接给单个阶段指定多个代理池并设置调度优先级,但可以通过并行阶段+取消策略的方式实现你要的逻辑:优先用vmpool,当vmpool没空闲资源时自动切到dockerpool。
核心方案:并行阶段+自动取消备用阶段
思路很直接:
- 定义两个内容完全一致的并行阶段,分别绑定
vmpool和dockerpool - 让
dockerpool的阶段仅在vmpool阶段启动失败/被取消时才运行 - 一旦
vmpool的阶段成功启动,立刻取消dockerpool的阶段,避免资源浪费
YAML代码示例
stages: # 优先执行的VM代理池阶段 - stage: Deploy_VM_Priority pool: vmpool jobs: - job: Deployment_Task steps: - script: echo "正在VM代理上执行部署任务" displayName: VM池部署 # 备用的Docker代理池阶段 - stage: Deploy_Docker_Fallback dependsOn: Deploy_VM_Priority # 仅当VM阶段失败或取消时触发本阶段 condition: or(failed('Deploy_VM_Priority'), canceled('Deploy_VM_Priority')) pool: dockerpool jobs: - job: Deployment_Task steps: - script: echo "VM池无空闲资源,切换到Docker代理执行部署" displayName: Docker池部署 # 检查VM阶段是否成功启动,是则取消本阶段 - job: Cancel_Fallback_If_Needed condition: succeeded('Deploy_VM_Priority') steps: - script: | az devops invoke --org $(System.TeamFoundationCollectionUri) --project $(System.TeamProject) \ --area build --resource builds --route-parameters buildId=$(Build.BuildId) \ --api-version 7.1-preview.6 --http-method PATCH --body '{"status":"Cancelled"}' displayName: 取消备用阶段 env: AZURE_DEVOPS_EXT_PAT: $(System.AccessToken)
注意事项
- 权限配置:流水线的服务账户需要拥有
Build (Update)权限,否则无法通过API取消阶段 - 失败场景覆盖:VM阶段的失败包括代理池无空闲资源导致的队列超时、代理启动失败等,这些情况都会触发Docker阶段的执行
- 简化版可选:如果不想编写取消逻辑,也可以仅保留
condition: failed('Deploy_VM_Priority'),但此时VM阶段若处于排队状态,Docker阶段不会立即启动,需要给VM阶段设置合理的队列超时时间
另外还有一种轻量方案:如果你的阶段仅包含单个作业,可以提前用脚本调用Azure DevOps REST API检查vmpool的可用代理数,再通过变量控制作业的池选择,但这种方式需要额外编写状态检查脚本,不如并行阶段方案省心。
内容的提问来源于stack exchange,提问作者Vowneee
相关产品推荐
相关产品推荐

