Jenkins持续集成企业实战
阅读目录:
Jenkins持续集成企业实战
1.1 目前主流网站部署的流程
1.2 Jenkins持续集成简介
1.3 Jenkins持续集成组件
1.4 Jenkins平台安装部署
1.5 Jenkins相关概念
1.6 Jenkins平台设置
1.7 Jenkins构建JOB工程
1.8 Jenkins自动化部署
1.9 Jenkins插件安装
1.10 Jenkins邮件配置
1.11 Jenkins多实例配置
1.12 Jenkins+Ansible高并发构建
Jenkins持续集成企业实战
构建企业自动化部署平台,可以大大的提升企业网站部署效率,企业生产环境每天需要更新各种系统,传统更网站的方法是使用Shell+Rsync实现网站代码备份、更新,更新完之后,运维人员手动发送邮件给测试人员、开发人员以及相关的业务人员,传统更新网站耗费大量的人力,同时偶尔由于误操作会出现细小问题。构建自动化部署平台变得迫在眉睫。
本章向读者介绍传统网站部署方法、企业主流部署方法、Jenkins持续集成简介、持续集成平台构建、Jenkins插件部署、Jenkins自动化部署网站、Jenkins多实例及Ansible+Jenkins批量自动部署等。
1.1 目前主流网站部署的流程
传统部署网站的方法对于单台或者几台服务器更新很容易,如果服务器规模超过百台或者千台,或者更新网站代码很频繁,手工更新就非常消耗时间成本。
基于主流的Hudson/Jenkins工具平台实现全自动网站部署、网站测试、网站回滚会大大的减轻网站部署的成本,Jenkins的前身为Hudson,Hduson主要用于商业版,Jenkins为开源免费版。
Jenkins是一个可扩展的持续集成引擎、框架,是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。而且Jenkins平台的安装和配置非常的容易,使用也非常简单。构建Jenkins平台可以解放如下人员的双手,如图:
- 开发人员,对于开发人员来说,只需负责网站代码的编写,不需要手动再对源码进行编译、打包、单元测试等工作,开发人员直接将写好的代码分支存放在SVN、GIT仓库即可。
- 运维人员,对于运维人员来说,使用Jenkins自动部署,可以减轻人工干预的错误率,同时解放运维人员繁杂的上传代码、手动备份、手动更新。
- 测试人员,对于测试人员来说,可以通过Jenkins进行代码测试、网站功能或者性能测试。
1.2 Jenkins持续集成简介
持续集成(Continuous Integration,CI|CD)是一种软件开发实践,对于提高软件开发效率并保障软件开发质量提供了理论基础,持续集成意义如下:
- 持续集成中的任何一个环节都是自动完成的,无需太多的人工干预,有利于减少重复过程以节省时间、费用和工作量;
- 持续集成保障了每个时间点上团队成员提交的代码是能成功集成的。换言之,任何时间点都能第一时间发现软件的集成问题,使任意时间发布可部署的软件成为了可能;
- 持续集成还能利于软件本身的发展趋势,这点在需求不明确或是频繁性变更的情景中尤其重要,持续集成的质量能帮助团队进行有效决策,同时建立团队对开发产品的信心。
1.3 Jenkins持续集成组件
- 自动构建过程JOB,JOB的功能主要是:获取SVN/GIT源码、自动编译、自动打包、部署分发和自动测试等;
- 源代码存储库,开发编写代码需上传至SVN、GIT代码库中,供Jenkins来获取;
- Jenkins持续集成服务器,用于部署Jenkins UI、存放JOB工程、各种插件、编译打包的数据等。
1.4 Jenkins平台安装部署
Jenkins官网免费获取Jenkins软件,官网地址为:http://mirrors.jenkins-ci.org/下载稳定的Jenkins版本。由于Jenkins是基于Java开发的一种持续集成工具,所以Jenkins服务器需安装JAVA JDK开发软件。Jenkins平台搭建步骤如下:
(1) Jenkins稳定版下载:
http://updates.jenkins-ci.org/download/war/1.651.2/jenkins.war |
(2) 官网下载JAVA JDK,并解压安装,代码如下:
tar -xzf jdk-7u25-linux-x64.tar.gz ;mkdir -p /usr/java/ ;mv jdk1.7.0_25/ /usr/java/ |
(3) 配置JAVA环境变量,/etc/profile配置文件中末尾加入如下代码:
export JAVA_HOME=/usr/java/jdk1.7.0_25 export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOMR/bin |
执行如下代码使其环境变量,并查看环境变量,命令如下:
source /etc/profile java --version |
(4) Tomcat JAVA容器配置
wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-6/v6.0.53/bin/apache-tomcat-6.0.53.tar.gz tar xzf apache-tomcat-6.0.53.tar.gz mv apache-tomcat-6.0.53 /usr/local/tomcat |
(5) Tomcat发布Jenkins,将Jenkins war拷贝至Tomcat默认发布目录,并使用jar工具解压,启动Tomcat服务即可,代码如下:
rm -rf /usr/local/tomcat/webapps/* mkdir -p /usr/local/tomcat/webapps/ROOT/ mv jenkins.war /usr/local/tomcat/webapps/ROOT/ cd /usr/local/tomcat/webapps/ROOT/ jar –xvf jenkins.war;rm -rf Jenkins.war sh /usr/local/tomcat/bin/startup.sh |
(6) 通过客户端浏览器访问Jenkins服务器IP地址,如图22-5所示:
图22-5 Jenkins自动部署平台
1.5 Jenkins相关概念
要熟练掌握Jenkins持续集成的配置、使用和管理,需要了解相关的概念,例如代码开发、编译、打包、构建等名称概念,常见的代码相关概念包括:MAKE、ANT、MAVEN、Eclipse、Jenkins等。
(1) Make编译工具
Make编译工具是Linux和Windows最原始的编译工具,在Linux下编译程序常用make,Windows下对应的工具为nmake。读取本地makefile文件,该文件决定了源文件之间的依赖关系,Make负责根据makefile文件去组织构建软件,负责指挥编译器如何编译,连接器如何连接,以及最后生成可用二进制的代码。
(2) Ant编译工具
Make工具在编译比较复杂的工程使用起来不方便,语法很难理解,延伸出Ant工具。Ant工具属于Apache基金会软件成员之一,是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发。
Ant构建文件是XML文件。每个构建文件定义一个唯一的项目(Project元素)。每个项目下可以定义很多目标元素,这些目标之间可以有依赖关系。
构建一个新的项目时,首先应该编写Ant构建文件。因为构建文件定义了构建过程,并为团队开发中每个人所使用。
Ant构建文件默认名为build.xml,也可以取其他的名字。只不过在运行的时候需把这个命名当作参数传给Ant。构建文件可以放在任何的位置,一般做法是放在项目顶层目录也即根目录,这样可以保持项目的简洁和清晰。
(3) Maven编译工具
Maven工具是对ant工具的进一步改进,在make工具中,如果我们要编译某些源文件,首先要安装编译器等工具。有时候需要不同版本的编译器,在java的编译器需要不同的各种包的支持,如果把每个包都下载下来,在makefile中进行配置制定,当需要的包非常多时,很难管理。
Maven与Ant类似,也是个构建(build)工具,它是如何调用各种不同的编译器连接器呢?使用Maven plugin (maven 插件),Maven项目对象模型POM (Project Object Model),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。
POM是Maven项目中的文件,使用XML表示,名称为pom.xml。在Maven中,当构建Project的时候,不仅仅是一堆包含代码的文件。还包含pom.xml配置文件,该文件包括Project与开发者有关的、缺陷跟踪系统、组织与许可、项目的URL、项目依赖、以及其他配置。
在基于Maven构建编译时,project可以什么都没有,甚至没有代码,但是必须包含pom.xml文件。由于 Maven 的缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目。
由于 Maven 的面向项目的方法,许多 Apache Jakarta 项目发文时使用 Maven,而且公司项目采用 Maven 的比例在持续增长。
(4) Jenkins框架工具
Maven可以实现对软件代码进行编译、打包、测试,功能已经很强大了,那还需要Jenkins做什么呢?Maven可以控制编译,控制连接,可以生成各种报告,可以进行代码测试。
但是默认不能控制完整的流程? 没有顺序定义,是先编译还是先连接?先进行代码测试,还是先生成报告?可以使用脚本来对Maven进行控制,实现这些流程的控制。
(5) Eclipse工具
Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK),主要用于开发者开发网站代码。
1.6 Jenkins平台设置
Jenkins持续基础平台部署完毕,需要进行简单配置,例如配置JAVA路径、安装Maven、指定SVN、GIT仓库地址等,如下为JAVA路径和Maven设置步骤:
(1) Jenkins服务器安装Maven:
wget tar -xzf apache-maven-3.3.9-bin.tar.gz mv apache-maven-3.3.9 /usr/maven/ |
(2) Jenkins系统设置环境变量,如图22-6(a)、22-6(b)所示:
图22-6(a) Jenkins系统设置
图22-6(b) Jenkins系统设置
(3) Jenkins系统设置完毕,需创建job工程:
Jenkins平台首页à创建一个新任务填入Item名称构建一个maven项目单击OK,如图22-7所示:
图22-7 Jenkins创建Jenkins JOB工程
(4) 创建完JOB任务,需对其任务进行配置,如图22-8所示:
图22-8 Jenkins配置JOB工程
(5) 单击www.jfedu.net工程名à配置进入JOB工程详细配置à源码管理选择Subversion配置SVN仓库地址,如果报错需要输入SVN用户名和密码,如图22-9所示:
图22-9 Jenkins配置SVN仓库地址
源码管理,SVN代码迁出参数详解如下:
Respository url 配置SVN仓库地址; Local module directory 存储SVN源码的路径; Ignore externals option 忽略额外参数; Check-out Strategy 代码检出策略; Repository browser 仓库浏览器,默认Auto; add more locations 源码管理,允许下载多个地址的代码; Repository depth 获取SVN源码的目录深度,默认为infinity; empty: 不检出项目的任何文件,files: 所有文件,immediates:目录第一级,infinity:整个目录所有文件。 |
(6) 配置Maven编译参数,Build Goals and options输入“clean install -Dmaven.test.skip=true”,此处为maven自动编译、打包并跳过单元测试选项,如图22-10所示。
图22-10 Jenkins配置MAVEN编译参数
Maven工具常用命令如下:
mvn clean 打包清理(删除target目录内容); mvn compile 编译项目; mvn package 打包发布; mvn package -Dmaven.test.skip=ture 打包时跳过测试。 |
通过以上步骤的配置步骤,即完成了JOB工程的创建。
1.7 Jenkins构建JOB工程
Jenkins JOB工程创建完毕,如下直接运行构建,Jenkins将从SVN仓库获取SVN代码,然后通过Maven编译、打包,并最终生成可以使用的war包即可。操作步骤如下:
(1) 单击www.jfedu.net工程名,进入JOB工程详细配置界面,单击“立即构建”,如图22-11所示:
图22-11 Jenkins JOB工程配置界面
(2) 查看Build History,单击最新一次百分比滚动条任务,如图22-12所示:
图22-12 Jenkins JOB工程Build界面
(3) 进入JOB工程编译详细页面,单击“Console Output”,如图22-13所示:
图22-13 Jenkins JOB工程Console Output界面
(4) 查看Jenkins构建实时日志,如图22-14(a)、22-14(b)所示:
图22-14(a) Jenkins JOB工程编译控制台
图22-14(b) Jenkins JOB工程编译控制台
控制台日志打印“Finished: SUCCESS”,则表示Jenkins持续集成构建完成,会在Jenkins服务器目录www.jfedu.net工程名目录下生产网站可用的war文件,将该war包部署至其他服务器即可,war路径为:/root/.jenkins/workspace/www.jfedu.net/target/edu.war。
至此,Jenkins持续集成平台自动构建软件完成,该步骤只是生成了war包,并没有实现自动将该war包部署至其他服务器,如果要自动部署需要基于Jenkins插件或者基于Shell、Python等自动化部署脚本。
1.8 Jenkins自动化部署
如上通过手动构建Jenkins JOB工程,自动编译、打包生成war包,并不能实现自动部署,如需要实现自动部署可以基于自动部署插件或者Shell脚本、Python脚本等。
如下以Shell脚本实现Jenkins自动部署war至其他多台服务器,并自动启动Tomcat,实现最终WEB浏览器访问。Jenkins自动部署完整操作步骤如下:
(1) 单击www.jfedu.net工程名à配置à构建后操作Add post-build step Archive the artifacts 用于存档的文件à输入:**/target/*.war,该选项主要用于Jenkins编译后会将war包存档一份到target目录,该文件可以通过Jenkins Tomcat的HTTP端口访问,如图22-15(a)、22-15(b)所示:
图22-15(a) Jenkins JOB工程编译控制台
图22-15(b)Jenkins JOB工程编译控制台
(2) Jenkins构建完毕,访问Jenkins war存档的文件,URL地址如下:
http://139.224.227.121:7001/job/www.jfedu.net/lastSuccessfulBuild/artifact/target/edu.war |
(3) 选择Add post-build step Execute shell Command输入如下代码,实现Jenkins edu.war包自动部署,如下为139.199.228.59客户端单台服务器部署edu.war,如果多台可以使用ip.txt列表,将IP加入至ip.txt,通过for循环实现批量部署,如图22-16(a)、22-16(b)所示:
cp /root/.jenkins/workspace/www.jfedu.net/target/edu.war /root/.jenkins/jobs/www.jfedu.net/builds/lastSuccessfulBuild/archive/target/ ssh root@ 139.199.228.59 'bash -x -s' < /data/sh/auto_deploy.sh #for I in `cat ip.txt`;do ssh root@${I} 'bash -x -s' < /data/sh/auto_deploy.sh ;done |
图22-16(a)Jenkins JOB构建完毕执行Shell
图22-16(b)Jenkins JOB构建完毕执行Shell
(4) 基于Jenkins将edu.war自动部署至139.199.228.59服务器Tomcat发布目录,需提前配置登录远程客户端免秘钥,免秘钥配置首先在Jenkins服务器执行ssh-keygen命令,然后按Enter键生成公钥和私钥;然后将公钥id_rsa.pub拷贝至客户端/root/.ssh/目录,并重命名为authorized_keys,操作命令如下:
ssh-keygen -t rsa -P ' ' -f /root/.ssh/id_rsa ssh-copy-id -i /root/.ssh/id_rsa.pub 139.199.228.59 |
(5) Shell脚本需放在Jenkins服务器/data/sh/,无需放在客户端,Shell脚本内容如下:
#!/bin/bash #Auto deploy Tomcat for jenkins #By author jfedu.net 2017 export JAVA_HOME=/usr/java/jdk1.6.0_25 TOMCAT_PID=`/usr/sbin/lsof -n -P -t -i :8081` TOMCAT_DIR="/usr/local/tomcat/" FILES="edu.war" DES_DIR="/usr/local/tomcat/webapps/ROOT/" DES_URL="http://139.224.227.121:7001/job/www.jfedu.net/lastSuccessfulBuild/artifact/target/" BAK_DIR="/export/backup/`date +%Y%m%d-%H%M`" [ -n "$TOMCAT_PID" ] && kill -9 $TOMCAT_PID cd $DES_DIR rm -rf $FILES mkdir -p $BAK_DIR;\cp -a $DES_DIR/* $BAK_DIR/ rm -rf $DES_DIR/* wget $DES_URL/$FILES /usr/java/jdk1.6.0_25/bin/jar -xvf $FILES #################### cd $TOMCAT_DIR;rm -rf work /bin/sh $TOMCAT_DIR/bin/start.sh sleep 10 tail -n 50 $TOMCAT_DIR/logs/catalina.out |
如上通过Shell+For循环可以实现网站简单的异步部署,如果需要将Jenkins edu.war包批量快速部署至100台、500台服务器,该如何去实现呢?后续小结会讲解到。
1.9 Jenkins插件安装
Jenkins最大的功能莫过于插件丰富,基于各种插件可以满足各项需求,Jenkins本身是一个框架,真正发挥作用的是各种插件。Jenkins默认自带很多插件,如果需添加新插件,可以在Jenkins平台主页面进行操作,操作步骤如下:
Jenkins平台首页à系统管理à管理插件à可选插件à搜索email-ext-plugin插件选择并安装,如果没有该插件,则需单击“高级”,手动上传插件并安装,操作步骤如图22-17所示:
图22-17 Jenkins 添加新插件
访问Jenkins官网手动下载插件,将下载的插件传到服务器Jenkins根目录(/root、)下的plugins目录,即/root/.jenkins/plugins目录,重启jenkins即可。Jenkins插件下载地址:https://wiki.jenkins-ci.org/display/JENKINS/Plugins。安装Email-ext-Plugin邮件插件的方法如下:
(1) 下载Email-ext和Token-macro、Email-template,可以搜索某个插件,输入插件名称,如图22-18所示:
图22-18 Jenkins 下载新插件
(2) Email-ext和Token-macro、Email-template插件下载URL如下:
https://wiki.jenkins-ci.org/display/JENKINS/Email-ext+plugin https://wiki.jenkins-ci.org/display/JENKINS/Token+Macro+Plugin https://wiki.jenkins-ci.org/display/JENKINS/Email-ext+Template+Plugin |
(3) 安装Token-macro插件,如图22-19(a)、22-19(b)所示:
图22-19(a) Jenkins Token-macro插件安装
图22-19(b) Jenkins Token-macro插件安装
(4) 安装email-ext插件,如图22-20所示:
图22-20 Jenkins email-ext插件安装
(5) Email-ext、Token-macro和Email-template插件安装完毕,如图22-21所示:
图22-21 Jenkins 插件安装完毕
(6) Email插件安装完毕, Jenkins主界面系统管理系统设置会出现选项Extended E-mail Notification,则表示Jenkins Email邮件插件安装完毕,如图22-22所示:
图22-22 Jenkins Email邮件插件
如需安装GIT、Publish Over插件或者安装装Jenkins其他任意插件,方法与Email插件安装方法一致。
1.10 Jenkins邮件配置
如上Jenkins持续集成配置完毕,可以进行网站代码的自动更新、部署、升级及回滚操作,通过控制台信息可以查看每个JOB工程构建的状态。
如果网站项目很多,人工去查看状态就变得不可取,可以借助Jenkins Email插件实现网站构建完成,自动发送邮件给相应的开发人员、运维人员或者测试人员。Jenkins发送邮件,需安装Email邮件插件,Email-ext、Token-macro和Email-template,Jenkins Email邮件配置常见参数:
SMTP server 邮件服务器地址; Default Content Type 内容展现的格式,一般选择HTML; Default Recipients 默认收件人; Use SMTP Authentication 使用SMTP身份验证; User Name 邮件发送账户的用户名; Password 邮件发送账户的密码; SMTP port SMTP服务器端口。 |
Jenkins Email邮件配置方法如下:
(1) 设置Jenkins邮件发送者,Jenkins平台首页à系统管理à系统设置àJenkins Locationà填写Jenkins URL与系统管理员邮件地址,如图22-23(a)、22-23(b)所示:
图22-23(a) Jenkins Email邮件配置
图22-23(b) Jenkins Email邮件配置
(2) 设置发送邮件的SMTP服务器、邮箱后缀,发送类型html、接收者或者抄送者,单击Jenkins平台首页à系统管理系统设置 Extended E-mail Notification,填写如图22-24所示的选项,包括SMTP server、默认后缀、使用SMTP认证、Default Recipients邮件接收人等信息:
图22-24 Jenkins Email邮件配置
(3) 设置邮件的标题Default Subject内容如下:
构建通知:$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS |
(4) 设置发送邮件的内容,Default Content内容如下:
<hr/> <h3>(本邮件是程序自动下发的,请勿回复!)</h3><hr/> 项目名称:$PROJECT_NAME<br/><hr/> 构建编号:$BUILD_NUMBER<br/><hr/> 构建状态:$BUILD_STATUS<br/><hr/> 触发原因:${CAUSE}<br/><hr/> 构建日志地址:<a href="${BUILD_URL}console">${BUILD_URL}console</a><br/><hr/> 构建地址:<a href="$BUILD_URL">$BUILD_URL</a><br/><hr/> 变更集:${JELLY_SCRIPT,template="html"}<br/> <hr/> |
(5) 每个JOB工程邮件设置,单击www.jfedu.net JOB名称à配置à构建后操作à选择Editable Email Notification,如下信息保持默认,出现如图22-25所示:
图22-25 Jenkins EmailJOB邮件模板配置
(6) 选择Advanced Settings,设置Trigger阀值,选择发送邮件的触发器,默认触发器包括:第一次构建、构建失败、总是发送邮件、构建成功等,一般选择always总是发送邮件,发送给developers组,如图22-26所示。
图22-26 Jenkins Email 触发器设置
(7) Jenkins构建邮件验证,如图22-27(a)、22-27(b)、22-27(c)所示:
图22-27(a) Jenkins构建报错触发邮件
图22-27(b) Jenkins Email邮件信息
图22-27(c) Jenkins Email邮件信息
1.11 Jenkins多实例配置
单台Jenkins服务器可以满足企业测试环境及生产环境使用Jenkins自动部署+测试平台,如果每天更新发布多个WEB网站,Jenkins需要同时处理很多的任务。
基于Jenkins分布式,也即多Slave方式可以缓解Jenkins服务器的压力,Jenkins多实例架构如图22-28所示,可以在Windows、Linux、MAC等操作系统上执行Slave。
图22-28 Jenkins Slave架构图
Jenkins多Slave原理是将原本在Jenkins Master端的构建项目分配给Slave端去执行,Jenkins Master分配任务时,Jenkins Master端通过SSH远程Slave,在Slave端启动slave.jar程序,通过Slave.jar实现对网站工程的构建编译以及自动部署。所以在Slave端服务器必须安装Java JDK环境来执行Master端分配的构建任务。配置多Slave服务器方法和步骤如下:
(1) 在Slave服务器,创建远程执行Jenkins任务的用户,名称为jenkins,Jenkins工作目录/home/Jenkins,Jenkins Master免秘钥登录Slave服务器或者通过用户名和密码登录Slave;
(2) Slave服务器安装JAVA JDK版本,并将其软件路径加入系统环境变量。
(3) Jenkins master端平台添加管理节点,系统管理à管理节点à新建节点à输入节点名称,分别如图22-29(a)、22-29(b)、22-29(c)所示:
图22-29(a) Jenkins Slave配置
图22-29(b) Jenkins Slave配置
图22-29(c) Jenkins Slave配置
(4) 配置www_slave节点,指定其Jenkins编译工作目录,设置IP地址,Credentials Add添加登录Slave用户名和密码,如图22-30(a)、22-30(b)所示:
图22-30(a) Jenkins Slave配置
图22-30(b) Jenkins Slave配置
(5) Jenkins Slave配置完毕,查看SLAVE状态如如图22-31所示:
图22-31 Jenkins Slave状态信息
(6) 单击www_slave节点,然后选择launch salve agent,单击测试Slave Agent是否正常工作,如图22-32所示:
图22-32 Jenkins Slave Agent测试
(7) 出现如图22-33(a)、22-33(b)所示,即证明Slave添加成功:
图22-33(a) Jenkins Slave测试
图22-33(b) Jenkins Slave测试
(8) 如上配置完毕,Jenkins-master通过ssh方式来启动slave的slave.jar脚本,java –jar slave.jar,Slave等待master端的任务分配,单击www.jfedu.net,然后选择立即构建,如图22-34所示:
图22-34 Jenkins Slave构建任务
(9) Jenkins+Slave配置完毕后,如果同时运行多个任务,会发现只会运行一个任务,另外的任务在等待,那需要怎么调整呢,需要配置JOB工程勾选“在必要的时候并发构建”即可,如图22-35(a)、22-35(b)所示:
图22-35(a) Jenkins Slave构建多任务
图22-35(b) Jenkins Slave构建多任务
1.12 Jenkins+Ansible高并发构建
Jenkins自动部署基于Shell+For循环方式部署10台以下的JAVA客户端服务器,效率是可以接受的,但是如果是大规模服务器需要部署或者更新网站,通过for循环串行执行效率会大打折扣,所以需要考虑到并行机制。
Ansible是一款极为灵活的开源工具套件,能够大大简化Unix管理员的自动化配置管理与流程控制方式。它利用推送方式对客户系统加以配置,这样所有工作都可在主服务器端完成。使用Ansible+Jenkins架构方式实现网站自动部署,满足上百台、千台服务器的网站部署和更新。
Ansible服务需要部署在Jenkins服务器,客户端服务器无需安装Ansible。Ansible基于SSH工作,所以需提前做好免秘钥或者通过sudo用户远程更新网站。此处省略Ansible安装,Ansible相关知识请参考本书Ansible章节配置。
Ansible自动部署网站,有两种方法,一种是基于Ansible远程执行Shell脚本,另外一种是Ansible编写Playbook剧本,实现网站自动部署。如下为Ansible+Shell脚本方式自动部署网站方法:
(1) Jenkins服务器安装Ansible软件,Red Hat、CentOS操作系统可以直接基于YUM工具自动安装Ansible,CentOS6.x或者CentOS7.x安装前,需先安装epel扩展源,代码如下:
rpm -Uvh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm yum install epel-release -y yum install ansible -y |
(2) 添加客户端服务器,在/etc/ansible/hosts中添加需要部署的客户端IP列表,如下代码:
[www_jfedu] 139.199.228.59 139.199.228.60 139.199.228.61 139.199.228.62 |
(3) Jenkins平台首页à单击www.jfedu.net项目à选择配置à单击Post StepsàExecute shellàCommandà输入如下代码,www_jfedu为Ansible Hosts组模块名称:
cp /root/.jenkins/workspace/www.jfedu.net/target/edu.war /root/.jenkins/jobs/www.jfedu.net/builds/lastSuccessfulBuild/archive/target/ ansible www_jfedu -m copy -a "src=/data/sh/auto_deploy.sh dest=/tmp/" ansible www_jfedu -m shell -a "cd /tmp ;/bin/bash auto_deploy.sh" |
(4) Jenkins服务器端/data/sh/auto_deploy.sh Shell脚本内容如下:
#!/bin/bash #Auto deploy Tomcat for jenkins #By author jfedu.net 2017 export JAVA_HOME=/usr/java/jdk1.6.0_25 TOMCAT_PID=`/usr/sbin/lsof -n -P -t -i :8081` TOMCAT_DIR="/usr/local/tomcat/" FILES="edu.war" DES_DIR="/usr/local/tomcat/webapps/ROOT/" DES_URL="http://139.224.227.121:7001/job/www.jfedu.net/lastSuccessfulBuild/artifact/target/" BAK_DIR="/export/backup/`date +%Y%m%d-%H%M`" [ -n "$TOMCAT_PID" ] && kill -9 $TOMCAT_PID cd $DES_DIR rm -rf $FILES mkdir -p $BAK_DIR;\cp -a $DES_DIR/* $BAK_DIR/ rm -rf $DES_DIR/* wget $DES_URL/$FILES /usr/java/jdk1.6.0_25/bin/jar -xvf $FILES #################### cd $TOMCAT_DIR;rm -rf work /bin/sh $TOMCAT_DIR/bin/start.sh sleep 10 tail -n 50 $TOMCAT_DIR/logs/catalina.out |
(5) 单击www.jfedu.net构建任务,查看控制台信息,如图22-36(a)、22-36(b)、22-36(c)所示:
图22-36(a) Jenkins Ansible自动部署
图22-36(b) Jenkins Ansible自动部署