前面自己边学边写的一篇文章https://blog.csdn.net/VicdorLin/article/details/90782965,简单记录了jenkins配置的一些基本要素,后面又写了篇ssh详细配置,因为前面网上找的文章配置私钥公钥总是用不得法,如果读者有这方面疑问可以参考下:https://blog.csdn.net/VicdorLin/article/details/90782965
至于排版,还是请多谅解,我写的主要还是本着实用记录和分享为主,排版细节,互相体谅下吧。
这篇号称进阶篇,其实也没多大要写的,主要
1,增加jenkins一些参数配置,以达到更好更智能便捷的操作体验以及简化jenkins配置列表界面,避免密集配置乱花迷眼
2,前面基础篇jenkins和java项目是运行在同一台服务器,因此没有什么ssh,scp的限制,这里尝试进行一个远程部署
3,基础篇的启动脚本可能无效的问题(这就很尴尬了,当时感觉白条测试很ok,晚上回家再试不行了)。
首先声明下服务器目录结构,需要手动创建,我的脚本里尽量避免了多余复杂的逻辑,能一次搞定的事情就别瞎折腾了。
# 所有springboot工程目录我放在 /data/apps/ 目录下
# 比如有个服务叫 demo-service,就以这个名字为例
# 在目录/data/apps/demo-service/下包含三个目录:logs packages runner
# packages目录可以放弃了,原来是想拿它来备份jar包的,后来觉得价值不大,如果真有这需要才看吧
# logs目录里存放logback配置的日志文件
# runner目录里存放启动脚本start.sh,stop.sh,restart.sh,另外还包含了一个目录tmp
# tmp用以存放各种临时文件,实际上恐怕也就代替package临时存放jar包了
下面解决第一个问题:
通过jenkins首页控制台新建item后续详细流程参考https://blog.csdn.net/VicdorLin/article/details/90782965,点开一个现有item,点击左侧配置,在general下勾选This project is parameterized:
点击添加参数,选择choice parameter或者string parameter,请按实际需求选择添加配置,配置一个选项参数:
我这里示范添加了如下四个参数配置
分别表示
1,待部署工程选项列表配置
2,gitlab分支配置
3,部署版本号配置
4,目标环境列表配置
参数添加完之后我们需要在Execute shell构建进行配置,我们先来解决第2个问题,通过https://blog.csdn.net/VicdorLin/article/details/90782965这里的方法将jenkins服务器生成的公钥拷贝给远程目标服务器,并配置远程服务器sshd相关配置文件。
构建环境勾上,在shell脚本输入框中输入一段测试scp的脚本,可以看到$services其实就是上面配置的服务选项参数,当然这个testFile需要自己先手动生成一个
保存,并选择build with parameters可以看到我们的配置效果
点击开始构建,我们看到构建成功,到远程服务器检查文件是否顺利传输,如果顺利传输我们进行下一步ssh远程测试:
构建success后看到远程目标机器上测试文件已然删除
这里我突然想加个布尔配置,有句老话说重启解决99%的问题,考虑到有时候重启或者服务进程挂了需要启动都是已经有现成包的无需再次编译打包传包,这样耗费资源不说,时间也白白消耗了,我新加的配置如下图,并且考虑到暂时效果我把它拖到了脚本选择列表下方
关于gitlab分支参数,可以通过一个插件git parameter来动态配置,大概配置如下(先把前面配置的branch删除掉):
分支配置替换之后,即可测试可用性,这里就不做演示了。
之后优化的excute shell脚本如下:
#!/bin/bash
working_dir="/data/apps/$services/runner"
jenkins_dir="/var/lib/jenkins/workspace/$JOB_NAME"
jenkins_jar="$jenkins_dir/build/libs/$services-$version.jar"
remote_jar="$working_dir/tmp/$services.jar"
excute_word="sh $working_dir/$how.sh $version"
if [ "stop" != $how ]; then
if [ -f "$remote_jar" ] && $justStart; then
echo "run old package"
if [ "env" == "$env" ]; then
echo "start env"
ssh [email protected] $excute_word
else
echo "start dev"
$excute_word
fi
else
cd $jenkins_dir
/opt/gradle-5.4.1/bin/gradle clean bootJar
if [ "env" == "$env" ]; then
ssh [email protected] "rm -f $remote_jar"
echo "start env"
echo "transfering package..."
rsync -P --rsh=ssh $jenkins_jar www.demo.com:$remote_jar
echo "transfer success"
ssh [email protected] $excute_word
else
rm -f $remote_jar
echo "start dev"
cp $jenkins_jar $remote_jar
$excute_word
fi
fi
else
if [ "env" == "$env" ]; then
echo "stop env"
ssh [email protected] "sh $working_dir/stop.sh"
else
echo "stop dev"
sh $working_dir/stop.sh
fi
fi
其中,配置了两个环境,并没有配置参数列表里的test环境,如有需要,如法炮制添加即可。
下面给出start.sh脚本:
#!/bin/bash
export BUILD_ID=dontKillMe
source /etc/profile
echo "starting springboot server demo-service..."
pid=`ps -ef | grep demo-service.jar | grep -v grep | awk '{print $2}'`
if [ -n "$pid" ]; then
echo "already in run"
else
working_dir="/data/apps/demo-service/runner"
app_version=1.0.0
if [ -n $1 ]; then
app_version=$1
fi
runnable_jar=$working_dir/tmp/demo-service.jar
nohup java -jar -Dspring.profiles.active=dev $runnable_jar > /dev/null 2>&1 &
echo "run successful"
fi
特别说明下加以下这两行的目的,因为没有加这两行你总会发现你好不容易起好的服务进程很快被jenkins杀掉了,解决的办法似乎还有挺多,不够这个是我认为最简单有效的了。可能不同操作系统效果也不一样
export BUILD_ID=dontKillMe
source /etc/profile
stop.sh脚本:
#!/bin/bash
echo "stopping demo-service..."
pid=`ps -ef | grep demo-service.jar | grep -v grep | awk '{print $2}'`
if [ -n "$pid" ]; then
kill -9 $pid
echo "stopped"
else
echo "already stopped"
fi
restart.sh脚本:
#!/bin/bash
working_dir="/data/apps/demo-service/runner"
sh $working_dir/stop.sh
sleep 1
sh $working_dir/start.sh $1
说明:以上脚本在centos7.6中亲测有效,可以把demo-service改为你自己的服务即可