MENU

linux 下jenkins+maven+ansible自动部署配置

2018 年 08 月 20 日 • 应用服务器

emmmm,大概两年前就做过jenkins+svn+maven自动部署的事情,一直在本地用,而且那时候也写了一篇文档,然后没过多久给删了,最近需要在云上部署一套,由于好长时间没搞了,版本更新有点快,安装的时候提示该jenkins实例似乎已离线,装好了登陆后又白屏,啥都不显示,执行ansibleplaybook提示Permission denied,root家目录特别大,几乎把系统盘占满了,各种各种问题,重新总结一下吧,从安装开始。

jenkins下载安装

先说一下我这里的系统环境,阿里云服务器,centos7.5,Oracle jdk1.8,安装这一块的话我不是用yum方式去装的,而是下载最新的war包,放到了tomcat里面,tomcat版本8.5,想用yum装也很简单,三条命令搞定,如下。

[root@jenkins ~]# wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo
[root@jenkins ~]# rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key
[root@jenkins ~]# yum -y install jenkins

我是直接下载的war包,扔到了tomcatwebapps下面

[root@jenkins ~]# cd /data/apache-tomcat-8.5.15/webapps/
[root@jenkins /data/apache-tomcat-8.5.15/webapps]# wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war

然后设置一下JENKINS_HOME,如果不设置的话默认是在运行用户的家目录,打的包下载的依赖也很大,之前系统盘快被占满这是第一个原因。

[root@jenkins ~]# cat >>/etc/profile<<OEF
> export JENKINS_HOME=/data/.jenkins
> OEF
[root@jenkins ~]# source /etc/profile
[root@jenkins ~]# echo $JENKINS_HOME
/data/.jenkins

maven 安装配置

maven这块问一下开发的,版本用的是多少,然后去下载对应的版本即可,我们用的是3.3.9,点这里去找自行下载吧。

[root@jenkins ~]# cd /data/
[root@jenkins /data]# wget https://archive.apache.org/dist/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
[root@jenkins /data]# tar zxf apache-maven-3.3.9-bin.tar.gz
[root@jenkins /data]# cat >>/etc/profile<<OEF
> export MAVEN_HOME=/data/apache-maven-3.3.9
> export PATH=\$JAVA_HOME/bin:\$JAVA_HOME/jre/bin:\$MAVEN_HOME/bin:\$PATH
> OEF
[root@jenkins /data]# source /etc/profile
[root@jenkins /data]# mvn -version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: /data/apache-maven-3.3.9
Java version: 1.8.0_171, vendor: Oracle Corporation
Java home: /usr/local/jdk1.8.0_171/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-862.11.6.el7.x86_64", arch: "amd64", family: "unix"

能正确看到版本号即可,然后改一下依赖下载的保存位置,不配置的话是在当前用户的家目录下,而且也特别大,之前系统盘快满了这是第二个原因,所以现在改一下。/data/是我数据盘挂载的目录,所以放到这里即可。

[root@jenkins ~]# mkdir /data/apache-maven-3.3.9/repository
[root@jenkins ~]# vim /data/apache-maven-3.3.9/conf/settings.xml

打开配置文件后将localRepository的路径改一下即可,上下注释去掉,这个最好也去咨询一下开发,一般公司都会有自己的私服,怎么设置我也搞不定,我的settings.xml是开发的直接发给我的,我就直接用了,文件内容我就不贴了。

  <localRepository>/data/apache-maven-3.3.9/repository</localRepository>

我们自己改的话就是这里,剩下的不用动,保存退出,现在jenkinsmaven都安装完了,可以启动jenkins了,tomcat内存这一块的话看你服务器自行分配一下吧。

[root@jenkins ~]# ln -s /data/apache-tomcat-8.5.15/bin/catalina.sh /usr/local/sbin/tomcat
[root@jenkins ~]# tomcat start

jenkins配置阶段

如果没什么意外情况打开服务器IP:tomcat端口/jenkins就可以正常访问到了,然后根据提示查看密码贴进去点击继续即可,常理来说下一步该装插件了,然后提示了该Jenkins实例似乎已离线。大概是酱紫。

解决办法,改一下/data/.jenkins/updates/default.json文件,第一个把google改成baidu,重启jenkins就行了,然后装一下推荐的插件就可以了,可能会慢一点,再然后是创建用户,直接以admin继续就好,密码就是你之前复制的那一串。

没意外的话开始白屏了,如果白屏了,先重启一下jenkins试试,如果不行,看一下这里。然后开始装插件,svn的插件已经装了,也就是Subversion Plug-in 还需要装一下Maven Integration plugin&Ansible plugin&Publish Over SSH,在系统管理→管理插件里面安装就可以了,添加完了重启一下jenkins。

