特别强调:

本文档教程已经算是一个综合性的讲解了,涉及范围比较广,希望你已经具备了下面的一些技术能力,这样在学习下面的内容的时候就比较容易看明白。

基础能力的掌握

  • 对Jenkins有一定的了解,知道Jenkins是干嘛用的

  • 熟悉maven的使用

  • 对 git 有实际的使用经验

  • 对springboot有入门的了解

需掌握的Docker技能知识

  • 在你的Linux服务器上先安装好Docker服务

  • 对Dockerfile有了解(命令能看懂就行)

  • 掌握Docker的基本命令:pull、run、ps、start、stop、rm、-v 等基本命令

  • 对数据挂载有简单的了解,知道数据挂载是干什么的

前言

如果你对Docker不太了解,可以看看其他的文章,从入门开始学习,一步步的实际操作练习,肯定会对Docker有了一定的理解和掌握。

我们让Jenkins服务也运行在容器中。

其他分享

分享一篇以前写的在win7系统上安装Jenkins以及使用Jenkins构建项目并自动化部署的教程(非Docker下安装)。

https://pan.baidu.com/s/1gflbfpD

注意点:在Docker中配置Jenkins环境与在win7下配置Jenkins环境,有些地方还是不太一样的。

进入正题!下面文档的所有操作均是在我的阿里云Linux CentOS服务器进行。

下载Jenkins镜像

  1. docker pull jenkins

默认情况下,如果没有指定版本号和前缀的话,默认都是到Docker Hub官方去下载镜像的,默认版本标签是“latest”。

如果访问国外网络下载很慢的话,可以配置一下Docker加速服务,在之前文章中有讲过:
https://yuque.com/zhoubang/docker/docker-mysql-install#7n7eow

查看下载的Jenkins镜像

springboot + maven结构的项目自动化部署 - 图1

启动Jenkins容器

  1. docker run -d -p 28080:8080 --name jenkins -v /opt/jenkins:/var/jenkins_home jenkins

jenkins默认端口号是8080,因为宿主机上已经存在8080端口占用了,因此这里我映射成28080端口。

同时将Jenkins的数据挂载到宿主机上的 /opt/jenkins 目录下。

执行上面的run命令后,通过docker ps查看运行中的容器的时候,有可能你会发现,Jenkins容器没有启动成功,你可以通过 docker logs 密码查看容器启动的日志信息,如下图:

springboot + maven结构的项目自动化部署 - 图2 主要原因还是文件的write权限问题。这里我就不多做讲解了,可以参考网上的一篇文章: https://testerhome.com/topics/11935

知道问题原因之后,我们给Jenkins用户赋予宿主机的 /opt/jenkins 目录的写权限即可:

  1. sudo chown -R 1000:1000 /opt/jenkins

重启一下Jenkins容器(docker restart 容器ID)

访问Jenkins服务

浏览器输入: http://www.2b2b92b.com:28080

我的服务器域名是 www.2b2b92b.com,你需要更换成你自己的host。

首次访问Jenkins的时候,会看到下面这样的信息:
springboot + maven结构的项目自动化部署 - 图3

Jenkins给你分配了一个密码,用于登录Jenkins系统。

密码默认存放的位置,就在图中蓝色区域标明的文件里面,自己去把文件中的内容copy一下,然后在页面中输入密码即可。 【注意】:请进入Jenkins容器里面找到对应的密码文件,而不是在宿主机上。不要搞错了~

获取Jenkins登录密码,并登录Jenkins

进入Jenkins容器,将 /var/jenkins_home/secrets/initialAdminPassword 文件中的内容copy一下,并退出容器。然后在浏览器中输入密码即可登录。

进入Jenkins容器的命令:

  1. docker exec -it c75 /bin/bash

其中的“c75”是Jenkins容器的ID。

进入容器之后,可以直接使用下面命令查看到密码,然后手动复制一下密码即可:

  1. cat /var/jenkins_home/secrets/initialAdminPassword

initialAdminPassword文件内容如下:
springboot + maven结构的项目自动化部署 - 图4

用获取到的密码,登录Jenkins服务。

默认插件安装

登录Jenkins成功之后,首先会出现下面的页面:

springboot + maven结构的项目自动化部署 - 图5

左边一个是:安装建议的软件。右边一个是:选择自己需要的软件安装。

这里我就选择左边的,默认安装软件就行。

Jenkins会安装一些软件
springboot + maven结构的项目自动化部署 - 图6

时间或许会有点久,这个请稍作等待。关于外网网络不好的情况,这个请自行解决吧。

输入相关账户的信息

