Jenkins安装参考:
Jenkins相关资料已经非常多了,但是大多都安装了Publish over ssh插件,但是我在公司部署项目时发现没有这个插件,所以只能写进shell脚本了
一、新建任务
选择项目类型
任务描述
关联git
添加git凭据
构建触发器
构建shell
shell脚本:
##1.进入到项目所在目录并打包项目为jar包
cd /home/linux/.jenkins/workspace/test
echo mvn clean install
mvn clean install
sleep 3
echo trans
##2.从jenkins默认目录复制jar包到指定位置
cp -rf /home/linux/.jenkins/workspace/test/main/target/main.jar /home/linux/test/main.jar
##3.上传jar包文件到另一台服务器
scp -r /home/linux/test/main.jar linux@10.0.0.1:/home/linux/jar/newJar
sleep 3
##4.连接其他服务器
ssh -tt linux@10.0.0.1 > /dev/null 2>&1 << eeooff
##5.备份服务器端原先JAR包
cd /home/linux/jar
cp -rf /home/linux/jar/main.jar /home/linux/jar/jar_bak
##6.替换JAR包并重启
cp -rf /home/linux/jar/newJar/main.jar /home/linux/jar
sleep 3
sh autoDeploy.sh restart
sleep 3
exit 0
eeooff
echo done
完成配置
在服务器端/home/linux/jar部署autoDeploy.sh
#!/bin/bash
# 定义常量
# 要运行的jar包名
JAR_NAME="XXX.jar"
# 日志路径
LOG_PATH="./log/XXX-`date +%F`.log"
# 输入格式不对,给出提示
tips(){
echo ""
echo "please use command : sh autoDeploy.sh [ start | stop | restart | status ]"
echo ""
exit 1
}
# 启动方法
start(){
# 获取pid
pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
# -z 表示如果$pid 为空时执行
if [ -z $pid ]; then
nohup java -jar $JAR_NAME >> $LOG_PATH 2>&1 &
pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
echo ""
echo "Service ${JAR_NAME} is starting! pid=${pid}"
echo ""
# 如果出现success即退出,没有则显示日志
tail -f $LOG_PATH | sed '/success/q'
echo"...................Start successful............................"
else
echo ""
echo "Service ${JAR_NAME} is already running , it's pid = ${pid} . "
echo ""
fi
}
# 停止方法
stop(){
# 获取pid
pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
# -z 表示如果$pid 为空时执行
if [ -z $pid ]; then
echo ""
echo "Service ${JAR_NAME} is not running!"
echo ""
else
kill -9 $pid
echo ""
echo "Service stop successful! pid : ${pid} which has been killed forcibly!"
echo ""
fi
}
# 运行状态
status(){
# 获取pid
pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
# -z 表示如果$pid 为空时执行
if [ -z $pid ]; then
echo ""
echo "Service ${JAR_NAME} is not running!"
echo ""
else
echo ""
echo "Service ${JAR_NAME} is running , it's pid = ${pid} . "
echo ""
fi
}
# 重启方法
restart(){
echo ""
echo "........................... Restarting .............................."
echo ""
# 获取pid
pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
# -z 表示如果$pid 为空时执行
if [ -z $pid ]; then
echo "................Program is not starting yet........................."
else
kill -9 $pid
fi
start
echo "........................ Restart successful .........................."
}
# 根据输入参数执行对应方法,不输入则执行tips提示方法
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
tips
;;
esac
tips:
1. ssh远程登录时需要验证远程服务器密码,脚本无法执行
Host key verification failed
**解决:**设置ssh免密登录
(1)客户端生成公私钥
shell脚本中是Jenkins主动连接项目服务器,所以Jenkins相当于是客户端,项目所在是服务器端
ssh-keygen
上面这个命令会在用户目录.ssh文件夹下创建公私钥
cd ~/.ssh
ll -a
如下两个密钥:
id_rsa (私钥)
id_rsa.pub (公钥)
(2)上传公钥到项目服务器
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.1(服务器root用户,也可以是其他用户)
上面这条命令是写到项目服务器上的.ssh目录下去了
cd ~/.ssh
vi authorized_keys //或者是 vi know_hosts
可以看到客户端写入到服务器的 id_rsa.pub (公钥)内容
(3) 测试免密登录
ssh root@192.168.1.1
2. 执行时可能会报 xxx.sh : line 2 : $'\r' : command not found,原因是Windows中的回车是“\n”, Linux中的回车是“\r\n”. 所以用Windows下的编辑器会不能识别。
解决:在Linux部署脚本时:用vi打开,命令模式下 set ff=unix 即可
vi XXX.sh
:set ff=unix
二 、构建
构建失败,查看控制台输出
构建成功
进入服务器,查看项目日志,over