由于项目是采用分布式架构,需要多节点部署,加之对Jenkins的pipeline不是特别熟悉,决定更多的使用shell实现。
创建一个任务
配置参数化构建(使之支持回滚)
配置源码git地址
配置定时触发
配置构建shell(支持回滚)
case $deploy_env in
deploy)
echo "deploy:$deploy_env"
mvn install
cd a
mvn clean package -Pdev
cd ../b
mvn clean package -Pdev
cd ../c
mvn clean package -Pdev
cd ../d
mvn clean package -Pdev
cd ../e
mvn clean package -Pdev
cd ../f
mvn clean package -Pdev
cd ..
;;
rollback)
echo "rollback:$deploy_env"
echo "version:$version"
rm -rf ./*/target
cp -R /root/.jenkins/jobs/all/configurations/builds/${version}/archive/a/target ./a
cp -R /root/.jenkins/jobs/all/configurations/builds/${version}/archive/b/target ./b
cp -R /root/.jenkins/jobs/all/configurations/builds/${version}/archive/c/target ./c
cp -R /root/.jenkins/jobs/all/configurations/builds/${version}/archive/d/target ./d
cp -R /root/.jenkins/jobs/all/configurations/builds/${version}/archive/e/target ./e
cp -R /root/.jenkins/jobs/all/configurations/builds/${version}/archive/f/target ./f
;;
*)
exit
;;
esac
配置war发送至远程服务以及调用远程服务脚本
由于服务直接有依赖关系,故启动脚本之间有的会有sleep
scp **/target/*.war root@192.168.2.64:/root/all/wars
ssh root@192.168.2.64 "/root/all/sh/a.sh"
ssh root@192.168.2.64 "/root/all/sh/b.sh"
ssh root@192.168.2.64 "/root/all/sh/c.sh"
sleep 15
ssh root@192.168.2.64 "/root/all/sh/d.sh"
sleep 40
ssh root@192.168.2.64 "/root/all/sh/e.sh"
ssh root@192.168.2.64 "/root/all/sh/f.sh"
sleep 20
ssh root@192.168.2.64 "/root/all/sh/tail/tail.sh"
a.sh脚本示例
#!/bin/sh
export tomcat_name=apache-tomcat-8.5.16-a-provider
export tomcat_home=/data/soft/$tomcat_name
export war_home=/root/all/wars
export war_name=$war_home/a-provider.war
TomcatID=$(ps -ef |grep tomcat |grep -w $tomcat_name|grep -v 'grep'|awk '{print $2}')
echo "[info]进程$TomcatID将要被清理。。。"
kill -9 $TomcatID # 杀掉原tomcat进程
sleep 3
TomcatID=$(ps -ef |grep tomcat |grep -w $tomcat_name|grep -v 'grep'|awk '{print $2}')
if [[ !$TomcatID ]];then # 这里判断TOMCAT进程是否存在
echo "[info]进程清理成功"
export bak=$tomcat_home/appbak/$(date -d "today" +"%Y%m%d_%H%M%S")-war-bak
mkdir $bak
echo "[info]清理过期备份文件"
find $bak/ -mtime +30 -name "*-war-bak" -exec rm -rf {} \;
echo "[info]开始备份应用程序至$bak。。。"
cp -r $tomcat_home/webapps/ROOT $bak/
echo "[info]备份应用程序至$bak完成"
rm -rf $tomcat_home/webapps/ROOT $tomcat_home/webapps/ROOT.war
echo "[info]开始部署应用程序。。。"
cp $war_name $tomcat_home/webapps/ROOT.war
echo "[info]部署应用程序完成,开始启动。。。"
rm -rf $war_name
$tomcat_home/bin/startup.sh
else
echo "[error]进程$TomcatID清理失败,请重试!"
fi
tail.sh脚本示例
echo '==============================a-provider==================================================='
tail -n 50 /data/soft/apache-tomcat-8.5.16-a/logs/catalina.out
echo '==============================b-provider==================================================='
tail -n 50 /data/soft/apache-tomcat-8.5.16-b/logs/catalina.out
echo '==============================c-provider==================================================='
tail -n 50 /data/soft/apache-tomcat-8.5.16-c/logs/catalina.out
echo '==============================d==================================================='
tail -n 50 /data/soft/apache-tomcat-8.5.16-d/logs/catalina.out
echo '==============================e==================================================='
tail -n 50 /data/soft/apache-tomcat-8.5.16-e/logs/catalina.out
echo '==============================f==================================================='
tail -n 50 /data/soft/apache-tomcat-8.5.16-f/logs/catalina.out
以上远程调用,需配置免密登录
如配置B服务免密登录A,则在B服务器:
执行ssh-keygen -t rsa
然后一直回车,就可以在 /root/.ssh目录下看到公钥和私钥
[root@123456 /]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
74:fb:6e:b8:40:67:81:52:8a:ad:5a:7b:d8:83:df:dd root@iz8vbda2qfz3f1qw1b2e9cz
The key's randomart image is:
+--[ RSA 2048]----+
| . |
| o o . |
| . + o o |
| . o . o |
| o S + |
| o = . o . |
| . + + . .. |
| o o o.o. |
| . . ooE |
+-----------------+
You have new mail in /var/spool/mail/root
在B服务器:
/root/.ssh目录下新建文件authorized_keys,将B机器中的公钥放到A机器的authorized_keys中
免密登录配置完毕
另外,服务器需要在/etc/bashrc文件配置jdk相关配置,否则ssh远程调用脚本启动tomacat时,会报出JAVA_HOME找不到错误
配置归档(每次构建后,war归档存储,用于回滚操作)
综上,一个简单的支持远程多节点部署的可持续集成服务配置完毕