Jenkins可持续集成配置说明
1、前言
jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。
2、下载及运行
从官网下载最新的war包:https://jenkins.io/index.html
将下载下来的war丢到tomcat的webapps下面,启动tomcat即可食用。
3、jenkins的一些系统配置
A、系统编码格式的设置
当我们配置一个job实现我们的项目自动化构建集成后,每次触发构建,控制台会输出所有构建的信息,如果里面有中文,可能会出现乱码的情况。所以需要设置一下系统编码方式:
点击主界面左边的【系统管理】->【系统设置】
在全局属性下面,新增一条key-value:LANG=zh_CN.UTF-8
后台进程保持:BUILD_ID=allow_to_run_as_daemon
B、git插件配置
当我们需要配置GIT源码仓库时,需要在本机安装git。否则jenkins执行不了git命令取不到github的代码。安装git可以在线安装也可以到官网下载安装包。安装成功后即可。
C、maven安装
当我们项目是用maven构建的时候,我们需要在本机安装maven,从官网下载一个maven安装包,解压到指定目录,然后在jenkins的【系统管理】->【Global Tool Configuration】里面的Maven配置,只需要配置MAVEN_HOME指向我们刚下载解压的目录即可
D、当我们构建项目时,需要编译代码,这时需要安装jdk,一般新系统都只自带了jre,如果不安装jdk,构建的时候会报错,提示使用的是jre而不是jdk,这时我们就需要在本机安装jdk,并在jenkins的【系统管理】->【Global Tool Configuration】里面的jdk安装配置。设置我们的java_home即可。
到此,我们自动化构建项目所依赖的环境已经全部配置好,下面我们就创建实例来实现我们的自动化集成部署
4、全量版本实例job的配置说明
运行tomcat后,在浏览器中打开:http://ip:port/jenkins
界面会出现一系列的安装指引,类似安装windows系统初始化一样,根据提示输入指定信息即可,无需要特别注意的地方。指引结束后,跳转到jenkins主界面:
初次使用,界面元素还是挺多的,下面我们只介绍创建一个job实现我们的自动化集成部署的例子。
A、 创建job
点击主界面左上角的【新建】,创建一个【构建一个自由风格的项目】
在下图的项目配置中我们只需要配置源码管理,及构建触发器和构建三点:
源码管理,通常我们使用两种:SVN和GIT做我们的源代码版本控制
B、GIT源码配置
在Repository URL中配置我们GitHub的项目地址如:https://github.com/xqtt29/Demo.git
在Credentials中点击Add按钮新增一组我们有访问github权限的用户名和密码,只需要填写username和password两个值即可:
配置完这两个就OK了。
C、SVN源码配置
同样在Repository URL中配置我们SVN的项目地址
在Credentials中点击Add按钮新增一组我们有访问github权限的用户名和密码,同GIT配置操作类似
D、构建触发器配置
在Poll SCM中配置我们的定时器如:H/2 * * * *
表示每隔两分钟从github或者svn服务器取一次最新代码,如果有新代码,就会触发后面的构建操作。
E、构建配置
通常我们项目都是用maven构建的,在这里我们选择Invoke top-level Maven targets
然后在配置中的Goals填写我们要构建项目的指令,例如:install
构建后,如果成功了,会在工程下面生成一个war包,jenkins默认的工作目录在:
/root/.jenkins/workspace下面
如果要实现自动部署,接下来我们需要把war包copy到我们的tomcat的webapps下面,tomcat会自动解压部署。下面介绍一个简单且粗暴的方法:
再增加一个构建步骤,选择Execute shell,在命令窗口中我们写三条命令:
cp target/Demo-0.0.1.war /usr/local/tomcat/webapps/Demo.war
rm -rf /usr/local/tomcat/webapps/Demo
docker commit ed69e9e677a7 jenkins:2.0
第一条命令,将构建的war包复制到我们的tomcat的webapps目录下。
第二条命令,将webapps目录中原来部署的项目目录强制删除即可。
第三条命令,将容器重新打成镜像,镜像中tomcat的webapps项目代码已经由第一条命令更新上传了,所以这里打的镜像就是集成上线的镜像了。
这些构建步骤只是介绍大致的自动化构建并生成docker镜像的思路,具体操作需要细化。
5、增量版本实例job的配置说明
增量版本的自动化集成部署以我们目前开发版本提交的流程为原型,开发人员将自己的增量源代码版本打成zip包提交到配置库(svn或者git),jenkins定时去配置库取得需要部署的增量版本zip包,构建的过程就是将zip包拷贝到docker-容器中去并执行容器中的shell脚本,容器中的shell脚本执行的是将zip包全部解压并拷贝到tomcat的webapps中的项目工程路径下,相同文件覆盖会自动以时间缀备注源文件。然后重启docker容器,即完成本次增量版本的部署。
利用jenkins实现增量版本的自动化集成部署,可以有效的提高开发测试环境的项目工程部署的效率,减少测试人员在部署项目工程中的人工成本,让测试人员专注于项目的功能点测试。
A、创建job
点击主界面左上角的【新建】,创建一个【构建一个自由风格的项目】
在下图的项目配置中我们只需要配置源码管理,及构建触发器和构建三点:
增量版本我们以svn源码库为例,git源码库原理一样。
B、SVN源码配置及增量版本的规范
a、SVN源码库配置
在Repository URL中配置我们SVN的项目地址
在Credentials中点击Add按钮新增一组我们有访问github权限的用户名和密码,同GIT配置操作类似。
源代码配置库地址后面加上@HEAD,表示每次都取最新版本如:
http://172.16.168.111:8000/svn/DemoIncrement@HEAD
下方提示红色错误信息,可忽略,这时的jenkins检测不是很准确,例如网络是用的代理环境,这里都是会校验不通过的,具体错误信息我们只看构建过程的输出日志信息。
b、增量版本规范说明
要实时系统自动化部署增量版本包,就必须规范开发人员提交的增量版本zip包的规范:
1, zip包中的根目录必须以项目名称开始,如目录层次:ecb/com/chinacreator/****
这样所有增量版本zip包解压出来的源代码相对路径就都是以项目名称为准。如果出现不同的相对路径,不仅增加系统解压合并版本的复杂度,也对目前测试人员手工部署增量版本时不停的cd到指定的相对目录增加部署的人工操作成本。
2, zip包命名必须以时间缀方式记录版本先后顺序,如版本名称:
V1.0[20161219-001]ecb.zip
V1.0[20161219-002]ecb.zip
这样可以避免不同开发人员提交同一个源文件时,会出现代码被覆盖的情况。系统总是会以最新的源代码覆盖老的源代码部署方式进行。
C、构建触发器配置
在Poll SCM中配置我们的定时器如:H/2 * * * *
表示每隔两分钟从github或者svn服务器取一次最新代码,如果有新代码,就会触发后面的构建操作。
D、构建配置
构建的代码如下:
sfiles=`ls /usr/local/node1`
#这个目录是我们主机与docker容器的共享目录,现在我们的docker容器是低于1.8版本的,所以不能直接将主机上的文件拷贝到容器中,需要做目录映射
for sfile in $sfiles
do
rm -rf /usr/local/node1/$sfile
done
#以上代码只是将工作目录清空,保持不会存在历史遗留文件
files=`ls`
for file in $files
do
cp $file /usr/local/node1/$file
done
#以上代码将我们取得的增量版本zip包全部拷贝到我们的工作目录
pid=`docker inspect -f {{.State.Pid}} 4b1969c1678c`
nsenter --target $pid --mount --uts --ipc --net --pid '/usr/local/workscript/1.sh'
#以上代码是进入我们的docker容器并执行容器中的shell脚本进行增量部署操作
docker restart 4b1969c1678c
#重启docker容器,将增量版本生效(4b1969c1678c是容器id)
E、容器中的shell脚本执行增量版本的部署
以上构建代码中docker容器的shell脚本代码如下:
#~/bin/bash
set -o errexit
#与主机的映射目录
workpath="/usr/local/work/"
#tomcat的项目工程目录
despath="/usr/local/tomcat/webapps/"
path=`ls $workpath`
#遍历映射目录,将所有的增量版本zip包解压
for file in $path
do
ff=$workpath${file}
echo "正在解压版本:"$ff
unzip -o $ff -d $workpath
rm -rf $ff
done
nowpath=`ls $workpath`
#如果没有增量版本文件就抛出异常,通知jenkins本次构建失败
if [ "${#nowpath}" -eq "0" ]
then
echo "未发现上线版本!" 1>&2
exit 1
fi
echo "正在上传版本...."
DATE=$(date +%Y%m%d%H%M%S)
#将增量版本源文件拷贝覆盖tocmat下的项目工程文件,重名文件以当前时间缀备份源文件
cp -R -b -S $DATE $workpath$nowpath $despath
echo "上传版本成功...."