springboot + maven结构的项目自动化部署 - 图7

Jenkins环境配置

  • JDK环境配置

选择左侧菜单【系统管理】,再选择右侧的红色区域的选项,进入配置页面。

springboot + maven结构的项目自动化部署 - 图8

在配置页面中找到JDK的配置项: springboot + maven结构的项目自动化部署 - 图9

其中,选择“自动安装”,且JDK版本我选择1.8版本。JDK别名的话我这里命名为“jdk1.8”。 然后保存一下即可。

  • Maven环境配置

同样的与JDK安装的步骤一样,选择“自动安装”,版本就默认最新版本即可。

springboot + maven结构的项目自动化部署 - 图10

填写完成之后,保存一下即可。

构建Maven项目

回到Jenkins首页,选择创建一个新任务: springboot + maven结构的项目自动化部署 - 图11

进入新页面: springboot + maven结构的项目自动化部署 - 图12 由于我们是要对springboot + maven结构的项目进行构建部署的,所以需要构建一个maven项目,但是这个页面中并未出现【构建一个maven项目】的选项,原因是因为我们还没有在Jenkins中安装maven的部署打包的插件。

安装maven构建插件

回到Jenkins首页,点击左侧的【系统管理】,然后再点击【管理插件】
springboot + maven结构的项目自动化部署 - 图13

进入插件管理的页面后,首先将选项卡切换到【可选插件】,之后在右上角文本框中输入Maven,找到需要的插件,点击下方的【直接安装】
springboot + maven结构的项目自动化部署 - 图14
这时候我们再重新进入新建任务的页面,你会看到有一个【构建一个maven项目】的选项:
springboot + maven结构的项目自动化部署 - 图15

至此,Jenkins所需的Maven打包构建的插件已经安装完毕。

配置项目git仓库地址

任务名称我这里就填写“springboot-maven”,选择【构建一个maven项目】,点击下方的OK按钮即可开始进入构建流程。
springboot + maven结构的项目自动化部署 - 图16

默认的maven项目构建页面如下图:
springboot + maven结构的项目自动化部署 - 图17

由于项目是git项目,故需要在【源码管理】区域选择“Git”,并输入项目的git仓库地址,如下图:
springboot + maven结构的项目自动化部署 - 图18

springboot + maven结构的项目,之前我自己分享了一个,可自行填写在此使用; 项目git地址 https://gitee.com/zhoubang85/sea-docker-example.git

如果想在线查看项目源码的话,可以访问 : https://gitee.com/zhoubang85/sea-docker-example

记得最后保存一下。

上面的git项目源码地址配置好之后,就可以进行项目构建了。回到Jenkins首页,点击【立即构建】

构建项目

可以回到首页,找到你刚刚新建的任务,然后选择【立即构建】即可!
springboot + maven结构的项目自动化部署 - 图19

查看任务构建的控制台信息输出

这时候在页面的左下角,会出现一个蓝白色的滚动条,说明项目已经开始构建了,我们可以点击这个滚动条进去看看构建的详细日志输出,类似控制台。

springboot + maven结构的项目自动化部署 - 图20

控制台日志输出,如下图:
【图一】
springboot + maven结构的项目自动化部署 - 图21
【图二】
springboot + maven结构的项目自动化部署 - 图22

其实你一目了然的看见,这就是我们平时在开发工具上打包maven项目的时候,控制台输入的信息是一样的。

然后,一直等待项目构建完成即可。

安装远程SSH命令执行、远程上传的插件,并配置远程服务器相关连接信息

上面的步骤,最终的结果只是通过Jenkins对项目进行了打包操作,对springboot-maven这个模块生成了jar文件。

如果我们想在Jenkins构建成功之后,自动将生成的jar上传到服务器对应的目录下,能否做到呢? 然后,在Jenkins中配置好构建成功后要执行的命令即可(具体命令下面会讲解)。

首先,要想远程执行服务器命令,需要安装插件。

安装SSH远程服务器命令执行的插件

在Jenkins首页左侧菜单选择【系统管理】 - 【插件管理】-【可选插件】,然后在右上角文本框中输入“ssh”,即可看到插件列表,这里我选择“SSH”这个插件就行,然后点击【直接安装】,如下图:

springboot + maven结构的项目自动化部署 - 图23

查看Jenkins是否已经支持SSH远程命令执行的功能

springboot + maven结构的项目自动化部署 - 图24

如果在页面中有看到下图中的选项,说明SSH插件已经安装成功: springboot + maven结构的项目自动化部署 - 图25

配置SSH远程连接

