特别强调:
本文档教程已经算是一个综合性的讲解了,涉及范围比较广,希望你已经具备了下面的一些技术能力,这样在学习下面的内容的时候就比较容易看明白。
基础能力的掌握
对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镜像
docker pull jenkins
默认情况下,如果没有指定版本号和前缀的话,默认都是到Docker Hub官方去下载镜像的,默认版本标签是“latest”。
如果访问国外网络下载很慢的话,可以配置一下Docker加速服务,在之前文章中有讲过:
https://yuque.com/zhoubang/docker/docker-mysql-install#7n7eow
查看下载的Jenkins镜像
启动Jenkins容器
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 密码查看容器启动的日志信息,如下图:
主要原因还是文件的write权限问题。这里我就不多做讲解了,可以参考网上的一篇文章: https://testerhome.com/topics/11935
知道问题原因之后,我们给Jenkins用户赋予宿主机的 /opt/jenkins 目录的写权限即可:
sudo chown -R 1000:1000 /opt/jenkins
重启一下Jenkins容器(docker restart 容器ID)
访问Jenkins服务
浏览器输入: http://www.2b2b92b.com:28080
我的服务器域名是 www.2b2b92b.com,你需要更换成你自己的host。
首次访问Jenkins的时候,会看到下面这样的信息:
Jenkins给你分配了一个密码,用于登录Jenkins系统。
密码默认存放的位置,就在图中蓝色区域标明的文件里面,自己去把文件中的内容copy一下,然后在页面中输入密码即可。 【注意】:请进入Jenkins容器里面找到对应的密码文件,而不是在宿主机上。不要搞错了~
获取Jenkins登录密码,并登录Jenkins
进入Jenkins容器,将 /var/jenkins_home/secrets/initialAdminPassword 文件中的内容copy一下,并退出容器。然后在浏览器中输入密码即可登录。
进入Jenkins容器的命令:
docker exec -it c75 /bin/bash
其中的“c75”是Jenkins容器的ID。
进入容器之后,可以直接使用下面命令查看到密码,然后手动复制一下密码即可:
cat /var/jenkins_home/secrets/initialAdminPassword
initialAdminPassword文件内容如下:
用获取到的密码,登录Jenkins服务。
默认插件安装
登录Jenkins成功之后,首先会出现下面的页面:
左边一个是:安装建议的软件。右边一个是:选择自己需要的软件安装。
这里我就选择左边的,默认安装软件就行。
Jenkins会安装一些软件
时间或许会有点久,这个请稍作等待。关于外网网络不好的情况,这个请自行解决吧。
输入相关账户的信息
Jenkins环境配置
选择左侧菜单【系统管理】,再选择右侧的红色区域的选项,进入配置页面。
在配置页面中找到JDK的配置项:
其中,选择“自动安装”,且JDK版本我选择1.8版本。JDK别名的话我这里命名为“jdk1.8”。 然后保存一下即可。
同样的与JDK安装的步骤一样,选择“自动安装”,版本就默认最新版本即可。
填写完成之后,保存一下即可。
构建Maven项目
回到Jenkins首页,选择创建一个新任务:
进入新页面: 由于我们是要对springboot + maven结构的项目进行构建部署的,所以需要构建一个maven项目,但是这个页面中并未出现【构建一个maven项目】的选项,原因是因为我们还没有在Jenkins中安装maven的部署打包的插件。
安装maven构建插件
回到Jenkins首页,点击左侧的【系统管理】,然后再点击【管理插件】
进入插件管理的页面后,首先将选项卡切换到【可选插件】,之后在右上角文本框中输入Maven,找到需要的插件,点击下方的【直接安装】
这时候我们再重新进入新建任务的页面,你会看到有一个【构建一个maven项目】的选项:
至此,Jenkins所需的Maven打包构建的插件已经安装完毕。
配置项目git仓库地址
任务名称我这里就填写“springboot-maven”,选择【构建一个maven项目】,点击下方的OK按钮即可开始进入构建流程。
默认的maven项目构建页面如下图:
由于项目是git项目,故需要在【源码管理】区域选择“Git”,并输入项目的git仓库地址,如下图:
springboot + maven结构的项目,之前我自己分享了一个,可自行填写在此使用; 项目git地址 https://gitee.com/zhoubang85/sea-docker-example.git
如果想在线查看项目源码的话,可以访问 : https://gitee.com/zhoubang85/sea-docker-example
记得最后保存一下。
上面的git项目源码地址配置好之后,就可以进行项目构建了。回到Jenkins首页,点击【立即构建】
构建项目
可以回到首页,找到你刚刚新建的任务,然后选择【立即构建】即可!
查看任务构建的控制台信息输出
这时候在页面的左下角,会出现一个蓝白色的滚动条,说明项目已经开始构建了,我们可以点击这个滚动条进去看看构建的详细日志输出,类似控制台。
控制台日志输出,如下图:
【图一】
【图二】
其实你一目了然的看见,这就是我们平时在开发工具上打包maven项目的时候,控制台输入的信息是一样的。
然后,一直等待项目构建完成即可。
安装远程SSH命令执行、远程上传的插件,并配置远程服务器相关连接信息
上面的步骤,最终的结果只是通过Jenkins对项目进行了打包操作,对springboot-maven这个模块生成了jar文件。
如果我们想在Jenkins构建成功之后,自动将生成的jar上传到服务器对应的目录下,能否做到呢? 然后,在Jenkins中配置好构建成功后要执行的命令即可(具体命令下面会讲解)。
首先,要想远程执行服务器命令,需要安装插件。
安装SSH远程服务器命令执行的插件
在Jenkins首页左侧菜单选择【系统管理】 - 【插件管理】-【可选插件】,然后在右上角文本框中输入“ssh”,即可看到插件列表,这里我选择“SSH”这个插件就行,然后点击【直接安装】,如下图:
查看Jenkins是否已经支持SSH远程命令执行的功能
如果在页面中有看到下图中的选项,说明SSH插件已经安装成功:
配置SSH远程连接
在上图所示的“SSH remote hosts”选项中,点击增加按钮新增一个SSH配置,如下图:
其中用蓝色区域标明的选项,是让你选择一个“凭证”,但是现在是一个“none”的情况,没有凭证怎么办? 那我们就需要自己去创建一个凭证。
创建凭证的步骤如下: 首先还是回到Jenkins首页,选择操作菜单【Credentials】,再点击右侧的【Jenkins】链接,如下图:
下一步,选择【Global credentials】:
点击左侧【Add Credentials】新增凭证
输入服务器账户以及密码
点击保存即可。
配置SSH服务器连接
回到Jenkins首页,选择左侧菜单【系统管理】 - 【系统设置】,在“SSH remote hosts”的模块中填入我们的服务器相关信息,如下图: 再次进入页面,你会看到“Credentials”列表中就出现了我们上面创建的凭证了。 Linux服务器的Port一般都是22,host填写你的服务器外网IP即可。 为了确保连接正常,可以点击右下角的测试按钮,来测试一下。
配置完成后,记得保存!
安装远程部署上传插件
光安装远程脚本执行的插件还不够,我们的项目jar或者war都是需要上传到服务器上的,所以还需要安装一个插件。 具体下载安装这里不多说了,在插件安装页面的右上角输入“ssh”,选择“Publish Over SSH”安装,如下图:
回到Jenkins首页,进入【系统管理】 - 【系统设置】页面,在“Publish over SSH”选项中添加“SSH Servers”的配置,如下图:
填写服务器的登录信息以及文件上传的存储目录:
【特别注意】: 上图中的 Remote Directory 是有特殊作用的,意思就是,打包上传的文件,都是存放在该目录下的,且只能存放在该目录下,类似于全局配置的作用一样。 其中的细节以及存在的坑,在后面内容中会有说明(在Post Steps 中创建“Send files or execute commands over SSH”那一步的时候会讲到),请记得认真理解和阅读。
填写登录密码 在上图的步骤之后,点击一下【高级】按钮,输入你的服务器root用户的登录密码,如下图所示:
填写完毕后,你可以点击右下角的测试按钮,测试连接是否正常! 一切配置成功之后,记得保存哈!
设置项目构建的Post Steps
进入项目构建的【配置】页面:
配置Post Steps(建议勾选 Run only if build succeeds):
配置远程上传相关的信息
【对上图中“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选项中新增一个脚本,如下图:
编写脚本,如下图:
其实比较好的做法是,在Pre Steps配置一个构建之前执行的远程命令,先停止运行中的容器。如下图中配置预先执行的命令: 上图中的构建之前执行的远程命令,可以自己编写,这里我就不去配置了,不配置的话也不影响实际的部署流程。 但是,如果应用是一个war的话,由于容器会检测war的变化,自动重启容器,这时候就需要配置构建项目之前的预执行命令,提前先停止这个运行中的容器,不然tocat容器会重启出错的。
脚本的编写,你需要熟悉自己的服务器上的项目部署的情况,根据实际情况来编写。
脚本命令如下(项目构建成功后,会自动在Linux服务器上执行下面的命令):
docker stop springboot-maven-web-dockerfile
docker rm springboot-maven-web-dockerfile
docker rmi springboot-maven
cd /opt/projects/springboot_maven
docker build -t springboot-maven .
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文件已经放在项目中,可以找到的),最终的部署结构如下图:
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这个模块的启动类中的方法返回的内容进行修改,到时候重新构建之后,浏览器访问该项目,看看是否成功输出这句话!
重新构建
回到Jenkins首页,对项目进行重新构建:
查看控制台输出
从上图可以看到,项目在构建成功后,Jenkins已经成功执行了 我们在项目配置中指定的一些远程上传、命令脚本的功能。
访问最新项目
我的阿里云服务器域名是 www.2b2b92b.com,因此浏览器访问 http://www.2b2b92b.com:18080/ 效果如下:
到此,已经成功实现了springboot项目的自动化部署,并且应用成功运行在Docker容器中。
结语
总体来看,文章内容很多,但其实操作起来也没有那么复杂,只要你实际操练了一次,其实很容易明白的。还是那句话,一定要动手实践!