Jenkins实现自动化部署

2020-08-21

一、简介

java语言开发,用于监控持续重复的工作,包括:持续的软件版本发布/测试项目,监控外部调用执行的工作。

Jenkins中文网:http://www.jenkins.org.cn/

 

二、自动化部署原理

如图,Jenkins把一系列步骤串到一起实现自动化。

 

 

三、依赖工具

  1.git   

拉取代码需要git,***注意安装完要生成公钥添加到代码服务器***,不了解的可以参考  查看公钥

  2.maven   编译打包需要

  3.jdk   Jenkins是Java语言开发,需要Java环境

四、安装

安装方法和步骤网上很多,官网也有,针对自己的服务器系统(win、mac、Linux)选择即可。这里不再赘述,只说几个注意点

1.安装后的初始密码位置:/var/lib/jenkins/secrets/initialAdminPassword

    cat /var/lib/jenkins/secrets/initialAdminPassword

2.默认构建目录:/var/lib/jenkins/workspace

 每个任务都可以具体设置

3.修改Jenkins配置文件:/etc/sysconfig/jenkins ,使用 root账户运行,否则会出现权限问题 JENKINS_USER="root"

4.安装推荐的插件时,会卡在那里很久,解决办法网上很多。可以参考 Jenkins安装插件很慢

 

五、配置和使用

 1.全局工具

   maven、git

 2.插件管理

  git plugin、publish over ssh 原则是需要什么安装什么

 3.系统配置

  系统管理->系统配置->Publish over SSH

  publish over ssh  :远程部署,即Jenkins所在服务器通过ssh连接到应用服务器,上传jar包,执行脚本。这一步要提前配置后面要用

 

 4.新建任务

  配置如下:

 a、构建一个maven项目

 b、源码管理:

   选择git、设置 repositories URL、Credentials(证书)选择无,因为我是通过Jenkins服务器生成公钥添加到代码管理平台、指定分支

 c、pre steps:

   构建前的动作,比如 切换到构建目录,清理旧构建

   

#!/bin/bash
cd /opt/workspase/minapp
mvn clean

 

 d、build:

  设置自定义工作目录,因Jenkins服务需要执行多个项目的构建 ,最好分别建立目录以区分

 

 e、post steps:

   执行shell,拷贝jar部署

   注:本步骤是可选,如果应用服务器和Jenkins在一个服务器上,即本地部署

   shell脚本demo:

   

#!/bin/bash

#export BUILD_ID=dontKillMe避免被Jenkins杀掉。
export BUILD_ID=dontKillMe
    
#找到jar包
cd /opt/workspase/minapp/guanyu-server/guanyu-server-minapp/target
pwd
jarName=$(find guanyu-server-minapp*.jar)
echo  "本次更新的包名----${jarName}----"
    
#拷贝
    
cp -f ${jarName} /root/servers/
    
#切换目录 
cd  /root/servers/
    
    
PID=`ps -aux | grep guanyu-server-minapp | grep -v grep | grep -v deploy | awk '{print $2}'`
echo " ---旧进程PID:${PID}--"

if [ -n "$PID" ]; 
then
    echo "杀死旧的进程……"
    sleep 2
    kill -9 $PID
else
    echo "无旧服务……"  
fi
    
echo "开始启动……"
chmod +x ${jarName}
nohup java -jar ${jarName} --spring.profiles.active=test &

 

 f、构建后操作:

   增加构建后操作步骤:Send build artifacts  over SSH  

    source files :需要上传的jar包位置(相对于自定义的工作空间)
    remove prefix: source files里jar包名以外的部分
    remote directory:jar包上传到远程服务器的目录(继承ssh servers的remote directory,即真实上传目录为:ssh servers的remote directory+此处的remote directory)
    exec command:远程服务器执行的shell脚本
    高级里 exec in pty 选项要勾选,否则可能会报错

   shell脚本:

   

#!/bin/bash
#加载环境变量,否则有些服务器无法执行java
source /etc/profile
BASEDIR=/home/microservice/middleplatform_8980
newJar="corn-middleplatform-dataservice-0.0.1-SNAPSHOT.jar`date +"%Y-%m-%d-%H:%M:%S"`"
#备份
cd $BASEDIR
mv corn-middleplatform-dataservice-0.0.1-SNAPSHOT.jar  ${newJar}
#移动
mv /home/microservice/temp/corn-middleplatform-dataservice-0.0.1-SNAPSHOT.jar  corn-middleplatform-dataservice-0.0.1-SNAPSHOT.jar

#启动
if [ -f "$BASEDIR/pid" ];then
        pid=$(cat $BASEDIR/pid)
        echo "进程号为:$pid"
        kill -9 $pid && rm -rf $BASEDIR/pid
        echo "服务关闭成功!"
fi
sleep 2
nohup java -jar corn-middleplatform-dataservice-0.0.1-SNAPSHOT.jar  --meritdata.cloud.log.path=./logs --meritdata.cloud.log.level=debug --meritdata.cloud.log.consoleLevel=info --spring.cloud.zookeeper.connect-string=47.93.8.23:2181 --server.port=8980  --spring.profiles.active=test --spring.redis.host=119.3.254.222 --spring.redis.port=6379 --spring.redis.password=gy88623277 > middleplatform.log 2>&1 &
echo $! > $BASEDIR/pid 
#tail -f $BASEDIR/middleplatform.log
sleep 5

 

  5.立即构建