Jenkins 自动部署启动war包失败

Jenkins 自动部署 SpringBoot项目,是部署到远程服务器,打war包传到服务器成功,启动war包失败

第16行,17行都执行了的,服务器路径下能看到Jenkins刚打包传过去的war包,可能第19行自动启动war包的命令失败了,就是不能自动启动war包

img

Jenkins是开源的自动化部署平台,部署在A服务器

我们的springboot项目部署在B服务器,截图是项目最外层加的 Jenkinfile配置文件,Jenkins上点部署,会拉取git代码仓代码,读取截图中的配置文件,向B服务器传war包,并启动。

问题现象:现在打war包发布服务器成功,服务器能看到最新的war包,但自动启动war包失败,需要手动去服务器打开war包所在路径,执行:sh /opt/oa/run.sh restart 启动,手动启动成功。

服务器根路执行第19行,日志输出到文件后显示的是:
nohup: ignoring input
在该目录{/dev}没有找到可运行jar或war文件

服务器 run.sh脚本

#!/bin/bash 

APPNAME=''
for item in `ls`
  do
  fileName=$item
  if [ ! -d $fileName ]
  then
    if [ ${fileName##*.} = jar ]
      then
         APPNAME=$fileName
         break
    fi
    if [ ${fileName##*.} = war ]
      then
         APPNAME=$fileName
         break
    fi
  fi
  done

if [ -z ${APPNAME} ]
then
  pwd=`pwd`
  echo "在该目录{$pwd}没有找到可运行jar或war文件"
  exit 1
fi


APP_NAME=$APPNAME
#根据实际情况修改参数
#JVM="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -server -Xms1g -Xmx1g -Xmn512m -XX:PermSize=128M -XX:MaxNewSize=128m -XX:MaxPermSize=25zh6m -Xss256k  -Djava.awt.headless=true -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled -Xloggc:./logs/gc.log"
JVM="-server -Xms1g -Xmx1g -Xmn512m -XX:PermSize=128M -XX:MaxNewSize=128m -XX:MaxPermSize=25zh6m -Xss256k  -Djava.awt.headless=true -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled -Xloggc:./logs/gc.log"
#APPFILE_PATH="-Dspring.config.location=/usr/local/config/application.properties"
#使用说明,用来提示输入参数 
usage() { 
    echo "Usage: sh 执行脚本.sh [start|stop|restart|status|log|backup]" 
    exit 1 
} 
#检查程序是否在运行 
is_exist(){ 
    pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}' ` 
    #如果不存在返回1,存在返回0 
    if [ -z "${pid}" ]; then 
        return 1 
    else 
        return 0 
    fi 
} 

#启动方法 
start(){ 
    is_exist 
    if [ $? -eq "0" ]; then 
        echo "${APP_NAME} is already running. pid=${pid} ." 
    else 
        #nohup java $JVM -jar $APPFILE_PATH $APP_NAME > /dev/null 2>&1 
                #后台启动jar包,且控制环境变量,根据实际情况修改吧。
        nohup java $JVM -jar $APP_NAME  > nohup.log 2>&1 &
        log
    fi
} 

#停止方法 
stop(){ 
    is_exist 
    if [ $? -eq "0" ]; then 
        kill -9 $pid 
    else 
        echo "${APP_NAME} is not running" 
    fi 
} 

#输出运行状态 
status(){ 
    is_exist 
    if [ $? -eq "0" ]; then 
        echo "running:${pid}" 
    else 
        echo "${APP_NAME} is NOT running." 
    fi 
} 
#重启 
restart(){ 
    stop 
    start 
} 

#日志
log(){
        # 输出实时日志
    tail -n 100 -f nohup.log
}

#备份
backup(){
    echo 'backup file ->'$APP_NAME $APP_NAME'.bak'
        #备份当前jar包
    cp -r $APP_NAME $APP_NAME'.bak'
}

#根据输入参数,选择执行对应方法,不输入则执行使用说明 
case "$1" in 
    "start") 
        start 
        ;; 
    "stop") 
        stop 
        ;; 
    "status") 
        status 
        ;; 
    "restart") 
        restart 
        ;; 
    "log") 
        log 
        ;; 
    "backup") 
        backup 
        ;; 
    *) 
usage 
;; 
esac


部分脚本:

stage('Deploy To Dev') {
    when {
        expression { params.deploy_env == 'dev环境' }
    }
    steps {
        script {
            def remote = [:]
            remote.name = 'dev-jeesite'
            remote.host = '10.1.3.9'
            withCredentials([usernamePassword(credentialsId: '10.1.1.9-node', passwordVariable: 'password', usernameVariable: 'username')]) {
                remote.user = "${username}"
                remote.password = "${password}"
            }
            remote.allowAnyHosts = true
            sshCommand remote: remote, command: "cp -f /opt/oa/web.war /opt/oa/web.war.bak"
            sshPut remote: remote, from: 'web/target/web.war', into: '/opt/oa'
            sh "echo -----------开始启动-----------"
            sshCommand remote: remote, command: "source /etc/profile" //同步远程服务器的环境变量
            sshCommand remote: remote, command: "nohup sh /opt/oa/run.sh restart > /dev/null 2>&1 &"
        }

        sh "curl -X POST -d 'text=site 测试环境打包部署任务执行成功,执行详情:http://10.1.1.1:8080/job/ite/job/dev/' t"

    }

}

排查过程,将19行的重定向,改成重定向一个文件中,应该还是环境变量的问题
将18与19行的shell 通过&&合成一个试试

确保已正确设置Jenkins的版本和配置文件,以确保与您的项目兼容。

确保已正确设置SSH连接和安全提示,以便能够成功地将war包传输到远程服务器并启动。

确保已正确设置环境变量,以便能够正确部署和启动项目。

确保已正确设置远程服务器的连接和环境变量,以便能够正确部署和启动项目。

环境变量方面只有 source /etc/profile 应该不够。同样的命令手动执行可以启动成功,说明war没问题,与配置有关。手动启动成功使用的是哪个用户,将这个用户主目录的配置也执行一下。/root 或者是 /home/xxuser,用户目录里面的 .profile、.bashrc 等文件都看下,关键的配置可能就在其中。

引用chatGPT作答,从您提供的部分脚本来看,可能是由于自动启动war包的命令没有正确执行导致的问题。您可以通过以下步骤进行排查:

确认war包的启动脚本是否正确
手动启动war包成功后,请确保启动脚本的正确性。确认启动脚本中的命令是否能够正常启动您的SpringBoot项目,以及该脚本是否位于正确的路径下。

确认Jenkins是否有权限执行启动脚本
在Jenkins服务器上执行命令时,需要确保Jenkins用户具有执行启动脚本的权限。您可以尝试在Jenkins服务器上手动执行相同的启动脚本,以确认是否存在权限问题。

检查启动脚本中的路径是否正确
请确保在Jenkins服务器和远程服务器上使用的路径是正确的。例如,您在Jenkins服务器上打包的war包是否正确地传输到了远程服务器的正确路径下。

确认Jenkins是否已正确连接到远程服务器
在Jenkins中执行SSH命令时,需要确保Jenkins已经正确地连接到远程服务器。您可以尝试手动连接到远程服务器,并使用相同的SSH凭据执行命令。

查看日志
您可以查看Jenkins和远程服务器上的日志,以获取更多关于自动部署过程中发生的错误信息。可以在启动脚本中添加一些日志输出命令,以便更好地跟踪问题。

希望这些提示可以帮助您解决问题。

存在环境变量差异,
删掉第18行的source /etc/profile
把source /etc/profile这句加到 /opt/oa/run.sh 文件里试试