天天看点

搭建hudson/jenkins+cppcheck+cpplint+cccc持续集成环境1 Jenkins介绍2准备3安装4插件安装5全局配置6新建job

1 Jenkins介绍

Jenkins是基于Java开发的一种持续集成工具,Hudson是它的前身。Jenkins用于监控程序重复的工作,包括:

1、持续的软件版本发布/测试项目。

2、监控外部调用执行的工作。

l  Jenkins的特性

1、易于安装-只要把jenkins.war部署到servlet容器,不需要数据库支持。

2、易于配置-所有配置都是通过其提供的web界面实现。

3、集成RSS/E-mail/IM-通过RSS发布构建结果或当构建失败时通过e-mail实时通知。

4、生成JUnit/TestNG测试报告。

5、分布式构建支持-Jenkins能够让多台计算机一起构建/测试。

6、文件识别- Jenkins能够跟踪哪次构建生成哪些jar,哪次构建使用哪个版本的jar等。

7、插件支持-Jenkins可以通过插件扩展,你可以开发适合自己团队使用的工具。

2准备

²  JDK安装包((jdk-8u11-windows-i586_14459_BDdl.exe)

²  tomcat安装包(apache-tomcat-8.0.15.exe)

²  jenkins war包或hudson war包(jenkins.war)

²  VC或者visual studio(VS2013_RTM_ULT_CHS.iso)

²  cppcheck安装包(cppcheck-1.68-x86-Setup.msi)

²  cccc安装包(CCCC_3.1.4_setup.exe)

²  python2.7安装包(python-2.7.msi)

²  cpplint.py

注:cpplint 必须在python2.7下执行

3安装

3.1安装JDK

1.安装:双击运行exe,按照提示安装即可。

2.配置环境变量

3.验证是否安装成功:点击“开始”->“运行”,输入“cmd”进入命令行界面,打入“java -version”,如果安装成功将会显示所安装的版本。

参考配置JDK环境变量.doc

3.2安装Apache

1.安装:一路默认安装即可。

2配置:修改配置为开机自启动:找到 Configure Tomcat,修改启动类型为“自动”,并确定。

3.验证是否安装成功:在浏览器中输入http://localhost:8080,显示界面如下

搭建hudson/jenkins+cppcheck+cpplint+cccc持续集成环境1 Jenkins介绍2准备3安装4插件安装5全局配置6新建job

3.3安装Jenkins

将war包放在tomcan安装路径下的webapps目录下。在浏览器中输入http://localhost:8080/jenkins(或http://localhost:8080/hudson),显示界面如下:

搭建hudson/jenkins+cppcheck+cpplint+cccc持续集成环境1 Jenkins介绍2准备3安装4插件安装5全局配置6新建job

建议使用Jenkins,Hudson-3.2.1 warning插件不能很好的集成cpplint结果。

3.4安装VC或visual studio

建议通过DAEMON Tools Lite安装visual studio。

3.5安装cppcheck

建议直接安装在C盘下或c:\cppcheck目录下。

3.6安装cccc

建议直接安装在C盘下或c:\cccc目录下。

3.7安装python2.7

默认安装即可。

4插件安装

jenkins的好用基本体现在其众多而强大的插件上,在“系统管理”中可以找到“插件管理”,为了更好的使用jenkins,还需要安装一些插件,在“可选插件”中进行选择,本文中建议安装以下插件:

² Subversion Plug-in:支持Subversion作为配置服务器

² Cppcheck Plug-in:使用其生成cppcheck报告

² CCCC Plugin:使用其生成cccc报告

² Warnings Plug-in:从控制台或本地文件中读取警告信息并生成报告

² Violations plugin:生成静态代码检查报告,

² Email Extension Plugin:如果希望部署完成后能将结果以邮件的形式进行

通知,可以安装该插件

 jenkins支持两种方式的插件安装,一种是在线自动安装。另一种是本地手动安装。安装完插件需要重新启动jenkins。即关闭tomcat服务,再启动。

4.1.在线自动安装

 点击【系统管理】,再点击【管理插件】。在【Available】选项卡里选择想要安装的插件。

搭建hudson/jenkins+cppcheck+cpplint+cccc持续集成环境1 Jenkins介绍2准备3安装4插件安装5全局配置6新建job

点击下面的install 然后等一段时间. 

搭建hudson/jenkins+cppcheck+cpplint+cccc持续集成环境1 Jenkins介绍2准备3安装4插件安装5全局配置6新建job

 显示打勾的状态就是这个插件已经安好了

如果插件太多,可以通过Search找到想要安装的插件。

搭建hudson/jenkins+cppcheck+cpplint+cccc持续集成环境1 Jenkins介绍2准备3安装4插件安装5全局配置6新建job

4.2本地手动安装

手动将插件下载到本地,然后点击【系统管理】,再点击【管理插件】。在【高级】选项卡里上传插件,然后点击Upload。

搭建hudson/jenkins+cppcheck+cpplint+cccc持续集成环境1 Jenkins介绍2准备3安装4插件安装5全局配置6新建job

如果是jenkins,也可将hpi文件拷贝至jenkins home目录下的WEB-INF/plugins目录下。

5全局配置

jenkins的总体配置,都是在“系统管理”中进行配置的,hudson“系统管理”提供了如下功能:

 l 系统设置 

全局设置&路径,这是jenkins最核心的功能,jdk,ant,maven,scp,邮件等等,都 是在这里设置的。 

l读取设置

放弃当前内存中所有的设置信息并从配置文件中重新读取,仅用于当您手动修改配置文 件时重新读取设置。

 l管理插件

 添加、删除、禁用或启用Hudson功能扩展插件。

 l系统信息

 显示系统环境信息以帮助解决问题。该功能会列出系统属性,环境变量以及Plugins信息。

 l系统日志

 系统日志从java.util.logging 捕获Hudson相关的日志信息。

 l负载统计

 检查您的资源利用情况,看看是否需要更多的计算机来帮助您构建。

 lHudson CLI 

从您命令行或脚本访问或管理您的Hudson。

感兴趣的话可以通过命令行尝试一下

 l脚本命令行

 执行用于管理或故障探测或诊断的任意脚本命令。这就是Groovy scripts。

 l管理节点

 添加、删除、控制和监视系统运行任务的节点。

 l管理用户

 创建/删除/修改Hudson用户,系统的登录用户都是在这里建立的。

 l准备关机

 停止执行新的构建任务以安全关闭计算机

全局设置中很多是我们用不到的,这里只介绍安全设置和邮件设置。

5.1邮件通知

1. 点击系统管理,选系统设置

搭建hudson/jenkins+cppcheck+cpplint+cccc持续集成环境1 Jenkins介绍2准备3安装4插件安装5全局配置6新建job

2. 最后一项——邮件通知,填入以下信息,注,系统管理员邮件地址是事先申请的一个邮箱,相当于邮件中转站的作用,每次项目build后都会从这个中转站发邮件到项目相关人员的邮箱中。Hudson URL可以使http://127.0.0.1:8080,也可以是http:localhost:8080,貌似也可以用自己的ip地址,但是如果用自己的ip的话别人就进不来了,不晓得我的这个理解有误没。

点击advanced,勾选使用SMTP认证,将中转站邮箱账号及密码填入,且smtp端口为25,charset值按系统默认不变。点击用系统管理员测试邮件设置,若设置成功,该邮箱会收到一封系统确认邮件。

搭建hudson/jenkins+cppcheck+cpplint+cccc持续集成环境1 Jenkins介绍2准备3安装4插件安装5全局配置6新建job
搭建hudson/jenkins+cppcheck+cpplint+cccc持续集成环境1 Jenkins介绍2准备3安装4插件安装5全局配置6新建job
搭建hudson/jenkins+cppcheck+cpplint+cccc持续集成环境1 Jenkins介绍2准备3安装4插件安装5全局配置6新建job

3. 系统邮件设置弄好后就可以去设置单个项目的邮件设置,因为每个项目的人员是非固定的,所以需要对该项目人员设置邮箱,只有该项目人员才能收到该项目的相关邮件。

选中要设置的项目,点击设置,勾选EditableEmail Notification,将项目相关人的邮箱录入,用逗号分开。点save。

搭建hudson/jenkins+cppcheck+cpplint+cccc持续集成环境1 Jenkins介绍2准备3安装4插件安装5全局配置6新建job
搭建hudson/jenkins+cppcheck+cpplint+cccc持续集成环境1 Jenkins介绍2准备3安装4插件安装5全局配置6新建job

4. 可能还需要下载邮件的插件才能正常运行,因此,需要在系统管理中选中管理插件,找到

搭建hudson/jenkins+cppcheck+cpplint+cccc持续集成环境1 Jenkins介绍2准备3安装4插件安装5全局配置6新建job

点击安装

5. 回到项目设置中,在Editable Email Notification,下面勾选无论build失败还是成功都要发送邮件给项目相关人员,去掉send tocommitters的选项,且add a trigger全选:select。

点save保存。

搭建hudson/jenkins+cppcheck+cpplint+cccc持续集成环境1 Jenkins介绍2准备3安装4插件安装5全局配置6新建job

 6. 至此,jenkins邮件设置完成,

回到项目,点击立即构建,无论成功或失败都会有邮件发送到项目组成员的邮箱中,说明邮件设置成功。

5.2安全设置

1.在系统管理中的系统设置有一项:启用安全,选中它,并在hudson专有用户数据库中勾选允许用户注册这一选项,表明系统允许添加用户,若去掉这个勾选,则说明系统不允许用户注册。

搭建hudson/jenkins+cppcheck+cpplint+cccc持续集成环境1 Jenkins介绍2准备3安装4插件安装5全局配置6新建job

 2. 紧接其后的是授权策略,选中安全矩阵,在添加用户/组后面填入要注册的用户的名字,如Leanna,点击添加,则该用户就在用户/组的列表中了,但此时并没有注册成功。可根据实际需要勾选该用户的使用权限,是最高权限还是只读只写,可勾选。最后点save。

搭建hudson/jenkins+cppcheck+cpplint+cccc持续集成环境1 Jenkins介绍2准备3安装4插件安装5全局配置6新建job
搭建hudson/jenkins+cppcheck+cpplint+cccc持续集成环境1 Jenkins介绍2准备3安装4插件安装5全局配置6新建job

3. 可先退出之前的登陆用户,右上角

搭建hudson/jenkins+cppcheck+cpplint+cccc持续集成环境1 Jenkins介绍2准备3安装4插件安装5全局配置6新建job

4. 点击新建账户create anaccount

搭建hudson/jenkins+cppcheck+cpplint+cccc持续集成环境1 Jenkins介绍2准备3安装4插件安装5全局配置6新建job

5. 填入相关信息

搭建hudson/jenkins+cppcheck+cpplint+cccc持续集成环境1 Jenkins介绍2准备3安装4插件安装5全局配置6新建job

6. 因为之前已经有注册过这个账号,所以这个名字不能用了,可换其他的比如Amy,注册成功后会有邮件发送至该人员的电子邮箱。

搭建hudson/jenkins+cppcheck+cpplint+cccc持续集成环境1 Jenkins介绍2准备3安装4插件安装5全局配置6新建job

3. 项目相关人员都注册好了之后就可取消允许用户注册这一选项,以避免其他非项目相关人员进来。

搭建hudson/jenkins+cppcheck+cpplint+cccc持续集成环境1 Jenkins介绍2准备3安装4插件安装5全局配置6新建job

6新建job

6.1创建一个Jenkins作业。

1.点击新建任务链接。创建一个自由风格的软件项目,输入任务名称。

搭建hudson/jenkins+cppcheck+cpplint+cccc持续集成环境1 Jenkins介绍2准备3安装4插件安装5全局配置6新建job

6.2 Jenkins任务的基本配置

        Discard OldBuilds选项配置如何抛弃旧的构建。如果每次构建相关的文件都保存下来,磁盘空间将被渐渐消耗光。Hudson为此提供了两种方式让用户选择保留哪些构建任务的相关文件:

1) Days to keep builds:如果其值为非空的N,就仅保留N天之内的构建文件。

