安装插件 maven
publish over ssh
publish over ssh
会将打包后的jar包,通过ssh推送到指定的服务器上,,在jenkins中设置,推送后脚本,实现自动部署jar包,,
装了这个插件之后,可以在项目中的 post steps
,使用send files or execute commands over SSH
点击后会让你选择推送到哪个服务器:
需要在全局配置中先配置服务器:
找到 publish over ssh 配置:
添加一个ssh server 并设置用户名密码,,右下角可以测试连接是否成功
在项目中设置推送的服务器:
遇到的问题:
- 构建成功之后 exec command 不执行:
原因:Jenkins执行shell是Jenkins来将你填写的shell脚本语句在部署的机器上执行,实际上就是jenkins启动子进程到部署的机器上执行命令行,所以当最后一行命令执行结束后,jenkins会杀掉所有在此过程中创建的子进程,如果这里有需要后台运行的,或者挂起的任务时,在jenkins执行结束后,这些挂起的或后台的任务都会被杀掉
解决:
shell
# 在命令前添加 这两行
source /etc/profile
BUILD_ID=dontKillMe
nohup java -jar /root/jenkins/test*.jar >/root/jenkins/mylog.log 2>&1 &
引用:
https://blog.csdn.net/qq_35738369/article/details/116154228
https://www.ngui.cc/el/2438837.html?action=onClick
https://www.jianshu.com/p/c06007175402
每次构建都会去执行构建后脚本,,也就是去启动这个jar包,,如果一直启动jar包,会出现占用的问题,,就需要在jenkins将文件传过去之前,,将这个占用端口的进程停掉,,就需要在jenkins中添加 pre steps
shell
# 删除历史数据
#rm -rf jenkins
# 获取传入的参数 $1 表示第一个参数 $2表示第二个参数
echo "arg:$1"
appname=$1
# 查找jar包的pid
pid=`ps -ef | grep $1 | grep -v grep | awk '{print $2}'`
echo $pid
# 判断pid是否存在,存在才去kill
# 使用 -z 做空值判断 zero
if [ -z $pid ];
then
echo "$appname not started"
else
kill -9 $pid
echo "$appname stoping..."
fi
# 检查这个pid 有没有被杀掉 -w 匹配整个word 过滤掉僵尸进程:已经执行完了,但是父进程尚未从操作系统的进程表中删除的进程
check=`ps -ef | grep -w $pid | grep java | grep -v "<defunct>"`
echo "check value: $check"
if [ -z $check ];
then
echo "$appname pid:$pid is stop"
else
echo "$appname stop fail"
fi
遇到的问题:
- shell脚本
=
赋值两边不能有空格 if [ -z $pid ];
---[
括号前后要跟空格ps -ef | grep -w
: 全词匹配,wordps -ef | grep -v
过滤掉awk
处理字符串,提取文本内容echo
后面要跟空格- 僵尸进程: 已经执行完了,但是父进程尚未从操作系统的进程表中删除的进程,zombie process ,状态显示为
<defunct>
,僵尸进程通常是由于父进程执行完了,没有等待子进程,,就是在子进程退出后,没有正确处理子进程的终止状态而产生的,,父进程负责调用系统以获取子进程的终止状态,然后释放掉子进程所占用的资源 if
后面要跟fi
other
nohup : no hang up :不会挂断,避免因终端会话的断开而导致命令终止