从Jenkins在服务器上运行ssh命令
我有一个詹金斯舞台:从Jenkins在服务器上运行ssh命令,jenkins,ssh,server,centos,Jenkins,Ssh,Server,Centos,我有一个詹金斯舞台: stage("Deploy on Server") { steps { script { sh 'sshpass -p "password" ssh -o "StrictHostKeyChecking=no" username@server "cd ../../to/app/path; sh redeploy.sh && exit;"'
stage("Deploy on Server") {
steps {
script {
sh 'sshpass -p "password" ssh -o "StrictHostKeyChecking=no" username@server "cd ../../to/app/path; sh redeploy.sh && exit;"'
}
}
}
以及我的服务器(centos)上的一些脚本:
重新部署。sh:
declare -i result=0
...
sh restart.sh
result+=$?
echo "Step 6: result = " $result
# 7. if restart fail, restart /versions/*.jar "sh restart-previous.sh"
if [ $result != "0" ]
then
sh restart-previous.sh
result+=$?
fi
echo "Deploy done. Final result: " $result
重新启动.sh
nohup java -Xms8g -Xmx8g -jar app-name-1.0-allinone.jar &
if pgrep -u username -f app-name
then
pkill -u username -f app-name
fi
# (app-name is a string, some words from the running cmd to open tha application)
因为我从Jenkins执行了redeploy.sh脚本,所以问题是它会挂在Jenkins控制台上,并在那里记录所有应用程序事件,而不是在部署我的应用程序的补丁中创建一个nohup文件
在一些示例中,我发现建议在ssh命令中直接使用nohup,但我不能这样做,因为我需要执行一个脚本(包括所有步骤,nohup无法执行),而不是直接执行一个命令
exit
cmd将被忽略,因为上一个命令永远不会关闭
谢谢最后,我找到了解决办法。一个问题出现在
restart.sh
中,因为需要从cmd强制指定日志文件。因此,nohup
被忽略/未使用,命令变为:
java -Xms8g -Xmx8g -jar app-name-1.0-allinone.jar </dev/null>> logfile.log 2>&1 &
停止。sh
nohup java -Xms8g -Xmx8g -jar app-name-1.0-allinone.jar &
if pgrep -u username -f app-name
then
pkill -u username -f app-name
fi
# (app-name is a string, some words from the running cmd to open tha application)
由于Jenkins脚本中的app folder
和stop.sh中的app name
是相等的(甚至app folder包含app name值),当您试图终止app name进程时,您会意外地终止ssh连接,Jenkins将获得255状态码
,但是来自服务器的redeploy.sh
脚本将成功完成,因为它将独立执行
解决方案很简单,但很难被发现。您应该确保为搜索命令指定了一个明确的名称,该命令将仅查找应用程序的进程id
最后,stop.sh
必须为:
if pgrep -u username -f my-app-v1.0.jar
then
pkill -u username -f my-app-v1.0.jar
fi
您是否使用声明性管道?在jenkins控制台输出中打印数据时,restart.sh
有什么问题?我建议您让它在控制台输出中打印
,但要找到一种方法来屏蔽包含敏感数据的参数,以便在jenkins控制台输出中显示为******
。我还建议您使用shell语法,如这里概述的sh''echo“这是我的shell脚本”''
:Ref:I找到了一种方法。。。需要强制从cmd登录到日志文件,如“nohup java-Xms8g name.jar>logfile.log 2>&1&”。这是在centos服务器中。但是,问题是当我试图终止现有进程时,因为在jenkins中,即使命令成功执行,也会返回错误255:def statusCode=sh returnStatus:true,脚本的sshpass-p passwordusername@serversh重新部署,sh'