Jenkins Tutorial (以PHPUnit为例)

Jenkins(前身是Hudson),是一个开源(Java语言)的CI(Continuous Integration,持续集成)系统

安装、启动#####

本文以MAC OS X 10.10.4为环境

官方给的安装方式有3种(见 这里 ),我使用的是第二种:
... download jenkins.war directly and launch it by executing java -jar jenkins.war.

  1. 如果不在jenkins.war文件所在目录执行该命令,需带上全路径
  1. 启动时如遇到你机器所装Java版本过低的情况,需从 Java官网 下载适用于你系统的最新版本

启动后会有一系列log输出,待到下面这句出现,就ready了
INFO: Jenkins is fully up and running

访问一下 http://localhost:8080,看能不能打开一个页面。如果能,那就OK了。

安装xUnit插件#####

Jenkins的强大之处之一是可以把各种单元测试框架(JUnit、CppUnit、PHPUnit等)的结果以可视化的方式呈现在页面上。我们先安装xUnit(其中包含了对PHPUnit的支持),以便查看后续单元测试的结果。

首页(也就是http://localhost:8080)-> Manage Jenkins (Page) -> Manage Plugins (Link) -> Available (Tab) -> xUnit (Search Box),如下图:

QQ20151103-0.png

执行 Install without restart之后,坐等完成。完成后页面有提示,shell的日志中也有相应提示:
INFO: Installation successful: xUnit plugin

准备svn repo#####

如果你没有现成的php工程及单元测试,可以先自己弄一个“hello world”级别的 assert(true) “单元测试”:即只建一个测试案例,其中 assert(true),并传到svn中,我的FooTest.php是这样的:

<?php
class FooTest extends PHPUnit_Framework_TestCase
{
    public function test1()
    {
       $this->assertEquals(1, 1); 
    }
    
    /* 如果你觉得一个case太单薄,可以放开此处
    public function test2()
    {
       $this->assertEquals(1, 1); 
       $this->assertEquals(1, 1); 
    }
    */
}

(你需要先 安装PHPUnit)在本地执行 phpunit FooTest.php,可以看到执行结果

创建Job#####

对于一个job的一次执行,一般来说无外乎下面几个步骤:

  • Get code
  • Build
  • Run tests
  • Send notification(e.g. email)
    这里,因php是脚本语言,不需要编译;Send notification一步我们这里也暂略过。故,就只有Get code 和 Run tests两个步骤了

回到你的首页,点击create new jobs,开始创建job流程

  1. 给你的job取个名字(比如Foo),并选择Freestyle project,"OK" 完成
  2. 此时进入job的configure页面。此页有较多的配置项(后续都可以重新编辑),关于触发时机(周期性触发/检查到有更改触发)、svn/git等的配置我们就不赘述了,一是相信你比较熟悉,二是每个配置项旁边有个帮助按钮("?"),可以帮助你理解。这里仅着重说一下 Build 部分(据我目前的了解,Build+Run tests都是在这里接入)
Add build step

理论上,这里需要加入自己的build+run tests的脚本(取代码的任务已由前面的配置完成,运行时会取到当前目录),因我们是php,无需build,直接run tests:

  • Add build step -> Execute Shell
    输入命令 phpunit --log-junit report.xml FooTest.php。此命令意在执行单元测试,并将测试结果输出到文件report.xml(供后续步骤用)
  • Add build step -> Process xUnit test result report
    Add -> PHPUnit-3.x(default),在Pattern输入框中输入 ./report.xml,即测试结果所在文件

Save,完成。至于更多的 build-step,post-build-actions,暂不添加,我也还未弄明白。现在这两项,已经足以将测试结果通过web页展示出来了。

此时,就可以手动启动一次build了。页面上有好多入口,很容易找。执行完后,具体执行过程可以通过左侧的Console Output点进入看。展示一下我的一次执行具体输出:


Started by user anonymous
Building in workspace /Users/yourname/.jenkins/jobs/Foo/workspace
No JDK named ‘null’ found
Cleaning local Directory .
Checking out svn://localhost at revision '2015-11-03T14:43:47.903 +0800'
A         test.php
A         run.sh
At revision 6
no change for svn://localhost since the previous build
No JDK named ‘null’ found
[workspace] $ /bin/sh -xe /var/folders/rb/tv9pnj2904589kck1z8yb7h00000gn/T/hudson8129901931154079888.sh
+ sh run.sh
PHPUnit 4.8.15 by Sebastian Bergmann and contributors.

..

Time: 88 ms, Memory: 11.75Mb

OK (2 tests, 5 assertions)
[xUnit] [INFO] - Starting to record.
[xUnit] [INFO] - Processing PHPUnit-3.x (default)
No JDK named ‘null’ found
[xUnit] [INFO] - [PHPUnit-3.x (default)] - 1 test report file(s) were found with the pattern 'report.xml' relative to '/Users/yourname/.jenkins/jobs/Foo/workspace' for the testing framework 'PHPUnit-3.x (default)'.
[xUnit] [INFO] - Converting '/Users/yourname/.jenkins/jobs/Foo/workspace/report.xml' .
[xUnit] [INFO] - Check 'Failed Tests' threshold.
[xUnit] [INFO] - Check 'Skipped Tests' threshold.
[xUnit] [INFO] - Setting the build status to SUCCESS
[xUnit] [INFO] - Stopping recording.
Build step 'Process xUnit test result report' changed build result to SUCCESS
Finished: SUCCESS
未解决的一点困惑:######

Jenkins判断build是否成功的标准为:the build is considered a failure if any of the commands exits with a non-zero exit code。 即你在Execute Shell输入框中执行的脚本,如果有返回值非0,即被Jenkins认为是失败的。这自然很好。
但是,在这里运行phpunit时,若有case失败,phpunit将返回非0值,不幸被认为失败,并且最终在页面看不到tests执行结果(成功多少、失败多少),这不是我们预期的。我们预期是:build成功了,tests也执行完了,我要看到执行结果(尽管cases未全部通过)。Jenkins的行为跟我的预期不一样,我还没搞明白。

Jenkins vs. Buildbot#####

Buildbot是python写的CI系统,也进行了简单tutorial。总体感觉是,Jenkins更易上手,直击目标;而Buildbot则有些“抽象”,弄了半天还没明白怎么跑一个Job。引用一个别人的说法:

**Generally I would say that buildbot is the most "general purpose" automatic builds tools. Jenkins however might be the best related to running tests, especially for parsing and presenting results in nice ways (results, details, charts.. some clicks away), things that buildbot does not do "out-of-the-box". ** from stackoverflow

似乎可以说,Jenkins更像windows,Buildbot更像Linux。

高级:Master/Slave######

Buildbot Tutorial开门见山说的就是自己的Master/Slave架构,可以让一个任务同时在多个平台上跑。Jenkins开始并没着重说这个,我还以为没有。其实也是有的:参考 这里。感谢 这篇文章 给我的提示。此为高级主题,还没深入了解。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • Composer Repositories Composer源 Firegento - Magento模块Comp...
    零一间阅读 3,951评论 1 66
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,074评论 25 707
  • 秋,来了吗?嗯,她来了。她在哪儿呢?看,她在小竹芽们的眼睛里呢! 周五的秘密花园,我们手拉着手来看你:秋精灵,你好...
    MillaSong阅读 571评论 0 0
  • 山里的早晨是最容易起雾的,特别是冬季阴雨的高处。五点半出发到现在快八点了,一路山路,蒙蒙小雨,雾特别大,因为山路走...
    坐看云起淡然阅读 265评论 0 0