2) Max # of builds to keep:如果#非空,就仅保留最多#个最近构建的相关文件。

  如:保留10个最近的构建,在Max # of buildsto keep一栏中输入“10”即可。

搭建hudson/jenkins+cppcheck+cpplint+cccc持续集成环境1 Jenkins介绍2准备3安装4插件安装5全局配置6新建job

6.3设置工作目录

点击 “Advanced Job Options”下的“Advanced...”按钮,选中“Use custom workspace”,设置Directory为我们的工作目录(例如我设置为E:\Hudson\mytest)。

搭建hudson/jenkins+cppcheck+cpplint+cccc持续集成环境1 Jenkins介绍2准备3安装4插件安装5全局配置6新建job

6.4 Jenkins任务的源码仓库配置

  在项目配置页面Source CodeManagerment部分,选择Subversion,然后在Repository URL文本框中输入项目的Subversion仓库地址(如:svn://127.0.0.1/account/trunk)。

  然后单击entercredential填写配置仓库的认证信息。

搭建hudson/jenkins+cppcheck+cpplint+cccc持续集成环境1 Jenkins介绍2准备3安装4插件安装5全局配置6新建job

在上图红色警告部分,点击【enter credential】输入用户名密码。

搭建hudson/jenkins+cppcheck+cpplint+cccc持续集成环境1 Jenkins介绍2准备3安装4插件安装5全局配置6新建job

6.5 Jenkins任务的构建触发配置

    Hudson 支持三种方式触发构建:

1) Build after otherprojects are built:在其他项目构建完成后构建本项目。

