eagle

学无止境,细节决定成败.
posts - 12, comments - 11, trackbacks - 0, articles - 2
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

jenkins 自动化发布实践整理

Posted on 2018-11-08 11:53 月下孤城 阅读(37) 评论(0)  编辑  收藏 所属分类: java
最近实践Jenkins的自动化发布,即实现指定项目的编译-打包-上传-发布的持续集成发版过程。中途遇到不少问题,整理如下以备后忘。 
1.Jenkins安装
Jenkins是开源软件,直接到官网下载最新版本安装。具体过程不再累述,网上资料很多。本文安装版本jenkins-2.138.2。
2.Jenkins全局设置
打开Jenkins-全局工具配置 配置编译打包的工具,我使用的是maven,按具体环境配置好相应信息。若项目工程使用其他工具,如gradle在对应项配置信息即可。
3.publish over ssh
Jenkins - 插件管理 可选插件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配置:对应项目输入项目构建命令。


p
ost 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程序文件。





---------------------
月下孤城
mail:eagle_daiqiang@sina.com

只有注册用户登录后才能发表评论。


网站导航: