如何确保Azure自托管代理一次仅运行一个流水线阶段或作业?
确保Azure DevOps自托管代理一次仅运行一个作业/阶段
你已实现阶段并发执行,但多个阶段被分配到同一代理引发资源冲突,且此前的故障实际源于遗留Docker容器未清理。要确保每个代理一次仅处理一个作业/阶段,可通过以下方式实现:
1. 修改自托管代理启动参数
自托管代理默认根据CPU核心数设置并行作业数,你可在启动时指定--maxparallel 1参数,强制代理单次仅运行一个作业:
- Linux/macOS:启动时执行
./run.sh --maxparallel 1 - Windows:启动时执行
run.cmd --maxparallel 1
若代理以系统服务运行,需修改服务配置:
- Windows:在服务属性的「可执行文件路径」末尾追加
--maxparallel 1 - Linux(systemd):修改代理service文件,在
ExecStart行末尾添加--maxparallel 1,之后重新加载服务配置
2. 配置代理池全局并行限制
在Azure DevOps组织设置中,直接限制池内每个代理的最大并行作业数:
- 进入组织设置 → 代理池 → 选择你的自托管代理池
- 打开「池设置」,找到「最大并行作业数」选项
- 选择「每个代理1个作业」并保存
此方式对池内所有代理生效,无需逐个修改代理配置。
3. 作业级独占代理配置(灵活场景)
若仅需特定作业独占代理,可结合代理标签与作业需求实现:
- 给每个自托管代理添加唯一标签(如
agent-01、agent-02) - 在流水线作业中指定需求,确保每个作业分配到对应标签的代理:
jobs: - job: Job1 demands: - agent.name -equals agent-01 steps: # 作业步骤... - job: Job2 demands: - agent.name -equals agent-02 steps: # 作业步骤...
额外提醒:环境清理
结合你此前排查的遗留Docker容器问题,建议在每个作业末尾添加清理步骤,避免残留资源影响后续作业:
steps: # 业务步骤... - task: Bash@3 displayName: 清理Docker环境 inputs: targetType: 'inline' script: | # 停止所有运行中容器(忽略错误) docker stop $(docker ps -q) || true # 删除所有已停止容器(忽略错误) docker rm $(docker ps -aq) || true
内容的提问来源于stack exchange,提问作者eltiare
相关产品推荐
相关产品推荐