2) Buildperiodically:周期性的构建本项目。

3) Poll SCM:周期性的轮询源码仓库,发现有更新时构建本项目。

一般使用第三种。

 Hudson使用著名的 UNIX任务调试工具Cron(http://en.wikipedia.org/wiki/Cron)所使用的配置方式来配置轮询代码仓库的频率:用 5 个字段表示不同的时间单位,字段之间用空格分隔:分(0-59) 时(0-23) 日(1-31) 月(1-12)星期几(0-7,0、7都表示周日)。

  几种特殊匹配符:

  1) * :匹配范围内任何值

  2) M-N :匹配 M-N 范围内任何值

  3) A , B , … , Z :逗号匹配多个值

  4) */X 或 M-N/X :范围内能被 X 整除的

  星期几与日期是或的关系。

  对于一个健康的项目,常见的做法是:每隔10分钟轮询代码仓库,Schedule对应的配置为:*/10 * * * *。

  可以用“#”在Schedule配置文本框中进行注释。

6.6 Jenkins任务的构建配置

6.6.1构建编译

1)单击Build部分的Add build step,选择Execute Windowsbatch command;

2)然后输入构建编译命令,例如:

call "C:\ProgramFiles (x86)\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT"

msdev E:\Hudson\mytest\FtpClient.dsp /MAKE "FtpClient - DEBUG"

