一、杂言
首先今天在写这篇文章的时候,刚好LOL洲际赛,RW赛前不被看好的情况下,为LPL扳回一城,RNG成功的在BO5最后一场拿下AFS,LPL成功的拿下了洲际赛的冠军.恭喜LPL!田忌赛马的故事大家都耳熟能详,但是不可避免的也会出现逆转的情况,正如我们这个行业,不学习你就输了,这篇文章本应该在这周一就开始写的,但是我太懒了,硬生生的拖到了周日,还在看完比赛后才开始写,为自己的拖延症感到惭愧啊.
按照之后的学习的进度,每周更新一篇文章才是常态,希望自己能做到...
下面开始正式的搭建过程.
ps:文章直接从我的知乎上copy过来的,貌似图片显示不出来,请直接访问知乎吧!文末附知乎地址!
二、准备工作
1.背景说明
本次实验是模拟项目发布流程,因为目前工作是负责java的ci部分,所以以java为例子来写。一般java项目的发布流程如下:
本地项目开发-->提交代码变更到远程仓库-->jenkins拉取代码、ci测试、编码源代码-->发布java代码-->测试
本文也是基于这样的理念来操作的.
2.准备工作
按照以上的流程,我们需要一个git服务器、jenkins服务器以及一个运行java代码的服务器,本篇文章中的git服务器选择github仓库;jenkins服务器就直接选择我windows上安装的jenkins;运行java代码环境的服务器这里选择一个docker容器,运行在我本地的虚拟机上.
说明:git、jenkins都可以使用docker容器来进行构建,但是本篇文章的重点不在这.
3.本篇文章使用的tale博客项目,tale访问地址:https://github.com/otale/tale.git,我已经clone到自己的项目库作为演示了.
三、构建过程
1.启动jenkins
本机cmd命令,到jenkins.war包目录下执行以下命令:
java -jar jenkins.war start //如果启动失败报端口已被使用的话,启动时指定端口号
2.jenkins系统配置
ps: 出现‘553 Mail from must equal authorized user’错误的话,将用户名和Jenkins Location-->系统管理员邮件地址 配置一致即可;出现‘535 Error: authentication failed’错误的话,表示用户名和密码不一致,密码要填写对应的授权码
其他的部分配置成默认的就好,配置结束后点击Test Configuration,当出现success时表示配置成功.
3.新建maven的job
选择构建一个maven项目,填写上项目名称,点击确定就行,如果没有显示maven项目,那可能是你没有下载相应的插件(maven intergration)
源码管理选择git,配置如下:
这里需要自己添加一个ssh认证,因为是通过http的方式clone代码的,所以只需要使用用户名和密码就行,这里checkout的是master分支
构建触发器,这里勾选下轮询SCM(poll scm),填写 “* * * * *”,表示每分钟去检查代码是否有变更,有变更的话就执行构建过程.
Build,这里是maven执行的指令,配置如下:
构建后操作,jenkins此时已实现将打好的tale包发送到该机器下的/data目录下,因此构建后的操作主要是开启tale进程即可,配置如下:
说明:
四、测试结果
1.提交代码变更到git仓库,然后jenkins会自动开始构建(poll scm中设定的)
2.直接在jenkins上手动点击立即构建
以上虽然jenkins上显示的是黄球,但表示的是执行成功了.
然后输入地址:IP:9000即可访问,出现以下界面表示本次实验成功
说明:9000端口是tale默认的.
五、总结
六、更新部分
本篇文章的标题是基于docker构建,但是之前都是直接搭建在服务器上,接下来补充利用docker搭建部分。
1.首先服务器得安装docker,这里我在虚拟机中已经安装好了(不知道如何安装的小火鸡请参考我之前的文章)
2.部署tale.jar的环境,其实只需要安装java环境就好,这里因为是测试,就直接选用官方的tomcat镜像,也可以在centos镜像上挂载安装好的jdk,也可以直接用java镜像,这里我使用的tomcat镜像。
docker pull tomcat //一般是先docker search tomcat,然后选择好相应的版本
docker tag tomcat:latest 192.168.147.129:5000/tomcat //打tag
docker push 192.168.147.129:5000/tomcat //上传镜像到自己的本地仓库
3.接下来的步骤就是将Publish over SSH中的主机换成我本地的虚拟机,当构建成功后将jar包上传到我虚拟机的/home/wangkang/data目录下,然后利用docker启动tomcat镜像,挂载虚拟机的/home/wangkang/data目录到tomcat镜像的/opt/data目录下,分配8091的端口号给该镜像,然后执行java -jar /opt/data/tale/tale-latest.jar,命令如下:
docker run -it -d --name tale_test -p 8091:9000 -v /home/wangkang/data/:/opt/data/ tomcat:latest java -jar /opt/data/tale/tale-latest.jar
-d : 以服务的方式启动容器
--name:为容器命名,以后可以直接以docker start tale_test的方式启动该容器
-p 8091:9000 : 虚拟机的8091端口号映射容器内的9000端口号
-v :将虚拟机的/home/wangkang/data目录到tomcat镜像的/opt/data目录
java -jar /opt/data/tale/tale-latest.jar :在容器内的启动命令
以上命令是启动一个容器并执行相应的shell命令,最后本地输入网址jenkins:8091就能直接访问
ps:在配置publish over ssh插件的过程中遇到了一些麻烦,所以另外写了一篇文章记录自己的解决方案以及讲解下这个插件的配置,jenkins配置publish over ssh遇到的问题
jenkins中该插件的配置如下:
接下来是job中的配置,其他的保持不变,只需要更改构建后的配置即可,配置如图所示:
执行的shell命令是将tale_test容器重启,更新数据源,等同于docker restart tale_test命令
这里增加一个邮件通知的设置(我在系统设置中已经配置好了,不懂如何配置的童鞋参考我之前的文章),当失败或者不稳定的时候,就发邮件通知我们:
4.在浏览地址输入jenkins:8091即可访问(在windows上做了域名重定向)
以上基于docker部分算是实验成功了.当每次提交代码变更到github仓库时,会触发jenkins的job,重新打包编译部署到服务器上,服务器启动docker容器来运行该项目,该操作基本实现了java代码的自动化部署,如果你想做CI部分,那可以利用maven来实现该功能,以后实践的时候我再尝试.
七、一些想法
CI部分暂且不提,以这样方式来实现自动化部署java代码固然可以,但有其局限性,ssh只能访问这台服务器,也就是说你能做的操作只能在这台服务器上.这时如果有个需求,需要你直接部署到不同的服务器呢?虽然此时可以用ansible或者其他方式来实现,但是不推荐在服务器上既部署代码,又部署其他服务,以免相互影响。这时我突然想到jenkins的分布式部署,下一篇文章会基于这来实现该功能.
写着写着就到凌晨两点半了...当真是码字不易啊,哈哈!
如果对文章有疑问或者哪里不懂的请联系我,在力所能及的范围内帮助解答;如果文章有错误,也欢迎指出。
知乎:https://zhuanlan.zhihu.com/p/39289273