jenkins+微服务架构+ansible+maven

在jenkins上拉去该微服务某一功能的全部项目
git clone git@....
我配置与之相对应在/data目录下 建议在此目录下面在创建一个子目录 这样会更清晰
jenkins的配置过程如下图所示

jenkins ansible检测代码变更 jenkins ansible部署微服务_服务器

jenkins ansible检测代码变更 jenkins ansible部署微服务_jar包_02

jenkins ansible检测代码变更 jenkins ansible部署微服务_服务器_03

jenkins ansible检测代码变更 jenkins ansible部署微服务_jar包_04


jenkins ansible检测代码变更 jenkins ansible部署微服务_jenkens_05

jenkins ansible检测代码变更 jenkins ansible部署微服务_服务器_06

jenkins ansible检测代码变更 jenkins ansible部署微服务_服务器_07


jenkins ansible检测代码变更 jenkins ansible部署微服务_jar包_08

配置jenkins机器上的脚本
vim /opt/scripts/maven.sh

#/usr/bin/bash env
#Author:Yingjian
#version:1.1

#env
# ansible hosts address
ANSIBLE_HOSTS_ADDR=/etc/ansible/hosts

if [ ! -d "/data" ];then
echo "请创建/data目录并注意该目录的权限,继续执行此脚本"
exit 2
fi

if [ ! -d "/data/compress" ];then
echo "临时压缩目录不存在"
mkdir /data/compress
echo "临时压缩目录以自动创建"
fi

if [ ! -d "/data/backup" ];then
echo "jar包备份目录不存在"
mkdir /data/backup
echo "jar包备份目录以自动创建"
fi

if [ ! -d "/data/tmptar" ];then
echo "临时jar的gzip压缩目录不存在"
mkdir /data/tmptar
echo "临时jar的gzip压缩目录以自动创建"
fi
#/data/mall-*为微服务中一个功能的所有代码的集合

ls -d /data/mall-* > /data/a.txt
sed -i 's#/data/##' /data/a.txt

for var in `cat /data/a.txt`
do
mv $HOME/.jenkins/workspace/$var/target/$var-*.jar /data/compress
#nohup java -jar /data/compress/$var-*.jar >>$HOME/logs/$var.log &
done
tar czvf /data/tmptar/mall-parent.`date +%Y-%m-%d-%H-%M`.tar.gz /data/compress/mall-*.jar
#在本地做备份
cp /data/tmptar/mall-parent.*.tar.gz /data/backup
#ansible command 时临时目录下的压缩包拷贝到服务器的备份目录且解压到发布目录 解压到发布目录之前需要清空发布目录下的jar包,避免脚本启动正则匹配到误起其他服务 以致jar包启动失败

#ansible中不能正则 可以传参
ls -d /data/tmptar/mall-parent.*.tar.gz >/data/tmptar/a.txt
sed -i 's#/data/tmptar/##' /data/tmptar/a.txt
TAR_NAME=`cat /data/tmptar/a.txt`
#ansible 中dest需要为绝对路径

#判断远端服务器是否有该目录,有则不创建,无则创建。
#/usr/bin/ansible -i $ANSIBLE_HOST_ADDR test -m mall -a "path=$HOME/history state=directory"

/usr/bin/ansible -i $ANSIBLE_HOSTS_ADDR test -m file -a "path=$HOME/history state=directory"

#/usr/bin/ansible -i $ANSIBLE_HOST_ADDR test -m mall -a "path=$HOME/release state=directory"

/usr/bin/ansible -i $ANSIBLE_HOSTS_ADDR test -m file -a "path=$HOME/release state=directory"


#/usr/bin/ansible -i $ANSIBLE_HOSTS_ADDR mall -m copy -a "src=/data/tmptar/mall-parent.*.tar.gz dest=$HOME/history"
/usr/bin/ansible -i $ANSIBLE_HOSTS_ADDR test -m copy -a "src=/data/tmptar/$TAR_NAME dest=$HOME/history"

#/usr/bin/ansible -i $ANSIBLE_HOSTS_ADDR mall -m shell -a "rm -rf $HOME/release/*"
/usr/bin/ansible -i $ANSIBLE_HOSTS_ADDR test -m shell -a "rm -rf $HOME/release/data/compress/*"