其中dsp是工程文件,也可使用工作区文件dsw,"FtpClient - DEBUG"中的FtpClient表示FtpClient编译FtpClient工程。

注:也可将上述命令存成一个bat文件,例如E:\Hudson\hudson.bat。其中hudson.bat内容为上述命令。构建命令就是文件地址,即E:\Hudson\hudson.bat。

6.6.2 Cppcheck检查

1)单击Build部分的Add build step,选择Execute Windowsbatch command;

2)然后输入静态代码检查命令,例如:

C:\Cppcheck\cppcheck.exe--enable=all --xml-version=2 e:\Hudson\mytest 2>E:\Hudson\mytest\cppcheck-result.xml 1>E:\Hudson\cppcheck.log

注:其中cppcheck-result.xml保存的是cppcheck代码检查结果。

6.6.3 CCCC检查

1)单击Build部分的Add build step,选择Execute Windows batchcommand;

 2)然后输入静态代码检查命令,例如:

C:\CCCC\cccc.exeE:\Hudson\mytest\*.cpp --outdir=E:\Hudson\cccc--xml_outfile=E:\Hudson\mytest\cccc-result.xml 2>E:\Hudson\cccc.log注:其中cccc-result.xml保存的是cppcheck代码检查结果。

6.6.4 Cpplint检查

