Jenkins Agent频繁离线求助:如何实现持续在线或触发时检测?
解决Jenkins Agent离线/自动重连及构建前状态检查问题
一、让Agent始终保持在线的方案
1. 将Agent配置为系统服务(推荐)
- Windows:在Agent节点的Jenkins Agent窗口,点击
File->Install as a service,按照提示完成注册。注册后Agent会随系统自动启动,意外退出时服务管理器会自动重启它。 - Linux:通过systemd配置守护服务,创建
/etc/systemd/system/jenkins-agent.service文件,内容如下:
[Unit] Description=Jenkins Agent After=network.target [Service] User=jenkins-agent ExecStart=/usr/bin/java -jar /path/to/agent.jar -jnlpUrl http://你的Jenkins地址/computer/[Agent名称]/slave-agent.jnlp -secret [你的Agent密钥] Restart=always RestartSec=10 [Install] WantedBy=multi-user.target
执行以下命令启用并启动服务:
sudo systemctl daemon-reload sudo systemctl enable jenkins-agent.service sudo systemctl start jenkins-agent.service
此配置会让Agent意外退出后自动重启重连。
2. 配置Jenkins内置重连机制
进入Jenkins控制台的Agent配置页(Manage Jenkins -> Manage Nodes and Clouds -> 选中目标Agent -> Configure),调整以下设置:
- 在
Availability区域选择Keep this agent online as much as possible - 若支持,勾选
Launch agent via Java Web Start下的Use WebSocket,WebSocket比JNLP连接更稳定,降低离线概率 - 设置
Reconnect interval为10秒左右,让Agent离线后自动尝试重连
二、触发构建时检查Agent状态的方案
1. Pipeline脚本内置检查
如果使用Pipeline任务,可在构建开始前添加状态检查逻辑,示例:
pipeline { agent { label '你的Agent标签' } stages { stage('Agent状态预检查') { steps { script { def targetAgent = Jenkins.instance.getNode('你的Agent名称') if (!targetAgent || targetAgent.toComputer().isOffline()) { error "Agent ${targetAgent.name} 处于离线状态,终止构建。" } } } } stage('正式构建') { steps { echo '开始构建任务...' // 此处添加构建命令 } } } }
脚本会在构建前校验Agent状态,若离线则直接终止并抛出错误。
2. Shell/Bat脚本前置检查(适配自由风格任务)
在构建步骤中加入状态检查脚本,需提前在Jenkins用户设置中生成API令牌:
- Linux Shell脚本示例:
AGENT_NAME="你的Agent名称" JENKINS_URL="http://你的Jenkins地址" API_TOKEN="你的Jenkins API令牌" USERNAME="你的Jenkins用户名" # 调用Jenkins API获取Agent状态 AGENT_STATUS=$(curl -s -u "${USERNAME}:${API_TOKEN}" "${JENKINS_URL}/computer/${AGENT_NAME}/api/json" | grep -o '"offline":true\|"offline":false') if [[ $AGENT_STATUS == '"offline":true' ]]; then echo "Agent ${AGENT_NAME} 离线,终止构建。" exit 1 else echo "Agent ${AGENT_NAME} 在线,继续执行构建。" fi
- Windows Bat脚本示例:
set AGENT_NAME=你的Agent名称 set JENKINS_URL=http://你的Jenkins地址 set USERNAME=你的Jenkins用户名 set API_TOKEN=你的Jenkins API令牌 :: 调用Jenkins API检查Agent状态 curl -s -u "%USERNAME%:%API_TOKEN%" "%JENKINS_URL%/computer/%AGENT_NAME%/api/json" | findstr /C:"\"offline\":true" >nul if %errorlevel% equ 0 ( echo Agent %AGENT_NAME% 离线,终止构建。 exit /b 1 ) else ( echo Agent %AGENT_NAME% 在线,继续执行构建。 )
三、Agent离线自动恢复脚本(替代系统服务方案)
如果不想配置系统服务,可编写监控脚本定期检查Agent进程,不存在则重启:
- Windows Bat脚本(通过任务计划定期执行):
@echo off set AGENT_JAR_PATH=C:\路径\到\agent.jar set JNLP_URL=http://你的Jenkins地址/computer/[Agent名称]/slave-agent.jnlp set SECRET=你的Agent密钥 :: 检查Agent进程是否运行 tasklist | findstr /i "java.exe" | findstr /i "%AGENT_JAR_PATH%" >nul if %errorlevel% neq 0 ( echo Jenkins Agent未运行,正在重启... start "Jenkins Agent" java -jar "%AGENT_JAR_PATH%" -jnlpUrl "%JNLP_URL%" -secret "%SECRET%" )
- Linux Shell脚本(通过crontab定期执行):
#!/bin/bash AGENT_JAR_PATH="/路径/到/agent.jar" JNLP_URL="http://你的Jenkins地址/computer/[Agent名称]/slave-agent.jnlp" SECRET="你的Agent密钥" # 检查Agent进程是否存在 if ! pgrep -f "$AGENT_JAR_PATH" > /dev/null; then echo "Jenkins Agent未运行,正在重启..." nohup java -jar "$AGENT_JAR_PATH" -jnlpUrl "$JNLP_URL" -secret "$SECRET" > /var/log/jenkins-agent.log 2>&1 & fi
内容的提问来源于stack exchange,提问作者Yashwanth ArulMozhi
相关产品推荐
相关产品推荐