在上图所示的“SSH remote hosts”选项中,点击增加按钮新增一个SSH配置,如下图:

springboot + maven结构的项目自动化部署 - 图26

其中用蓝色区域标明的选项,是让你选择一个“凭证”,但是现在是一个“none”的情况,没有凭证怎么办? 那我们就需要自己去创建一个凭证。

创建凭证的步骤如下: 首先还是回到Jenkins首页,选择操作菜单【Credentials】,再点击右侧的【Jenkins】链接,如下图:

springboot + maven结构的项目自动化部署 - 图27 下一步,选择【Global credentials】springboot + maven结构的项目自动化部署 - 图28

点击左侧【Add Credentials】新增凭证 springboot + maven结构的项目自动化部署 - 图29

输入服务器账户以及密码

springboot + maven结构的项目自动化部署 - 图30

点击保存即可。

配置SSH服务器连接

回到Jenkins首页,选择左侧菜单【系统管理】 - 【系统设置】,在“SSH remote hosts”的模块中填入我们的服务器相关信息,如下图: springboot + maven结构的项目自动化部署 - 图31 再次进入页面,你会看到“Credentials”列表中就出现了我们上面创建的凭证了。 Linux服务器的Port一般都是22,host填写你的服务器外网IP即可。 为了确保连接正常,可以点击右下角的测试按钮,来测试一下。

配置完成后,记得保存!

安装远程部署上传插件

光安装远程脚本执行的插件还不够,我们的项目jar或者war都是需要上传到服务器上的,所以还需要安装一个插件。 具体下载安装这里不多说了,在插件安装页面的右上角输入“ssh”,选择“Publish Over SSH”安装,如下图: springboot + maven结构的项目自动化部署 - 图32

回到Jenkins首页,进入【系统管理】 - 【系统设置】页面,在“Publish over SSH”选项中添加“SSH Servers”的配置,如下图: springboot + maven结构的项目自动化部署 - 图33

填写服务器的登录信息以及文件上传的存储目录

springboot + maven结构的项目自动化部署 - 图34

【特别注意】: 上图中的 Remote Directory 是有特殊作用的,意思就是,打包上传的文件,都是存放在该目录下的,且只能存放在该目录下,类似于全局配置的作用一样。 其中的细节以及存在的坑,在后面内容中会有说明(在Post Steps 中创建“Send files or execute commands over SSH”那一步的时候会讲到),请记得认真理解和阅读。

填写登录密码 在上图的步骤之后,点击一下【高级】按钮,输入你的服务器root用户的登录密码,如下图所示:

springboot + maven结构的项目自动化部署 - 图35

填写完毕后,你可以点击右下角的测试按钮,测试连接是否正常! 一切配置成功之后,记得保存哈!

设置项目构建的Post Steps

进入项目构建的【配置】页面:

springboot + maven结构的项目自动化部署 - 图36

配置Post Steps(建议勾选 Run only if build succeeds): springboot + maven结构的项目自动化部署 - 图37

配置远程上传相关的信息 springboot + maven结构的项目自动化部署 - 图38

【对上图中“Remote directory”配置存在的坑以及细节的说明】

上图中所示的配置,里面会让你配置一个“Remote directory”,这个“Remote directory”与【安装远程部署上传插件】这个章节里面的【“SSH Servers”配置】中的“Remote directory”是不一样的。

你可以理解为,上面图中的“Remote directory”是以SSH Servers中的“Remote directory”为起点路径。

举几个例子比较容易理解:

  • 如果SSH Servers中的“Remote directory”为空的话,则默认是以Linux系统的“root”目录作为存储目录。
  • 如果SSH Servers中的“Remote directory”为空,但上图中的“Remote directory”填写为“/opt/projects/springboot-maven”的话,则jar文件将会上传在 “/root/opt/projects/springboot-maven”目录下(实际上jar文件应该上传到 “/opt/projects/springboot-maven”目录下才对,这就说明我们配置“Remote directory”有误)。

  • 如果SSH Servers中的“Remote directory”填写的是“/opt/projects/springboot-maven”,而上图中的“Remote directory”填写的也是“/opt/projects/springboot-maven”,则项目在构建成功后,将会把jar上传到“/opt/projects/springboot-maven/opt/projects/springboot-maven”目录下(同样不符合预期,Remote directory配置有误)。

  • 如果SSH Servers中的“Remote directory”填写的是“/opt/projects/springboot-maven”,而上图中的“Remote directory”为空,则项目在构建成功后,将会把jar上传到“/opt/projects/springboot-maven”目录下(这种方式的配置是正确的)。

