You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 17:57:44