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

使用Publish Over SSH与SSH Pipeline Steps插件时Jenkins流水线日志异常

Jenkins Pipeline执行远程Maven命令因日志过多超时的解决方案

问题描述

使用Jenkins Pipeline结合Publish Over SSH和SSH Pipeline Steps插件在远程Java构建服务器执行shell脚本时,遇到以下问题:

  • 当Maven命令生成大量日志时,流水线无法正常结束,直至触发超时
  • 若限制Maven日志行数在30行以内(如使用-q参数),流水线可正常完成
  • 已尝试Publish Over SSH的高级执行选项,未解决问题

Pipeline代码片段

...
stage('Build') {
    steps {
        script {                    
            def remote = [
                name: 'vm-dev',
                host: 'dev.myhost.com',
                user: 'user',
                identityFile: '/var/lib/jenkins/.ssh/ssh-key',
                allowAnyHosts: true
            ]                    
            sshCommand remote: remote, command: "/home/user/workspace/dev/scripts/java15/02-build.sh ${BUILD_NUMBER}"
        }
    }
}
...

远程Shell脚本代码

#!/bin/bash

set -e

source "$HOME/.sdkman/bin/sdkman-init.sh"
sdk use java 15.0.2-open

mvn clean install -U -DskipTests=true -q # 日志问题出在这里

if [ $? -ne 0 ]; then
    echo "Fail."
    exit 1
fi
echo "Success."

exit 0

解决方法

1. 重定向Maven日志到本地文件

将Maven日志写入远程服务器的本地文件,仅在构建失败时输出日志内容,减少Jenkins接收的实时输出量:

#!/bin/bash

set -e

source "$HOME/.sdkman/bin/sdkman-init.sh"
sdk use java 15.0.2-open

# 重定向日志到文件,不实时输出到Jenkins
mvn clean install -U -DskipTests=true > build.log 2>&1

if [ $? -ne 0 ]; then
    echo "构建失败,关键日志:"
    cat build.log
    echo "Fail."
    exit 1
fi
echo "构建成功,日志已保存至build.log"
echo "Success."

exit 0

2. 改用sshScript或传输本地脚本执行

sshCommand在处理大输出时可能存在缓冲区阻塞问题,换成sshScript直接传递脚本内容执行:

stage('Build') {
    steps {
        script {                    
            def remote = [
                name: 'vm-dev',
                host: 'dev.myhost.com',
                user: 'user',
                identityFile: '/var/lib/jenkins/.ssh/ssh-key',
                allowAnyHosts: true
            ]                    
            sshScript remote: remote, script: '''
#!/bin/bash
set -e
source "$HOME/.sdkman/bin/sdkman-init.sh"
sdk use java 15.0.2-open
mvn clean install -U -DskipTests=true -q
if [ $? -ne 0 ]; then
    echo "Fail."
    exit 1
fi
echo "Success."
exit 0
'''
        }
    }
}

或者先将本地脚本上传到远程再执行:

stage('Build') {
    steps {
        script {                    
            def remote = [
                name: 'vm-dev',
                host: 'dev.myhost.com',
                user: 'user',
                identityFile: '/var/lib/jenkins/.ssh/ssh-key',
                allowAnyHosts: true
            ]
            // 上传本地脚本到远程临时目录
            sshPut remote: remote, from: './02-build.sh', into: '/tmp/'
            // 赋予执行权限并运行
            sshCommand remote: remote, command: "chmod +x /tmp/02-build.sh && /tmp/02-build.sh ${BUILD_NUMBER}"
        }
    }
}

3. 调整Jenkins SSH输出缓冲区大小

修改Jenkins启动参数,增大SSH命令的输出缓冲区:

java -Dhudson.sshCommandOutputBufferSize=10485760 -jar jenkins.war

(参数值为10MB,可根据实际日志大小调整)

4. 禁用Maven彩色输出

Maven的ANSI彩色输出可能导致日志解析异常,添加参数禁用:

mvn clean install -U -DskipTests=true -q -Dmaven.color.style=none

内容的提问来源于stack exchange,提问作者Giovanni Martarello

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 11:33:22