简单来说,大型系统拆分为多个服务后,每个小团队负责一个服务,服务的更新、发布会变得很频繁,通过工具监控代码的每次提交,持续进行自动化的构建过程,就是持续集成。
Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,是一个免费的开源平台,可以处理任何类型的构建或持续集成。
Post Steps 构建完成后添加执行 shell 脚本,脚本的意思是查找eureka-server的进程,并杀死,然后启动 eureka-server包
#!/bin/bash
echo "********************** Jenkins Stopping SpringBoot Application*************************"
jar_name=eureka-server-0.0.1-SNAPSHOT.jar
pid=`ps -ef | grep $jar_name | grep -v grep | awk '{print $2}'`
if [ -n "$pid" ]
then
#!kill -9 强制终止
echo "kill -9 的pid:" $pid
kill -9 $pid
fi
file_path=/root/.jenkins/workspace/eureka-server/eureka/eureka-server/target/
echo "执行....."
java -jar $file_path$jar_name
echo "********************** Jenkins Started SpringBoot Application*************************"
可以看到日志输出 Started Eureka Server,ok到此构建完成了
访问 eureka-server地址 http://192.168.68.141:10025/ ,可以看到刚刚的构建成功了
因为上面配置了 轮询 SCM,每隔10分钟查询一次Git仓库,是否有代码提交,有就会触发构建,在Git仓库改动代码后提交(提交时的备注信息是:添加打印日志),等待10分钟的周期,看看是否会构建一次
隔了10多分钟后,进行了一次自动构建,git提交时的备注信息也拉取过来了
好了,Jenkins轮询拉取 Git 仓库中的代码,有变动就会触发构建,构建后可以执行自定义 shell 脚本,可以很方便的做集成测试,打包到 docker 私有仓库,再通过运维拉取docker镜像到测试、正式环境进行上线
SpringCloud实战:docker部署项目
补充一点,上面是 java -jar xxx.jar 的形式启动,不是后台启动的,jenkins默认会在构建完成后杀掉构建过程中有jenkins中shell命令触发的衍生进程。jenkins根据BUILD_ID识别某个进程是否为构建过程的衍生进程,故修改BUILD_ID后,jenkins就无法识别是否为衍生进程,则此进程能在后台保留运行
1.改造 shell 脚本,能后台启动,在Post Steps中,替换之前的脚本,使用下面的脚本
OLD_BUILD_ID=$BUILD_ID
echo $OLD_BUILD_ID
BUILD_ID=dontKillMe
#此处放入shell脚本或者shell命令
sh /restartBoot1.sh
BUILD_ID=$OLD_BUILD_ID
echo $BUILD_ID
2.然后在服务器的根目录放一个 restartBoot1.sh 文件,该文件在centos上创建,然后把内容复制进去,因为windows上的文件格式与linux上的不一样,启动时会报错,此处坑了我一下,内容如下:
#!/bin/bash
echo "********************** Jenkins Stopping SpringBoot Application*************************"
pid=`ps -ef | grep eureka-server-0.0.1-SNAPSHOT | grep -v grep | awk '{print $2}'`
if [ -n "$pid" ]
then
#!kill -9 强制终止
echo "kill -9 的pid:" $pid
kill -9 $pid
fi
echo "执行....."
nohup java -jar /root/.jenkins/workspace/eureka-server/eureka/eureka-server/target/eureka-server-0.0.1-SNAPSHOT.jar &
echo "********************** Jenkins Started SpringBoot Application*************************"
手动多构建几次,可以看服务器上 eureka-server的进程号,前面的被后面的kill,然后后面的后台启动
项目中使用了lombok,服务器上 jenkins 编译报错,需要更改maven complier的版本,低版本的才兼容
org.springframework.boot
spring-boot-maven-plugin
org.apache.maven.plugins
maven-compiler-plugin
3.6.2
1.8
1.8
另外推荐一篇使用docker 安装 jenkins的博客:https://blog.csdn.net/qq_42766492/article/details/90760217,
https://blog.csdn.net/qq_37143673/article/details/97613633
请使用下面语法启动jenkins容器
docker run -d --name jenkins -u root -it --restart=always \
-p 7080:8080 -p 50000:50000 \
-p 8190:8190 \
--privileged=true \
-v /var/jenkins_home:/var/jenkins_home \
-v /home:/home \
-v /usr/bin/docker:/usr/bin/docker \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/lib64/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7 \
-v /etc/localtime:/etc/localtime -v /etc/timezone:/etc/timezone \
jenkinsci/blueocean
OLD_BUILD_ID=$BUILD_ID
echo $OLD_BUILD_ID
BUILD_ID=dontKillMe
#此处放入shell脚本或者shell命令
. /etc/profile
sh /var/jenkins_home/deploy/deploy.sh
BUILD_ID=$OLD_BUILD_ID
echo $BUILD_ID
deploy.sh
#!/usr/bin/env bash
# 输入jenkins环境下的项目路径
export JENKINS_PATH=/var/jenkins_home/workspace/appointment/code/sisco
# 输入工作环境上tomcat的全路径
export APP_PATH=/home/test
# 结束原java进程
export pid=`ps -ef | grep appointment-1.0.0.jar | grep -v grep | awk '{print $1}'`
if [ -n "$pid" ]
then
#!kill -9 强制终止
echo "kill -9 的pid:" $pid
kill -9 $pid
fi
#echo 'delete appointment-1.0.0.jar file'
rm -f $JENKINS_PATH/appointment-1.0.0.jar
#echo 'cp file '
cp $JENKINS_PATH/target/appointment-1.0.0.jar $JENKINS_PATH/
# 注意这个user.dir,如果你项目中使用到了,请一定要设置
nohup java -DXms400m -DXmx400m -Duser.dir=$JENKINS_PATH/ -jar $JENKINS_PATH/appointment-1.0.0.jar --server.port=8190 --spring.profiles.active=default &
通过端口号,查询进程ID
打印8080端口的进程号:lsof -i:8080 |awk ‘{print $2}’ | tail -n 2
Kill8080端口的进程: kill -9 $(lsof -i:8080 |awk ‘{print $2}’ | tail -n 2)