Azure DevOps部署组目标频繁离线(服务器正常):测试与解决问询
如何模拟Azure DevOps部署组目标离线状态?以及自托管代理保活方案
我们使用自托管服务器作为Azure DevOps部署组目标,频繁出现服务器正常运行但部署组目标显示离线的问题。此前遇到该问题时,会手动到服务器的vstsagent目录执行命令恢复,现已编写每小时运行的PowerShell脚本,用于检查目标状态并自动恢复在线。以下是当前脚本:
$agentName = "Hosted Agent" $poolId = 9 $projectUrl = "https://dev.azure.com/empiricaledge/demo-jazi" # 检查代理状态 $agentStatus = & "$env:SYSTEMDIALOGSHELLEXECUTIONPOLICY" .\config.cmd status if ($agentStatus -like "offline") { # 若代理离线则恢复在线 & "$env:SYSTEMDIALOGSHELLEXECUTIONPOLICY" .\config.cmd --unattended --url $projectUrl --auth PAT --token ixzblm6i2ubw3vonwemukwzc2grdcddlho6oifavmqzdnvdaetzq --pool $poolId --agent $agentName --replace --acceptTeeEula --work '_work' --runAsService }
一、模拟部署组目标离线的方法
- 停止代理服务:若代理以Windows服务运行,打开服务管理器,找到名称包含代理名的
Azure Pipelines Agent服务,右键停止。数分钟后Azure DevOps门户会标记该目标为离线,适合测试脚本触发逻辑。 - 断开代理注册:在vstsagent目录执行命令:
.\config.cmd remove,执行后代理会从部署组中移除,状态变为离线。测试完成后可通过脚本重新注册恢复。 - 临时阻断网络通信:在服务器上临时禁用网卡,或设置防火墙规则阻断到
dev.azure.com的443端口连接。等待5-10分钟,Azure DevOps会因接收不到心跳标记目标为离线,测试后恢复网络即可。
二、确保代理始终在线的优化方案
1. 修正并优化现有脚本
原脚本存在变量错误($env:SYSTEMDIALOGSHELLEXECUTIONPOLICY并非有效环境变量),且状态判断逻辑不够严谨,以下是修正后的版本:
$agentName = "Hosted Agent" $poolId = 9 $projectUrl = "https://dev.azure.com/empiricaledge/demo-jazi" $logPath = "C:\vstsagent\agent_health.log" # 日志文件路径,可自行修改 $agentDir = "C:\vstsagent" # 替换为你的实际vstsagent目录 # 切换到代理目录 Set-Location $agentDir # 精准获取代理状态 $statusOutput = .\config.cmd status $agentStatus = ($statusOutput | Select-String "Status:").ToString().Split(":")[1].Trim() # 记录日志 Add-Content -Path $logPath -Value "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss'): 当前代理状态:$agentStatus" if ($agentStatus -eq "Offline") { Add-Content -Path $logPath -Value "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss'): 开始恢复代理..." # 重新注册代理 .\config.cmd --unattended --url $projectUrl --auth PAT --token ixzblm6i2ubw3vonwemukwzc2grdcddlho6oifavmqzdnvdaetzq --pool $poolId --agent $agentName --replace --acceptTeeEula --work '_work' --runAsService Add-Content -Path $logPath -Value "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss'): 代理恢复操作执行完成" }
- 优化点:添加日志记录、精准解析状态、修正执行命令的错误、指定代理目录避免路径问题。
2. 服务级别的监控与自动重启
- 使用Windows任务计划程序:创建触发条件为「当特定服务停止时」的任务,任务动作设置为重启
Azure Pipelines Agent服务,无需重新注册代理,效率更高。 - 使用NSSM工具:将代理进程包装为Windows服务,配置服务的「失败时」动作(如失败后自动重启),增强服务的稳定性。
3. 调整代理心跳参数
编辑代理目录下的config.json文件,调整以下参数(单位为秒):
heartbeatInterval:代理发送心跳的间隔,默认30秒,可适当增大至60秒heartbeatTimeout:Azure DevOps等待心跳的超时时间,默认120秒,可增大至180秒
调整后重启代理服务,减少因网络波动导致的误判离线。
4. 定期重启代理
设置每周/每月的定时任务,重启Azure Pipelines Agent服务,预防因内存泄漏、进程卡死导致的离线问题。
内容的提问来源于stack exchange,提问作者Jaseela KA
相关产品推荐
相关产品推荐