#/usr/bin/ansible -i $ANSIBLE_HOSTS_ADDR mall -m unarchive -a "src=/data/tmptar/mall-parent.*.tar.gz dest=$HOME/release"
/usr/bin/ansible -i $ANSIBLE_HOSTS_ADDR test -m unarchive -a "src=/data/tmptar/$TAR_NAME dest=$HOME/release"
#ansible传输需要轮询的服务
#/usr/bin/ansible -i $ANSIBLE_HOSTS_ADDR mall -m copy -a "src=/data/a.txt dest=$HOME/a.txt"
/usr/bin/ansible -i $ANSIBLE_HOSTS_ADDR test -m copy -a "src=/data/a.txt dest=$HOME/a.txt"

#清楚不需要的文件
rm -rf $HOME/.jenkins/workspace/mall-*
rm -rf /data/compress/mall-*.jar
rm -rf /data/tmptar/mall-parent.*.tar.gz


#用maven打包成功的jar包放在/data/backup/目录下面有相对应的压缩包
#ansible推送压缩成功的gzip包到相对应的服务器上面并启动

#ansible command mall 为ansible的hosts文件中的mall组 根据不同的服务,配置不同的组 写不同的启动脚本
#/usr/bin/ansible -i $ANSIBLE_HOSTS_ADDR mall -m shell -a "/bin/bash /opt/scripts/mall-startup.sh"
/usr/bin/ansible -i $ANSIBLE_HOSTS_ADDR test -m shell -a "/bin/bash /opt/scripts/mall-startup.sh"
配置远端服务器上的脚本
vim /opt/scripts/mall-startup.sh

#启动jenkins机器传输过来的jar包

if [ ! -f "$HOME/a.txt" ];then
echo "ansible 传输轮询参数失败!"
exit 1
fi
for var in `cat $HOME/a.txt`
do
ps -ef |grep $var-[0-9].[0-9].[0-9].jar |awk '{print $2}' >/data/b.txt
for i in `cat /data/b.txt`
do kill $i 
sleep 1
done
nohup java -jar $HOME/release/data/compress/$var-*.jar >> $HOME/$var.log 2&>1 &
echo "$var已启动成功"
done
远端服务器上的回退脚本
vim /opt/scripts/reback.sh

#/usr/bin/env bash
#Author:Yingjian
#version:1.0

if [ ! -f "$HOME/history/$1" ];then
echo "需要回退的版本不存在,请重新输入"
exit 1
fi

for var in `cat $HOME/a.txt`
do
ps -ef |grep $var-[0-9].[0-9].[0-9].jar |awk '{print $2}' >$HOME/b.txt
for i in `cat $HOME/b.txt`
do kill $i
sleep 1
done
rm -rf $HOME/release/data/compress/$var-*.jar && echo "该$var.jar以被删除"
done

tar xf $HOME/history/$1 -C $HOME/release/

for var in `cat $HOME/a.txt`
do
nohup java -jar $HOME/release/data/compress/$var-*.jar >> $HOME/$var.log 2&>1 & 
echo "$var已重新启动成功"
sleep 1
done
jenkins也是历史版本控制服务器
具体回退操作如下:
1.找到需要回退的版本的gzip包,存放目录路径为:/data/backup
2.执行ansible命令 例如版本号为mall-parent.2020-04-22-10-07.tar.gz
ansible -i /etc/ansible/hosts test -m shell -a "/opt/scripts/reback.sh mall-parent.2020-04-22-10-07.tar.gz"

效果如图所示

jenkins ansible检测代码变更 jenkins ansible部署微服务_jar包_09

整体思路为开发把代码push推送其他的不是为这个的项目控制库时,打包构建不会执行,当于开发人员推送到控制代码的中心库时,此的pom.xml发生变化,即执行构建打包,并部署推送到远端的服务器上 通过脚本上的ansible_hosts和组控制对不同的服务器执行,
当上线的此功能的jar包有问题需要回退,则只需要到存在压缩包的路径下,找到该包,执行上述的命令,即可实现一键回退(注意 组是否一致,避免误操作)

ush推送其他的不是为这个的项目控制库时,打包构建不会执行,当于开发人员推送到控制代码的中心库时,此的pom.xml发生变化,即执行构建打包,并部署推送到远端的服务器上 通过脚本上的ansible_hosts和组控制对不同的服务器执行,
当上线的此功能的jar包有问题需要回退,则只需要到存在压缩包的路径下,找到该包,执行上述的命令,即可实现一键回退(注意 组是否一致,避免误操作)