1、检查单个文件

1)单击Build部分的Add build step,选择Execute Windows batchcommand;

 2)然后输入代码规范检查命令,例如:

C:\Python27\python.exec:\cpplint\cpplint.py E:\Hudson\mytest\FtpClient.cpp  2>E:\Hudson\mytest\cpplint-result.xml

set errorlevel=0

注:因为cpplint的返回值会是1,所以重置下返回值。否则任务总显示失败

2、检查整个目录

如果要对目录遍历,对所有文件都进行检查,可以用另一个python来检索然后调cpplint检查。代码如下:

import os, fnmatch, sys 

def all_files(root, patterns = '*', single_level = False,yield_folders=False): 

        patterns = patterns.split(';') 

        for path, subdirs, files in os.walk(root): 

            if yield_folders: 

               files.extend(subdirs) 

            files.sort() 

            for name in files: 

                for pattern in patterns: 

                    if fnmatch.fnmatch(name, pattern): 

                        yield os.path.join(path,name) 

                        break 

            if single_level: 

                break 

if __name__ == '__main__': 

        if len(sys.argv) <2: 

            print 'Please set theabsolute path as the first parameter for parse.' 

            sys.exit() 

        cmd="c:\cpplint.py"

        for path inall_files(sys.argv[1],'*.cpp;'):

            cmd=''.join([cmd,path])

        os.system(cmd) 

代码另存为lintfordir.py,

1)单击Build部分的Add build step,选择Execute Windows batchcommand;

 2)然后输入代码规范检查命令,例如:

C:\Python27\python.exec:\lintfordir.py E:\Hudson\mytest\ 2>E:\Hudson\mytest\cpplint-result.txt

seterrorlevel=0

6.7 发布结果

每次执行完任务以后将检查结果发布,生成的报告进行汇总。

6.7.1 CCCC报告

1)选中Post-build Actions下的Publish CCCC report

2)输入cccc 报告文件名,注意,这里需要使用相对路径,basedir是工作目录,例如这里的basedir是E:\Hudson\mytest,结果保存在E:\Hudson\mytest下,所以输入文件名cccc-result.xml。

6.7.2 Cppcheck报告

1)选中Post-build Actions下的Publish Cppcheck results

2)输入Cppcheck报告文件名,注意,这里需要使用相对路径,basedir是工作目录,例如这里的basedir是E:\Hudson\mytest,结果保存在E:\Hudson\mytest下,所以输入文件名cppcheck-result.xml。

6.7.3 Cpplint报告

1)选中Post-build Actions下的Scan for compiler warnings

2)在Scan workspace files下File pattem中输入cpplint报告文件名,注意,这里需要使用相对路径,basedir是工作目录,例如这里的basedir是E:\Hudson\mytest,结果保存在E:\Hudson\mytest下,所以输入文件名cpplint-result.xml。

3)Parser选择Cpplint

6.8配置邮件

勾选【Editable Email Notification】,【Global Recipient List】里填写邮件的抄送地址。然后点击【Add a Trigger】增加【Unstable】和【Fixed】。那么就会在构建失败,不稳定和恢复正常的时候发送邮件。

展开【expand】,可以定制每次构建以后,状态分别是失败,不稳定,恢复的时候发送邮件的模板。例如:

6.9保存

点击【save】按存设置。不久就会自动执行构建。也可手动点击【立即构建】。

备注:

1、定时检测,构建

Build Triggers

Buildperiodically:(定期构建)此选项 (也是使用定时作业表达式)仅仅通知Hudson按指定的频率对项目进行构建,而不管SCM是否有变化。我这个作业就属于目标测试环境是按某种方式定期修订的而SCM却是静态的情况。如果您想在这个作业中运行一些测试用例的话,它可能就很有帮助。

PollSCM:这是CI 系统中常见的选项。当您选择此选项,您可以指定一个定时作业表达式来定义Hudson每隔多久检查一下您源代码仓库的变化。如果发现变化,就执行一次构建。例如,表达式中填写0,15,30,45 * * * *将使Hudson每隔15分钟就检查一次您源码仓库的变化。

