---恢复内容开始---
搭建jenkins持续构建集成环境
要搭建jenkins持续构建集成环境,首先要安装tomcat和JDK;
第一部分,基本说明:
敏捷(Agile) 在软件工程领域越来越红火,如何能再不断变化的需求中快速适应和保证软件的质量也显得尤其的重要。
它倡导团队开发成员必须经常集成他们的工作,甚至每天都可能发生多次集成。而每次的集成都是通过自动化的构建来验证,包括自动编译、发布和测试,从而尽快地发现集成错误,让团队能够更快的开发内聚的软件。
持续集成的核心价值在于:
- 1. 持续集成中的任何一个环节都是自动完成的,无需太多的人工干预,有利于减少重复过程以节省时间、费用和工作量;
- 2. 持续集成保障了每个时间点上团队成员提交的代码是能成功集成的。换言之,任何时间点都能第一时间发现软件的集成问题,使任意时间发布可部署的软件成为了可能;
- 3. 持续集成还能利于软件本身的发展趋势,这点在需求不明确或是频繁性变更的情景中尤其重要,持续集成的质量能帮助团队进行有效决策,同时建立团队对开发产品的信心。
持续集成的原则:
业界普遍认同的持续集成的原则包括:
1)需要版本控制软件保障团队成员提交的代码不会导致集成失败。常用的版本控制软件有 IBM Rational ClearCase、CVS、Subversion 等;
2)开发人员必须及时向版本控制库中提交代码,也必须经常性地从版本控制库中更新代码到本地;
3)需要有专门的集成服务器来执行集成构建。根据项目的具体实际,集成构建可以被软件的修改来直接触发,也可以定时启动,如每半个小时构建一次;
4)必须保证构建的成功。如果构建失败,修复构建过程中的错误是优先级最高的工作。一旦修复,需要手动启动一次构建。
持续集成系统的组成
由此可见,一个完整的构建系统必须包括:
1,一个自动构建过程,包括自动编译、分发、部署和测试等。
2,一个代码存储库,即需要版本控制软件来保障代码的可维护性,同时作为构建过程的素材库。
3,一个持续集成服务器。本文中介绍的 Jenkins 就是一个配置简单和使用方便的持续集成服务器。
基于Jenkins 快速搭建持续集成环境
正如前文中所描述的那样,一个持续集成环境需要包括三个方面要素:代码存储库、构建过程和持续集成服务器。对Jenkins 有了初步了解后,我们通过一个实例来集中展示如何快速搭建一个简单的基于Jenkins 的持续集成环境。
第二部分,jenkins和svn的持续构建环境构建:
SVN(subversion)是目前比较流行的版本管理工具。很多开源软件都是用 SVN 作为代码版本管理软件。为了让实例更具有代表性,本文中我们使用 SVN 作为代码存储器。
接下来,我们开始新建一个 Jenkins 项目, 由于我们需要连接 SVN 的代码存储器, 我们选择 Build a free-style software project。
一, 安装jenkins; (第一步,下载安装jenkins)
从官网下载jenkins.war包,放到tomcat中的webapps目录下作为tomcat的一个应用;
官方下载地址: http://mirrors.jenkins-ci.org/war/
或直接使用命令行,按照官网上的方法安装:
wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
deb http://pkg.jenkins-ci.org/debian binary/
sudo apt-get update
sudo apt-get install jenkins
二, 对jenkins系统全局配置; (第二步,全局配置jenkins)
配置Jenkins全局变量,进入菜单:系统管理 -> 系统设置
2.1 配置JDK
因为buildr启动时需要jvm,所以我们这里需要配置下jdk,如下图:
2.2 配置版本控制库,这里用的是SVN,如图所示:
Name可以自由定制,下面的Path需设置成svn代码仓库的目录,
2.3 配置emai-ext,如图所示:
这里没有用jenkins自带的邮件配置,因为它没有模板,也不能配置触发机制。下图字段的如果不清楚其含义,请点击问号,看帮助。
2.4 配置邮件通知(如果使用email-ext,这里可不设置)
2.5 安装插件
配置声音插件
首先,需要在另一台jenkins服务器添加jenkins服务器的public key,并加入信任列表,具体步骤如下图
然后,配置系统设置,在此之前,请在需要播放声音的远程linux上安装play插件,sudo apt-get install sox
安装ClearCase的插件:
假设我们使用的代码存储库是 IBM Rational ClearCase。Jenkins 提供了对 ClearCase 的插件支持,它能方便地让我们连接到 Base ClearCase 或者 UCM ClearCase,使其成为 Jenkins Project 的代码控制器。另外,这个插件是基于 cleartool 命令的,所以必须在 Jenkins 的持续集成服务器上安装 ClearCase 的客户端程序。
在 Jenkins 的插件管理界面中选择 ClearCase Plugin,点击页面下方的 Install 按钮。
在打开的页面中提示安装完成后,Jenkins 需要重新启动来激活这个插件。重新执行 java -jar Jenkins.war 后,在 Jenkins 的页面中,我们就能看到 ClearCase plugin 已经被安装到 Jenkins 了。
2.6 Jenkins的授权和访问控制
(1) Jenkins的授权和访问控制
默认地Jenkins不包含任何的安全检查,任何人可以修改Jenkins设置,job和启动build等。显然地在大规模的公司需要多个部门一起协调工作的时候,没有任何安全检查会带来很多的问题。我们可以通过以下2方面来增强Jenkins的安全:
1) Security Realm,用来决定用户名和密码,且指定用户属于哪个组;
2) Authorization Strategy,用来决定用户对那些资源有访问权限;
在Manage Jenkins -> Configure System -> Enable Security下可以看到可以使用多种方式来增强Jenkins的授权和访问控制。
(2)创建管理员账号+匿名只读
简单地设置一个管理员账号,用来管理jenkins设置,修改job和执行build等。其他的匿名访问的用户将只有只读的权限,不能修改Jenkins的设置,不能修改job,且不能运行build,但是可以访问build的结构,查看build的log等。
1)需要对Jenkins增加如下的启动参数来创建管理员账号:
java -jar jenkins.war --argumentsRealm.passwd.user=password —argumentsRealm.roles.user=admin
例如设置管理员用户为jenkins且密码为swordfish,如下:
java -jar jenkins.war --argumentsRealm.passwd.jenkins=swordfish —argumentsRealm.roles.jenkins=admin
2)在启动后需要在Manage Jenkins -> Configure System来选择enable security,然后选择对Security Realm选择Delegate to servlet container,对Authorization选择Legacy Mode。
3)然后可以在右上角点击login或者http://yourhost/jenkins/loginEntry来登录,登录后此时你用户管理员权限,可以执行任何的操作。执行完操作后可以选择logout。
4)对developers增加rebuild的权限。
使用管理员登录对需要developer rebuild的job,选择Trigger builds remotely,且设置Authentication Token,例如设置为devbuild,然后developers可以访问http://jenkinsHost/job/project/build?token=token 来启动build。
其中Project为你需要启动build的job。其中token为你设置的Authentication Token。
如果你有webserver,你可以创建如下的webpage来让developers来启动build:
<h1>Jenkins Force
Build Page</h1>
<ul>
<li>
<a href="http://jenkins:8080/job/FOO/build?token=build">Force
build of Project FOO on Jenkins</a>
</li>
</ul>
(3)使用Jenkins的数据库管理用户且设置用户的访问权限
1)在Manage Jenkins -> Configure System -> Enable Security下为Security Realm选择Jenkins's own user database,且确保Allow users to sign up选中,为Authentication选择Matrix-based security。如下:
2)接着在主页上signup创建第一个管理员账号jenkins如下:
3)除了第一个账号以后signup的账号将为只读账号需要管理员分配权限。例如你可以signup来创建dev账号,然后分配权限使得dev可以启动job的build。如下:
注意:在%JENKINS_HOME%config.xml中可以查看和修改所有用户的权限设置,但是修改后需要重新启动Jenkins。
可以参考:
https://wiki.jenkins-ci.org/display/JENKINS/Quick+and+Simple+Security
https://wiki.jenkins-ci.org/display/JENKINS/Standard+Security+Setup
三, 使用jenkins新建项目并配置; (第三步,新建项目并配置)
在浏览器中输入:http://localhost:8080/jenkins ,打开jenkins配置管理首页面,下面的操作都是基于jenkins的首页面的操作;假如是第一次或新建一个jenkins管理项目,则需要按如下基本步骤进行配置:
(1) 新建 JenkinsTest Job
填写job name项:JenkinsTest;并选择创建一个“Build a free-style software project”,如下图:
点击“OK”后,进入到项目配置页面,然后进行自己配置;
(2)配置 JenkinsTest
然后我们就可以很方便的配置这个 JenkinsTest 项目了。Jenkins 很人性化的一点是在每个配置项的右侧都有一个帮助的图标,点击这个图标,Jenkins 会告诉您如何配置这个配置项。在“source code management”中选择“Subversion”项,如下图:
(3)配置版本控制库 SVN 服务器
源代码管理根据自己的需要进行选择,根据实际的 SVN 服务器服务器信息配置 Source Code Management,这能让 Jenkins 知道如何从哪里获取最新的代码,我的源代码是使用svn管理的,这里选择“Subversion Modules”,在"Repository URL"录入你的svn仓库地址;第一次录入时还需要输入登录svn仓库的用户名和口令。本例中假设 Repository 就在本地。
本地路径格式: file:///home/sun/svn/myproject
远程路径格式: svn://localhost/myproject
http://localhost/myproject (只适用于已经搭建好SVN的web服务器的情况)
(4)选择如何触发构建
通过构建触发器“Build Triggers”配置如何进行触发构建,jenkins内置的构建触发器有四种选择:
1) build after other projects are built 可以设置多个依赖的jobs,当任意一个依赖的jobs成功后启动此build。 多个依赖的jobs间使用,隔开。
2) Trigger builds remotely (e.g., from scripts) 在Authentication Token中指定TOKEN_NAME,然后可以通过连接JENKINS_URL/job/JOBNAME/build?token=TOKEN_NAME来启动build。
3) build periodically 在schedule中设置,语法类似于cron中语法。
4) Poll SCM 在schedule中设置时间间隔来抓取SCM server,如果有新的修改,则启动build。所以这里的作用相当于continous build。
根据开发需要,假设每一个小时我们需要重新构建一次。选择 “Build periodically”,在 “Schedule” 中填写 0 * * * *。
第一个参数代表的是分钟 minute,取值 0~59;
第二个参数代表的是小时 hour,取值 0~23;
第三个参数代表的是天 day,取值 1~31;
第四个参数代表的是月 month,取值 1~12;
最后一个参数代表的是星期 week,取值 0~7,0 和 7 都是表示星期天。
所以 0 * * * * 表示的就是每个小时的第 0 分钟执行一次构建。
下图是 设置为轮询SVN的代码服务器
若还不甚明白,可以点击后面的帮助图标,点击这个图标,Jenkins 就会告诉您应该如何配置这个配置项。
(5)选择build 方式
接下来就是要添加 build 的步骤了。Jenkins 提供了四个选项供我们选择,可以根据需要执行或调用外部命令和脚本。
在本例中,我们通过调用和执行Shell脚本 ,将 SVN repository 中 C/C++ 代码编译并生成elf二进制文件。也可以根据项目的实际编写自己的 shell 脚本配置在这里。在编写shell脚本时,需要注意可以使用一些jenkins自己的环境变量。
配置 Execute Shell
例如:cd ${WORKSPACE}/myproject ; /bin/bash ./build.sh
附注:jenkins内置的环境变量
BUILD_NUMBER, 唯一标识一次build,例如23;
BUILD_ID, 基本上等同于BUILD_NUMBER,但是是字符串,例如2011-11-15_16-06-21;
JOB_NAME, job的名字,例如JavaHelloWorld;
BUILD_TAG, 作用同BUILD_ID,BUILD_NUMBER,用来全局地唯一标识一此build,例如jenkins-JavaHelloWorld-23;
EXECUTOR_NUMBER, 例如0;
NODE_NAME, slave的名字,例如MyServer01;
NODE_LABELS, slave的label,标识slave的用处,例如JavaHelloWorld MyServer01;
JAVA_HOME, java的home目录,例如C:Program Files (x86)Javajdk1.7.0_01;
WORKSPACE, job的当前工作目录,例如c:jenkinsworkspaceJavaHelloWorld;
HUDSON_URL = JENKINS_URL, jenkins的url,例如http://localhost:8000/ ;
BUILD_URL, build的url 例如http://localhost:8000/job/JavaHelloWorld/23/;
JOB_URL, job的url,例如http://localhost:8000/job/JavaHelloWorld/;
SVN_REVISION, svn 的revison,
(6)配置邮件提醒
在选择完成build方式后,选择“Post-build Actions”配置其他的选项,有7种方式可选:
比如邮件提醒设置,
(7)配置保存
然后点击 save ,保存jenkins的配置信息。
四, 项目的构建jenkins使用 (第四步,jenkins基本使用说明)
(1) JenkinsTest 开始构建
接下来的每小时的第 0 分钟,JenkinsTest Job 就会被构建;或者在工作区域的左边菜单上点“build now”,开始构建项目。我们可以在 Jenkins 中观察构建的进度和最终的状态——成功或者失败。太阳代表之前的构建没有任何失败,如果构建成功,则项目状态的S为蓝色,如果失败则为红色。
(2) JenkinsTest 构建的 console 输出
同时我们可以点击 JenkinsTest 查看单次构建的 Console 的输出结果。从中我们能看到构建的第一步是从 SVN 服务器上 check out 代码,然后调用我们先前配置的 shell脚本。
构建失败的 Console 输出:
构建完成,左边菜单会显示有“控制台输出”,点击可以查看控制台详细输出。构建错误时也可以根据相应的错误信息进行修改。我们可以看到 build 的最后结果 FAILURE,表明本次构建失败了,从前面可以看到是因为找不到build.sh文件。
构建成功的 Console 输出:
最后,可以看到 build 的最后结果 Success,表明本次构建成功。
五, jenkins与CI插件集成
5.1 项目中存在的问题
在当前项目中,存在问题:
■ 代码风格各异,同时缺少必要代码注释
■ 常出现空指针类似的基础bug
■ 代码单元测试缺失,测试场景覆盖不大
■ 重复代码大量出现
■ 转测试后,基础用例需要大量人力去验证
■ 其他:缺少性能测试
可能会导致的后果:
■ 他人阅读代码困难,后期维护成本增加
■ 代码质量不高,后期维护成本增加
■ 开发成本增加,后期维护成本增加
■ 测试成本明显增加
因此需要一个持续代码集成,能够让开发或测试减少成本,提高质量工具,而jenkins正好可以与CI插件集成起来,实现这些功能。
5.2 解决方案
■ 代码风格各异,通过统一checkstyle样式来检查
■ 常出现空指针类似的基础bug,可以通过findbugs静态检查
■ 多余if或者try catch,可以通过pmd检查
■ 单元测试用例测试功能结果,可以通过xunit报告检查
■ 大量重复代码,可以通过duplicate code报告来检查
■ 测试用例覆盖度,能够通过clover来检查
■ 基础功能,可以通过selenium自动化测试
■ 性能测试,可以通过jmeter来完成
虽然项目人员能够自己使用这些工具,完善代码,提高质量,但是却不方便项目统一管理。而Jenkins能够集成这些插件,做到统一管理,解决项目问题。
Jenkins,之前叫做Hudson,是基于Java开发的一种持续集成工具,用于监控秩序重复的工作。
主要包括:
1、持续的软件版本发布/测试项目。
2、监控外部调用执行的工作。
Jenkins能够集成各式插件,如常用CI插件:deploy,junit,findbugs,pmd,checkstyle,clover, duplicate code,jmeter,selenium等,而这些工具正好可以解决项目存在一些问题。
5.3 实施方案
jenkins上CI插件安装
■ 手动安装
第一步,查询需要插件名称 https://wiki.jenkins-ci.org/display/JENKINS/Plugins
第二步,查询插件是否依赖其他插件
第三步,进入插件下载页面http://updates.jenkins-ci.org/download/plugins/?C=N;O=D,下载插件
第四步,将插件放到${jenkins安装目录}/jenkins_home/plugins,手动重启服务。即进去${jenkins安装目录}/tomcat7/bin,使用shutdown.sh与startup.sh关闭或者启动jenkins服务。
■ jenkins管理平台安装
第一步,进入jenkins管理平台,点击登录。(第一个注册的即为管理员)
第二步,点击左边菜单系统管理,在弹出页面中选择管理插件
第三步,点击可选插件,找到需要安装插件
勾选安装后重启或者先下载重启后再安装,也可以进入命令行手动重启jenkins。
附注:
具体的安装步骤可以参考:http://wchlt.blog.163.com/blog/static/2196057201372833659235/
5.4 常用插件安装
pmd,
checkstyle,
Static Code Analysis Plug-ins,
Dependency Graph View Plugin ,
cmakebuilder Plugin : 支持cmake的构建;
第三部分,结束语
本文简单介绍了持续集成的概念并着重介绍了如何基于 Jenkins 快速构建持续集成环境。通过具体实例的描述,相信读者对 Jenkins 的基本功能和实现方法有个更清楚地认识和理解。其实,Jenkins 的功能远不至文中所述的这些,Jenkins 还有详尽的日志处理和持续集成构建状态的分析等功能。希望在进一步的学习和应用中与大家分享。
---恢复内容结束---