springboot + jenkins + docker 自动
前言:
本文面向的是有一定代码基础,对自动化部署有兴趣的同学,非新手向
如题所示,这个是一个spring boot 2.0 之后的一个架构的jenkins部署,跟以往的不一样的地方在于,用了maven的docker插件进行控制,本文中,会提到,关于docker中的一些版本控制的注意事项,已经jenkins脚本的编写方式
1.准备springboot代码项目
首先先准备一个springboot项目,可以正常启动的那种
本文以eureka为例
准备好后正式插入docker的配置信息
1.1 maven
在pom.xml的plugins标签下加入一个新的plugin
<!-- Docker maven plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- 镜像名称-->
<imageName>${project.artifactId}</imageName>
<!-- 镜像标签-->
<imageTags>
<!--可以指定多个标签 建议弄成自增序列或者时间戳类型,用于区分版本-->
<imageTag>${maven.build.timestamp}</imageTag>
</imageTags>
<baseImage>java</baseImage>
<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
<!-- dockerfile文件路径-->
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
<!-- Docker maven plugin -->
加入一个properties以控制tag时间格式
<properties>
<maven.build.timestamp.format>yyyyMMddHHmmss</maven.build.timestamp.format>
</properties>
然后去到plugin中定义的dockerDirectory的路径创建一个Dockerfile的文件
1538034241(1).jpg
1.2
编写dockerfile文件,dockerfile文件是用于docker对jar包打包之后的操作的一个定义,熟悉docker的都应该很熟悉这个文件了
FROM 承载的镜像名称
VOLUME jar包的操作目录
ADD 需要上传到镜像中的文件
ENTRYPOINT 启动docker时需要运行的命令,就是说当docker启动容器就会自动执行
java -Djava.security.egd=file:/dev/./urandom -jar /simons-cloud-eureka.jar 这一语句
具体语法,请参照dockerfile文件的编写规则,这里就不班门弄斧了
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD simons-cloud-eureka.jar simons-cloud-eureka.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/simons-cloud-eureka.jar"]
成功之后把代码提交到git那么编写这方面就告一段落了
2.1 服务器上的操作
linux服务器上的操作
本文用的是vmware虚拟机做的演示
首先,打开虚拟机,已经对应的远程工具xshell
因为docker的内核版本要求问题
本文为了尽量避免兼容问题
用的是centos7
安装软件的话,因为有很多的博客了,我就不赘述了,我贴出来大家去看就好
安装jdk https://blog.csdn.net/small_love/article/details/77394721,
安装maven https://blog.csdn.net/vipbupafeng/article/details/80277126,
安装git https://blog.csdn.net/javaee_sunny/article/details/80450153,
安装jenkins https://blog.csdn.net/linjingke32/article/details/77799878,
安装docker https://blog.csdn.net/kuqq2005/article/details/76359327,
1538035300(1).jpg
检查所有软件的状态是否ok
2.2 操作jenkins
首先要到左手边,系统管理的全局工具配置选项里面,填写上面安装的git,maven,和jdk的路径
1538035866(1).jpg
配置完成之后就配置git的用户凭证,使jenkins可以通过用户密码调用git
1538036026(1).jpg
配置完成之后就可以进行新增项目
2.3
输入对应的jenkins的目录地址然后,新建项目
1538035497(1).jpg
项目新建玩之后,进入配置页面,把刚才写好的地址填进git里面
1538036342(1).jpg
填写git项目地址选好凭证
填写maven,以及配置maven之后要执行的脚本代码
1538036401(1).jpg
先执行maven的clean install命令进行依赖更新
然后 去到jenkins的WORKSPACE下的simons-cloud-eureka项目下,就是我们刚才新建的项目
然后执行这个项目下的start.sh的脚本
image.png
cd $WORKSPACE/simons-cloud-eureka
sh start.sh
因为在jenkins里面执行shell脚本的话,有很多奇奇怪怪的情况
所以我建议大家还是写一个脚本,然后在jenkins里面执行这个脚本
防止bug
我这边就把脚本贴出来
appName="simons-cloud-eureka"
word="1"
echo "$word"
word=`docker ps -a -q --no-trunc --filter name=^/"$appName"$`
echo "$word"
if [ -z "$word" ];
then
echo "当前不存在该容器,直接进行启动该操作-------------------------------------"
elif [ -n "$word" ];
then
echo "当前已存在容器,停止并移除该容器-------------------------------------"
/usr/bin/docker stop "$word"
/usr/bin/docker rm "$word"
elif [ "$word" == "1" ];
then
echo "查询的信息有误,执行默认操作-------------------------------------"
/usr/bin/docker stop "$word"
/usr/bin/docker rm "$word"
fi
/usr/local/sbin/apache-maven-3.3.9/bin/mvn clean package -P spring-boot docker:build
/usr/bin/docker run -p 8761:8761 -d --name "$appName" "$appName":latest
那么我这边介绍一下shell的执行流程
首先先定义要启动的项目名称,就在dokcerfile里面我们写的要启动的项目名称,
建议是全部统一该项目的名称
docker ps -a -q --no-trunc --filter name=^/" ----> 先统计当前正在运行的的容器中是否包含该项目的名称
当前不存在该容器,直接进行启动该操作
否则先/usr/bin/docker stop "word" 然后删除该容器
最后
1538037248(1).jpg
/usr/local/sbin/apache-maven-3.3.9/bin/mvn clean package -P spring-boot docker:build
使用maven打包springboot项目
然后
maven的docker-plugin 会把这个项目打包成jar包然后上传到本地镜像仓库中,然后启动该镜像
然后我们去检查一下docker的镜像仓库会发现,哎出现了一个latest和时间戳 tag的项目,因为docker默认最后一个版本为latest所以会出现两个,当新的时间戳版本生成时latest版本会被新的时间戳版本覆盖,所以我们启动的时候启动latest的容器即可
1538037364(1).jpg image.png这个时候我们在浏览器里面,打开这个docker对应的eureka的控制页面
image.png完美,打开了,那么这一篇博文就搞定咯
也欢迎大家的纠正,和留言
想要项目源码的也可以在下方留言,我会给你们git地址