Azure DevOps中作业无法并行执行问题求助
问题分析与解决方案
核心问题是VMSS生成的虚拟机未安装并注册Azure Pipelines代理,导致Azure DevOps代理池仅显示VMSS配置条目,无可用代理节点,进而无法并行执行作业。即使VMSS已扩容,DevOps无法识别这些虚拟机作为代理资源。
解决步骤
1. 为VMSS添加代理自动安装扩展
需要在VMSS配置中加入自定义脚本扩展,让虚拟机启动时自动下载、安装并注册Azure Pipelines代理到指定池。
修改后的VMSS脚本片段
在原脚本最后添加以下扩展配置:
# 添加自定义脚本扩展,自动安装Azure Pipelines代理 $agentInstallScript = @" powershell -ExecutionPolicy Bypass -Command "& { `$agentVersion = '2.220.2' # 替换为兼容的最新代理版本 `$agentPackageUrl = "https://vstsagentpackage.azureedge.net/agent/`$agentVersion/vsts-agent-win-x64-`$agentVersion.zip" `$agentInstallDir = 'C:\AzPipelinesAgent' New-Item -Path `$agentInstallDir -ItemType Directory -Force | Out-Null # 下载并解压代理包 Invoke-WebRequest -Uri `$agentPackageUrl -OutFile "`$agentInstallDir\agent.zip" -UseBasicParsing Expand-Archive -Path "`$agentInstallDir\agent.zip" -DestinationPath `$agentInstallDir -Force # 注册代理到Azure DevOps `$orgUrl = 'https://dev.azure.com/你的组织名' `$poolName = '你的VMSS代理池名' `$patToken = '你的PAT令牌' # 需具备Agent Pools读写权限 & `$agentInstallDir\config.cmd --unattended ` --url `$orgUrl ` --auth pat ` --token `$patToken ` --pool `$poolName ` --agent `$env:COMPUTERNAME ` --replace ` --acceptTeeEula # 设置代理为开机自启 & `$agentInstallDir\svc.cmd install & `$agentInstallDir\svc.cmd start }" "@ $vmssConfig = $vmssConfig | Add-AzVmssExtension ` -Publisher 'Microsoft.Compute' ` -ExtensionType 'CustomScriptExtension' ` -TypeHandlerVersion '1.10' ` -Name 'InstallPipelinesAgent' ` -Setting @{ "commandToExecute" = $agentInstallScript }
2. 确认代理池与作业配置
- 并行额度限制:你的项目有2个并行作业额度,即使VMSS扩容到4台,最多也只能同时运行2个作业,需注意此限制。
- 代理能力匹配:检查作业定义中的
需求(如操作系统、工具版本)是否与VMSS虚拟机的能力一致,避免因不匹配导致作业无法分配。 - 代理池设置:进入Azure DevOps代理池页面,确认
最大并行作业数设置(每个代理默认支持1个作业,若需单代理多作业可调整)。
3. 验证与排查
- 查看VMSS虚拟机的自定义脚本扩展日志(Azure门户→VMSS→虚拟机→扩展→InstallPipelinesAgent→日志),确认代理安装注册是否成功。
- 刷新Azure DevOps代理池页面,若配置正确,会看到VMSS生成的虚拟机作为代理节点出现在池中。
- 触发作业,检查是否按额度限制并行执行(最多2个作业同时运行)。
关键注意事项
- PAT令牌需拥有
Agent Pools (Read & manage)权限,建议通过Azure Key Vault安全存储,避免硬编码。 - 代理版本需与Azure DevOps服务器版本兼容,可从官方渠道获取最新版本号。
- 确保NSG允许虚拟机访问以下HTTPS端点:
https://dev.azure.com、https://vstsagentpackage.azureedge.net。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

