前言传统的开发、测试、部署方式,是由开发人员本机或打包机进行打包,将war包提交给测试人员部署,测试通过后,再由实施人员负责部署到预发、生产环境中。中间的衔接不连贯,容易出错,而且打包、部署存在重复的工作量。自动化构建部署(CICD)就是解决该问题,将从开发到部署的一系列流程变成自动化,衔接连贯,在构建失败时能够告知开发,构建成功后能够告知测试和实施人员。无论大中小公司,都应该有此流程。 目标最终目标:在linux系统中,搭建 jenkins 服务,定时(或githook)的方式从github 上拉取maven工程,构建war包。使用docker构建image,推送到docker registry 上。
为了更好的写这个教程,我逐步完成最终目标,将目标拆分成3个部分。
第一步 git代码服务器这里以github为例,其他如svn、gitlab、码云等VCS也都大同小异。有时间我会补充私有的gitlab搭建方式。
第二步 jenkins集成首先你需要有一台linux系统,我使用VMWare搭建的Ubuntu16的虚拟机(本人低配本,觉得VM比VB更快些,虚拟机磁盘最好使用固态,并多分些cpu和内存)。
安装jenkins的docker版本(ps:docker版方便快捷) 打开终端,先把docker安装上 sudo apt install docker.io 使用docker安装jenkins,直接调用run命令,会自动pull镜像并运行 sudo docker run -d \ 8080端口是jenkins的端口,5000端口是master和slave通信端口(jenkins集群部署后期我再补充,本次为单机配置)。
初次启动的时候,可以通过 docker logs -f jenkins 查看控制台的密码,通过这个密码登录系统。(~/jenkins的初始化文件也有密码)启动后就可以通过 127.0.0.1:8080 访问jenkins了。输入密码,新建用户,安装默认插件。手动需要安装的插件有:
还需要指定jenkins的jdk和maven,进入 系统管理->全局工具配置 ,jdk在jenkins中的/usr/lib/jvm/java-8-openjdk-amd64 目录中,maven需要让他自动下载(这种方式不是很好,可以使用docker的volumn去挂载一个maven供jenkins使用)下面开始新建一个Maven项目,在主页左侧点击 新建 ,选择构建一个Maven项目 ,点击确定,主页列表会出现该项目。进入该项目,左侧树中有 配置 按钮,点击进去出现如下界面。从上到下的配置是(构建时也是按照从上到下进行执行的):
构建设置:可以配置构建完成后Email通知,我这里没有配置。(很简单,在设置-全局设置中配置Email的发件人账户,这里再配置收件人即可) 构建后操作:这一步先不配置 到此基本的配置都已经完成了,可以使用jenkins将github上的代码拉下来进行构建了。返回项目页面,在左侧点击立即构建或修改代码等待5分钟或访问触发远程构建的URL。jenkins就会开始构建了。 查看控制台,我们可以看到日志,如果失败需要根据日志判断失败原因,是工程build失败还是和jenkins配置有关。
第三步 推送war包到tomcat服务器上一步已经可以构建出war包,并在target中。这一步我们将war包推送到远程的一台tomcat服务器上去(tomcat我部署在运行VM的宿主机器上)。 进入jenkins的项目配置,修改 构建后操作 这一项构建后操作:由于前面安装了 Deploy to container Plugin,Publish Over SSH 插件,这里就会有两个选项这一步我们只用到Deploy to container Plugin,选择它之后,会出现下面这个配置窗。 WAR/EAR files:war包相对workspace的地址 Context path:部署到tomcat的上下文名称,例如:127.0.0.1:8080/DataCollect可以访问到该项目 Containers:指定部署到的tomcat版本,tomcat服务器的地址以及用户名密码,这里用户需要在tomcat中有manager的权限,你需要修改tomcat目录下conf/tomcat-user.xml,添加类似如下的用户。 <role rolename="manager-gui"/> 先启动你的tomcat,再在jenkins构建你的项目,最后war包会被推送到tomcat中去。看构建日志和tomcat日志如下。 访问tomcat的项目地址,可以访问。
第四步 基于Dockerfile构建镜像这一步也很简单,首先你不考虑jenkins,只写一个Dockerfile,能够基于tomcat的镜像+war包构建一个新的镜像就可以了。jenkins的作用就是远程调用一下Dockerfile的build脚本。 Dockerfile在的github里也已经提供了,这里再粘一份。 #基础镜像 Dockerfile如何编写这个需要各位读者自行学习,我这里使用的是tomcat的标准镜像,并通过COPY命令将target的war包拷贝到webapps中。 此Dockerfile在github中,jenkins在拉取源码时,该文件也会被拉取。我们只需要让jenkins把Dockerfile和war包传给docker打包服务器,再调用打包命令就可以生成新的docker镜像,再推送到阿里的registry。
由于之前安装了Publish Over SSH这个插件,就可以完成上述传输操作。 首先需要到系统管理->系统设置配置Publish over SSH内容。我这里使用的是使用账户密码方式登录(可以使用ssh文件登录)。配置如下: Passphrase:登录密码 Name:服务器名称(自定) Hostname:远程服务器地址 Username:登录用户 Remote Directory:访问的远程目录 再进入jenkins的项目配置,修改构建后操作这一项 构建后操作:使用Publish Over SSH这个插件,对应的选项是Send build artifacts over SSH 对Send build artifacts over SSH进行配置如下: SSH server Name:需要SSH连接的Name(刚才配置好的) Source files:要拷贝的文件地址(相对workspace) Remove prefix:去掉Source files的前缀部分 Remote directory:要拷贝到host机器的哪个目录(这个目录是相对Remote Directory的目录) Exec command:拷贝完成执行的命令 我这里需要传输两个文件,一个是war包,另一个是Dockerfile。我的配置如下: 第一个Exec command调用的test.sh是随便echo点东西 第二个Exec command是调用一个shell脚本,里面docker会执行build、push等一系列命令,这里贴出来 /home/zhangchx/docker/docker-datacollect.sh“ pwd /docker/DataCollect” $BUILD_NUMBERecho "当前位置:"`pwd`
执行jenkins的构建,可以从控制台看到日志 进入Ubuntu里面查看docker镜像和容器,可以看到容器在运行,也可以正常访问。 结尾至此,github+jenkins+maven+docker自动化构建已经达成。该构造可运行在中小公司完全没问题,如果构建频繁等原因性能跟不上,可在此结构上进行扩展,增加jenkins集群和docker服务器。 作者:天生我才毕有用 原文链接:https://blog.csdn.net/njzcx/article/details/80979157 长按二维码,关注我们 新睿云,让云服务触手可及 云主机|云存储|云数据库|云网络 点击“阅读原文”参与活动 ---------------------------------------------------------------------------------------------------------------------- 我们尊重原创,也注重分享,文章来源于微信公众号:新睿云,建议关注公众号查看原文。如若侵权请联系qter@qter.org。 ---------------------------------------------------------------------------------------------------------------------- |