举例:

Poll SCM:定时检查源码变更(根据SCM软件的版本号),如果有更新就checkout最新code下来,然后执行构建动作。我的配置如下:

*/5 ** * *  (每5分钟检查一次源码变化)

Buildperiodically:周期进行项目构建(它不care源码是否发生变化),我的配置如下:

0 2 ** *  (每天2:00 必须build一次源码)

 2、cppcheck介绍

 cppcheck 是一个静态代码检查工具,支持c, c++ 代码;作为编译器的一种补充检查,只检测那些编译器通常无法检测到的bug类型。cppcheck对产品的源代码执行严格的逻辑检查。执行的检查包括:

   1.  自动变量检查

   2.  数组的边界检查

   3.  class类检查

   4.  过期的函数,废弃函数调用检查

   5.  异常内存使用,释放检查

   6.  内存泄漏检查,主要是通过内存引用指针

   7.  操作系统资源释放检查,中断,文件描述符等

   8.  异常STL 函数使用检查

   9.  代码格式错误,以及性能因素检查

示例:

C:\Cppcheck\cppcheck.exe --enable=all--xml-version=2 e:\Hudson\mytest 2>E:\Hudson\mytest\cppcheck-result.xml 1>E:\Hudson\cppcheck.log

1:一般输出如Checking e:\Hudson\mytest\FtpClient.cpp..

2:检查的错误输出

<errorid="purgedConfiguration" severity="information"msg="The configuration &amp;#039;APSTUDIO_INVOKED&amp;#039; wasnot checked because its code equals another one." verbose="Theconfiguration &amp;#039;APSTUDIO_INVOKED&amp;#039; was not checkedbecause its code equals another one.">

           <location file="FtpClient.cpp" line="0"/>

3、CCCC介绍

cccc( C and C++ Code Counter),检查c/c++代码复杂度的工具

C:\CCCC\cccc.exe E:\Hudson\mytest\*.cpp --outdir=E:\Hudson\cccc--xml_outfile=E:\Hudson\mytest\cccc-result.xml 2>E:\Hudson\cccc.log

会产生html和xml两种格式的检查输出

4、cpplint介绍

cpplint是一个python脚本cpplint.py,是google推出的C++编码规范检查工具。

常见问题:

1.如果是xp系统,解析cppcheck report时可能出现javax.xml.bind.UnmarshalException的问题。

解决办法:将cppcheck检查语句改为:

C:\Cppcheck\cppcheck.exe --enable=all --xml--xml-version=2 --errorlist e:\Hudson\mytest  >E:\Hudson\mytest\cppcheck-result.xml

2.如果涉及工作区dsw,且工作区中包含多个项目,可用编译命令(举例):

msdevE:\Hudson\mytest\FtpClient.dsw /MAKE "ALL - DEBUG"

其中FtpClient.dsw为工作区文件,ALL表示表示所有工程,也可指定编译单个工作,例如有工程Client,可指定为msdev E:\Hudson\mytest\FtpClient.dsw /MAKE "Client -DEBUG"

3.如果jenkins中要构建cppchek等report,可将报告存储在workspace中,将svn中的Local module directory设置为check out目录,就不至于将report与开发代码混在一起。

(jenkins中若设置workspace,则workspace为job根目录)

4.若要使用svn ci将源码提交,可下载subversion至本地,然后在windows batch command中输入命令:

"C:\Program Files (x86)\Subversion\bin\svn.exe" ci tt.txt -m"xpp"

5.若svn命令出现svn:E155036: 请参阅命令 'svn upgrade'的提示。

解决办法:将本地subversion版本更新至与jenkins中subversion版本相同. jenkins中subversion版本在系统管理->系统设置->Subversion->Subversion Workspace Version中进行设置。      

6.若cpplint检查时出现错误:

UnicodeDecodeError: 'ascii' codec can'tdecode byte 0xe0 in position 0

解决办法:在执行的python文件中加入(即cpplint.py)

import sys

reload(sys)

sys.setdefaultencoding('gb18030')