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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 19:55:18