3.publish over sshJenkins - 插件管理 可选插件tab页下安装publish over ssh插件。用于Jenkins服务器ssh传输文件到Linux服务器。
安装好publish over ssh插件后,到Jenkins - 配置中 publish over ssh项设置相关上传Linux服务器信息。
- Passphrase - 默认上传服务器密码
- Path to key - Jenkins服务器ssh key目录
- key - Jenkins服务器ssh key内容,一般为~/.ssh目录下id_rsa.pub内容
- SSH Servers - 上传服务器的配置
Jenkins ssh key的生成网上有很多资料,不再过多介绍。我是使用的Passphrase, 登录验证key或者passphrase方式可以二选一,可根据具体情况选择。
ssh server设置:
统一配置发布文件的Linux服务器,如下图。
其中 remote directory 表示发布文件到服务器的默认目录。若为空默认为当前登录用户目录。
4.项目发布
本文以svn的订单order项目为例,通过Jenkins工具,经过编译-打包-上传-发布过程,动态的将java jar发布到两台服务器。
4.1 新建任务
Jenkins - 新建任务,创建order发布的一个任务。由于项目是基于maven的,所以选择'构建一个maven项目'进入配置页面。
配置svn代码库信息:
build配置:对应项目输入项目构建命令。
post steps:配置发布服务器的信息。如下图。
由于order订单服务是集群部署,分别设置了2台 ssh server。
source files 是指上传到服务器的发布文件。Jenkins默认编译后文件在workspace目录下,这里输入target/{发布jar文件}. 上传到发布服务器后,不需要target目录,所以 remove prefix中填target/。
Remote directory可以为空,由于我们在第3步中已经设置了全局默认ssh server的remote directory ,所以这里可以不填,如这里设置将覆盖之前的全局配置目录。
exec command是文件上传到发布服务器后,需要执行的shell脚本指令,用于发布order jar包的启动备份命令。图中app-deploy.sh为应用jar文件的启动备份shell脚本文件,需放到发布服务器指定目录下。其中BUILD_ID=DONTKILLME是为了kill 老的运行jar时避免当前执行进程不被误杀。
app-deploy.sh文件:
#!/bin/sh
## java env
## service name
SERVICE_NAME=$1
SERVICE_DIR=/usr/service/
JAR_NAME=$SERVICE_NAME\.jar
PID=$SERVICE_NAME\.pid
#function start
start(){
cd $SERVICE_DIR
source /etc/profile
## nohup java -Xms256m -Xmx512m -jar $JAR_NAME >log/$SERVICE_NAME.out 2>&1 &
nohup java -jar -Xms256m -Xmx256m $JAR_NAME >/dev/null 2>&1 &
echo $! > $SERVICE_DIR/$PID
echo "#### start $SERVICE_NAME"
}
# function stop
stop(){
cd $SERVICE_DIR
if [ -f "$SERVICE_DIR/$PID" ]; then
kill `cat $SERVICE_DIR/$PID`
rm -rf $SERVICE_DIR/$PID
fi
echo "#### stop $SERVICE_NAME"
sleep 3
PROCESS=`ps -ef|grep $JAR_NAME |grep -v grep|grep -v PPID|awk '{ print $2}'`
for i in $PROCESS
do
echo "Kill the $SERVICE_NAME process [ $i ]"
kill -9 $i
done
}
# function clean
clean(){
echo "---start do do clean phase."
cd $SERVICE_DIR
if [ ! -d "lastDeploy" ]; then
mkdir lastDeploy
fi
if [ -f "$JAR_NAME" ]; then
echo "backup $JAR_NAME"
mv $JAR_NAME lastDeploy/$JAR_NAME\_`date "+%Y%m%d%H%M%S"`
fi
if [ -d "tmp" ]; then
mv -f tmp/$JAR_NAME ./
fi
}
case "$2" in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 2
start
echo "#### restart $SERVICE_NAME"
;;
clean)
stop
sleep 2
clean
echo "#### clean $SERVICE_NAME"
;;
deploy)
stop
clean
start
echo "#### deploy $SERVICE_NAME"
;;
esac
exit 0
以上脚本发布逻辑如下:
1.先stop老的jar应用程序。先从记录的pid文件中找kill的进程,找不到通过ps指令查找当前运行jar文件,再kill -9 杀掉。
2.将老的jar程序移动到lastDeploy目录备份,并加上时间戳后缀。将待发布的新jar文件从tmp目录移动到发布目录。
3.启动新的jar程序文件。