综合来说就是,jar最终上传的路径是(假如完整路径用PATH变量表示)PATH = **SSH Servers中的Remote directory的值 + 上图中的Remote directory的值 PATH的值就是作为jar包的完整存储路径!**

编写远程执行脚本

因为springboot是一个jar应用,当上传到服务器对应的目录下的时候,服务器上运行的该springboot-maven项目的容器,是无法重新加载这个jar的,这与上传war是不同的,如果是war的话,tomcat容器会检测war的变化,会自动帮助你重启tomcat容器的。 所以,这就需要我们编写脚本,springboot-maven容器的重启。

在项目构建的设置页面中,在Post Steps选项中新增一个脚本,如下图:
springboot + maven结构的项目自动化部署 - 图39
编写脚本,如下图:
springboot + maven结构的项目自动化部署 - 图40

其实比较好的做法是,在Pre Steps配置一个构建之前执行的远程命令,先停止运行中的容器。如下图中配置预先执行的命令: springboot + maven结构的项目自动化部署 - 图41 上图中的构建之前执行的远程命令,可以自己编写,这里我就不去配置了,不配置的话也不影响实际的部署流程。 但是,如果应用是一个war的话,由于容器会检测war的变化,自动重启容器,这时候就需要配置构建项目之前的预执行命令,提前先停止这个运行中的容器,不然tocat容器会重启出错的。

脚本的编写,你需要熟悉自己的服务器上的项目部署的情况,根据实际情况来编写。

脚本命令如下(项目构建成功后,会自动在Linux服务器上执行下面的命令):

  1. docker stop springboot-maven-web-dockerfile
  2. docker rm springboot-maven-web-dockerfile
  3. docker rmi springboot-maven
  4. cd /opt/projects/springboot_maven
  5. docker build -t springboot-maven .
  6. docker run -d -p 18080:8080 --name springboot-maven-web-dockerfile springboot-maven

脚本命令的执行流程大体如下: 1、停止容器、删除容器 2、删除原来的镜像 3、构建新镜像 4、启动容器

【脚本简单说明】: 1、我们构建新镜像的时候,为新镜像命名为“springboot-maven” 2、为启动的容器命名为“springboot-maven-web-dockerfile” 3、因为容器采用数据挂载的形式运行的,所以jar是存放在宿主机的 /opt/projects/springboot_maven 目录下的。 4、在使用 docker build 命令构建镜像的时候,/opt/projects/springboot_maven目录下是有一个Dockerfile文件的,里面写了一些Docker命令(Dockerfile文件已经放在项目中,可以找到的),最终的部署结构如下图

springboot + maven结构的项目自动化部署 - 图42

Dockerfile文件内容如下(主要目的就是将打包好的jar添加到新镜像中,然后运行jar): ```

使用java镜像

FROM java

将jar添加到容器中

ADD springboot-maven-0.0.1-SNAPSHOT.jar springboot-maven.jar

运行jar

ENTRYPOINT [“java”,”-Djava.security.egd=file:/dev/./urandom”,”-jar”,”/springboot-maven.jar”] ```

如果对上面的命令不明白的,或者不清楚其中的部署情况的,请先阅读学习这篇文档: 《在Docker中部署springboot + maven 结构的项目》 https://yuque.com/zhoubang/docker/docker-deploy-springboot-maven 因为,此处的命令与Dockerfile文件的内容,都是在这篇文章的基础上进行操作的。

5、为项目映射了宿主机上的18080端口

记得最后保存一下配置信息!

修改项目代码,通过Jenkins重新构建项目,验证自动化部署是否成功

这里我就直接对springboot-maven这个模块的启动类中的方法返回的内容进行修改,到时候重新构建之后,浏览器访问该项目,看看是否成功输出这句话!

springboot + maven结构的项目自动化部署 - 图43

重新构建

回到Jenkins首页,对项目进行重新构建:
springboot + maven结构的项目自动化部署 - 图44

查看控制台输出

springboot + maven结构的项目自动化部署 - 图45

从上图可以看到,项目在构建成功后,Jenkins已经成功执行了 我们在项目配置中指定的一些远程上传、命令脚本的功能。

访问最新项目

我的阿里云服务器域名是 www.2b2b92b.com,因此浏览器访问 http://www.2b2b92b.com:18080/ 效果如下:
springboot + maven结构的项目自动化部署 - 图46
到此,已经成功实现了springboot项目的自动化部署,并且应用成功运行在Docker容器中。

结语

总体来看,文章内容很多,但其实操作起来也没有那么复杂,只要你实际操练了一次,其实很容易明白的。还是那句话,一定要动手实践!