然后点开系统管理,全局工具配置,设置一下jdk,Maven,ansible的位置即可。

最后点击save即可,然后就可以打包了。

打包

主页面新建任务,输入一个任务名称,再点击构建一个maven项目,确定,主要的就是源码管理,写上项目的SVN地址,添加一个认证用户,也就是svn的用户名密码,如果不太清楚项目地址是啥就去找开发,填进去就行了。

再下来就是pom文件这里,如果不了解还是要去咨询开发,总之打包这一块需要开发协助一下,有兴趣的话可以去了解一下maven的一些参数,点这里

我的已经测试过了,包可以打出来,仔细看控制台输出,可以看到打出来的包放在了哪里,确定能把包打出来就可以进行构建后操作了。

构建后操作

因为测试的服务器偏多,之前都是用ansible去批量部署环境的,最后发现jenkins有插件可以支持playbook,这个还是蛮不错的,如果不了解ansible可以去看一下这里,总之是先把你的playbook写了,测试,手动执行可以正常部署项目,接下来就可以做构建后操作了。

构建成功后执行playbook,指定一下playbook的路径和ansible的hosts位置,认证这块就不用去管了,服务器上都已经做好了,最后开始构建测试即可,最终结果。

文章开头提过执行playbook提示Permission denied,原因是这个插件貌似不支持域名,说白了我就是在/etc/ansible/hosts组里主机写的都是域名,而不是IP,在/etc/hosts文件里加的解析,手动执行playbook正常,但是jenkins去调用就不行了,大概是酱紫

最后换成IP就可以了,我试着搞了一下没有解决,只能暂时用IP了。

定时构建

这个比较简单了,项目配置里面有个构建触发器,勾上定时构建,详细的看一下这里吧,到这里一个最简单的jenkins+svn+maven+ansible自动构建就算完成了,多个项目都添加一下吧,只麻烦这一次,以后就很方便了,下面加一下简单的回滚功能。

回滚功能

回滚这里的话,个人感觉最靠谱的就是恢复上个版本的备份,我在每次更新版本的时候,都会备份当前版本到指定目录,回滚的话就是将之前的恢复一下,实现方法也很简单,得写两套playbook,一套发布的,一套回滚的,playbooke内容就不贴了,直接点开项目配置,找到参数化构建过程,打钩

名称这里的话随意,我用的是Status,就是个变量,Deploy=部署,rollback=回滚,这个两个选项等于shell里的传参$1,这个不多BB了。
下来就是构建后步骤现在就要改改了,需要去执行shell,判断一下Status变量传过来的参数是什么,然后去执行对应的playbook,使用shell的case语句就行了,这个也不多BB了,我的大概是这样。

case $Status in
     Deploy)
     echo "开始版本发布"
     /bin/ansible-playbook /root/ansible/playbook/Recharge-admin.deploy.yml
     ;;
     Rollback)
     echo "开始版本回滚,回滚到上一个版本"
     /bin/ansible-playbook /root/ansible/playbook/Recharge-admin.rollback.yml
     ;;
  *)
esac

保存后自动返回上一级,会发现立即构建不见了,出现一个Build with Parameters点开后是这样的。

选择要部署还是要回滚,选择完成之后开始构建即可。
但是这样做有个问题,因为是构建后操作,构建完成了才到执行shell这一步,构建过程纯属是浪费时间,因为我直接恢复的是备份包,没有去重新打包,所以我改了一下,如下。
Pre Steps执行shell命令

case $Status in
     Rollback)
     echo "开始版本回退,回退到上一个版本"
     /bin/ansible-playbook /root/ansible/playbook/Recharge-admin.rollback.yml
     exit 1
     ;;
  *)
esac

Post Steps执行shell命令

case $Status in
     Deploy)
     echo "开始版本发布"
     /bin/ansible-playbook /root/lmhd-boot-mall-admin.deploy.yml
     ;;
  *)
esac

构建前加了个判断,如果是Rollback就直接回滚了,又加了exit 1,这个啥意思也不用多BB了,如果返回的是0,就开始向下走了,也就是开始构建了,所以执行完playbook强制退了出来,想要的结果是实现了,不构建直接回滚,但是jenkins会提示FAILURE,大概这样子。。。

这个就比较尴尬了,现在还是懵逼状态不知道怎么去解决

最后编辑于: 2018 年 12 月 10 日
返回文章列表 文章二维码 打赏
本页链接的二维码
打赏二维码