使用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
相关产品推荐
相关产品推荐

