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

1538034870(1).jpg

因为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=^/"appName" ----> 先统计当前正在运行的的容器中是否包含该项目的名称
当前不存在该容器,直接进行启动该操作
否则先/usr/bin/docker stop "word" 停止该容器 /usr/bin/docker rm "word" 然后删除该容器

1538037236(1).jpg

最后


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地址

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,227评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,755评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,899评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,257评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,617评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,757评论 1 221
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,982评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,715评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,454评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,666评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,148评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,512评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,156评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,112评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,896评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,809评论 2 279
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,691评论 2 272

推荐阅读更多精彩内容