zoukankan      html  css  js  c++  java
  • 使用Jenkins+Calabash+Cocoapods搭建iOS持续集成环境



    使用jenkins+calabash+cocoapods搭建ios持续集成环境


    持续集成

    持续集成到底是什么呢?依据敏捷大师Martin Fowler的定义:

    持续集成是一种软件开发实践。

    在持续集成中,团队成员频繁集成他们的工作成果。一般每人每天至少集成一次,也能够多次。

    每次集成会经过自己主动构建(包含自己主动測试)的检验,以尽快发现集成错误。

    很多团队发现这样的方法能够显著降低集成引起的问题,并能够加快团队合作软件开发的速度。

    仅仅要是开发就有分工,哪怕是自己一个写也要分成多个模块。

    随着项目越来越大,模块也越来越多,各个模块能否够征程协作就成了问题,有了持续集成,能够有例如以下优点:

    1. 持续集成中的不论什么一个环节都是自己主动完毕的。无需太多的人工干预,有利于降低反复过程以节省时间、费用和工作量;
    2. 持续集成保障了每一个时间点上团队成员提交的代码是能成功集成的。换言之。不论什么时间点都能第一时间发现软件的集成问题,使随意时间公布可部署的软件成为了可能;
    3. 持续集成还能利于软件本身的发展趋势,这点在需求不明白或是频繁性变更的情景中尤其重要,持续集成的质量能帮助团队进行有效决策,同一时候建立团队对开发产品的信心。

    以下就给大家介绍,怎样使用Jenkins+Calabash搭建持续集成开发环境。

    环境

    XCode 5.0

    Mac OS X 10.9.2

    Cocoapods

    CocoaPods简单介绍

    CocoaPods是一个负责管理iOS项目中第三方开源代码的工具。CocoaPods项目的源代码在Github上管理。该项目開始于2011年8月12日。经过一年多的发展。如今已经超过1000次提交,而且持续保持活跃更新。

    开发iOS项目不可避免地要使用第三方开源库。CocoaPods的出现使得我们能够节省设置和更新第三方开源库的时间。

    安装Cocoapods

    安装Homebrew

    Homebrew是Mac下著名的包管理工具,RVM和以后用到xctool都须要用这个来安装,相当于Ubuntu的Apt-get。

    安装方法是在命令行中键入

    ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
    

    之后运行环境检查

    brew doctor
    

    检查没有错误就能够使用了,假设出现错误。请參考提示进行修正。

    确认无误后,能够安装第一个应用curl,一个用来下载的工具。

    使用命令

    brew install curl
    

    安装RVM

    尽管Mac默认都带有Ruby,可是有些时候使用起来非常麻烦(比如必须使用sudo来安装gem)而且仅仅有一个版本号,所以我们使用RVM来管理ruby的版本号,ruby是自己主动化測试工具calabash的执行环境,所以必需要有。

    安装方法是命令行中键入

    curl -sSL https://get.rvm.io | bash -s stable
    

    过程中可能须要输入sudopassword。

    使用淘宝源替换

    sed -i .bak 's!cache.ruby-lang.org/pub/ruby!ruby.taobao.org/mirrors/ruby!' $rvm_path/config/db
    

    安装Ruby

    使用rvm下载ruby2.0版本号

    rvm install 2.0.0
    

    选用2.0.0版本号的ruby,并设置为默认

    rvm use 2.0.0 --default
    

    使用淘宝源替换gem源

    rvm source --add http://ruby.taobao.org/
    rvm source --remove https://rubygems.org/
    

    安装Cocoapods

    CocoaPods是一个用来帮助我们管理第三方依赖库的工具。

    它能够解决库与库之间的依赖关系。下载库的源码,同一时候通过创建一个Xcode的workspace来将这些第三方库和我们的project连接起来,供我们开发使用。

    通过Gem安装Cocoapods

    gem install cocoapods
    

    运行cocoapods的初始化

    pod setup
    

    该过程须要到github上拉取specs。速度非常慢,能够喝杯咖啡慢慢等

    使用Cocoapods

    首先创建一个普通项目来演示下怎样使用Cocoapods。


    之后在命令行里面,进入到你的项目路径

    cd /path/to/your/project
    pod init
    

    之后会在项目根文件夹下创建好Podfile,改动下Podfile的内容

    1
    2
    3
    4
    
     # #为Podfile的凝视行。Podfile实际上是一个ruby代码段
     platform :ios, "6.0" # platform后面跟平台和版本,这里是ios6平台
     
     # pod 'MKNetworkKit' 像这样写就能够引入第三方库了。为了简化。这里没有引入不论什么库

    在文件夹运行pod插件install命令

    pod install 
    

    每次使用pod install,它都会到github上更新spec库,耗费了不少时间。能够使用以下的命令跳过这个过程

    pod install --no-repo-update
    

    运行之后,会提示没有引入不论什么的第三方库,不要操心(由于我们真的没有引入)。你会发现文件夹上多了integration_test.xcworkspace这个工作区文件。以后我们就都使用这个打开项目了。

    打开后如图所看到的

    恭喜您,已经能够正常使用Cocoapods了。下一步就是使用Calabash进行自己主动化測试了。

    Calabash

    Calabash是一款开源的跨平台UI測试工具。眼下支持iOS和Android。

    它使用Cucumber作为測试核心,Cucumber是一个在敏捷团队十分流行的自己主动化的功能測试工具,它使用接近于自然语言的特性文档进行用例的书写和測试,支持多语言和多平台。

    安装Calabash

    gem install calabash-cucumber
    

    安装Calabash中文支持包

    gem install calabash-cucumber-cn
    

    新建集成測试的Target

    又一次打开工作区,然后选择integration_test这个project。打开配置,targets中integration_test上右键进行复制。



    假设出现Duplicate iPhone Target对话框。选择Duplicate Only就能够,另外一个选项是复制并转换成iPad程序。

    之后改动目标的名称

    改动项目配置 

    改动scheme

    共享scheme,目的是在版本号管理中。让其它用户也能够获取到这些scheme

    这样新的測试目标就创建好了,为什么要创建新的目标呢?

    1. 不希望在公布的产品中包括測试代码
    2. calabash默认启动-cal结尾的目标

    引入Calabash包

    改动Podfile文件,增加新的pod

    1
    2
    3
    
    target 'integration_test-cal', exclusive: false do
      pod 'Calabash'
    end

    到命令行里。进入到自己的文件夹。运行

    pod install --no-repo-update
    

    运行成功后,创建用例模板

    calabash-ios gen
    

    屏幕会出现

    1
    2
    3
    4
    5
    
    ----------Question----------
    I'm about to create a subdirectory called features.
    features will contain all your calabash tests.
    Please hit return to confirm that's what you want.
    ---------------------------

    按回车确认。就生成了features目录。我们的用例和測试配置都在这里了。

    你能够把features这个目录拖到项目中,方便使用xcode直接编辑,注意不要选择不论什么目标。以为这些文件根本没有必要编译和存到app中。

    编写用例

    Cucumber是使用gherkin来进行用例描写叙述的。这是一种近乎自然语言的脚本。而且对多语言有非常好的支持。详细的语法能够查阅它的官方wiki

    这里我们先写一个简单用例,改动features/my_first.feature

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    # language: zh-CN  
    功能: 执行基准測试
      做为一个iOS开发人员
      我希望有一个简单的基准測试
      使我能够高速的开启測试
    
    场景: 基准測试
      假如 应用正在执行
      那么 我把应用切到后台3秒

    是的。就是这种用例!

    你能够书写自然语言来描写叙述一个功能。calabash就使用cucumber帮您測试了,奇妙吧。

    接下来还须要改动features/step_definitions/calabash_steps.rb,在这里包括中文解析,在最以下加上

    require 'calabash-cucumber-cn/calabash_steps.rb'
    

    这个包里面带有中文的功能说明,详细能够看文档

    运行用例

    激动人心的时刻最终到了。首先编译integration_test-cal这个scheme,然后使用模拟器执行一下。在模拟器打开Accessibility Inspector。模拟器->设置(Settings)–>通用(General)–>辅助功能(Accessibity)–>Accessibility Inspector开启。

    打开命令行。进到文件夹中运行命令

    cucumber
    

    可能须要输入password。之后就看到模拟器又一次载入,并依照我们的用例開始自己主动运行了。

    运行结束后。会有下图的结果。

    恭喜我们的2个步骤都成功了。快点用很多其它的功能和用例来測试吧^_^。

    到这里,每一个开发者都能够通过cucumber命令来对自己写的内容进行測试了。这和我们的持续集成另一段距离,那么接下来,我们介绍Jenkins这个持续集成web工具,实现真正的持续集成。

    Jenkins

    Jenkins 是一个开源项目,提供了一种易于使用的持续集成系统,使开发人员从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上。同一时候 Jenkins 能实施监控集成中存在的错误,提供具体的日志文件和提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性。

    XCTool

    使用Jenkins进行持续集成之前,另一个前提,就是编译这个过程须要自己主动化,中途用xcode手动点的不行,所以我们须要有命令能够一次编译我们的project。这里我们使用xctool这个工具。是facebook写的一个集成工具,用来编译和打包程序的。

    安装方法是使用homebrew。在命令行运行

    brew install xctool
    

    安装好在程序文件夹下測试一下能否够编译

     xctool -workspace integration_test.xcworkspace -scheme integration_test-cal -sdk iphonesimulator7.1 clean build
    

    注意这里的sdk每一个人可能不同。要依据本机安装的sdk来写 。 查看的方法是运行命令

    xcodebuild -showsdks
    

    假设显示** BUILD SUCCEEDED **那么能够进入下一步了。

    Jenkins

    安装jenkins还是使用brew

    brew install jenkins
    

    安装好之后,能够通过使用命令行启动

    java -jar /usr/local/opt/jenkins/libexec/jenkins.war
    

    假设想自己主动启动。须要先运行下面命令。创建启动项

    ln -sfv /usr/local/opt/jenkins/*.plist ~/Library/LaunchAgents
    

    能够编辑一下~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist这个文件

    open ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
    

    想要让局域网都能够訪问,须要把—httpListenAddress=127.0.0.1改成自己的局域网IP

    手动启动启动项能够运行

    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
    

    之后用浏览器就能够訪问http://localhost:8080/来登录jenkins了

    Jenkins启动之后,能够配置用户权限,可是我们为了简单。先不配置用户。

    Jenkins Plugin

    Jenkins有一个非常方便的功能,就是能够通过插件形式进行扩展,为了支持我们的持续集成。我们须要先安装必要的插件。

    进入Jenkins网页的系统管理->插件管理->高级。找到右下角的“马上获取”就能够获得全部的插件信息了。

    更新好之后,在可选插件里面,安装例如以下插件

    Git Server Plugin               #Git的支持,假设用svn就不须要了
    Git Client Plugin               #Git的支持。假设用svn就补须要了
    Rvm                             #载入RVM环境变量以有用ruby的cucumber命令
    Cucumber Test Result Plugin     #解析Cucumber的測试报告
    

    记得安装时勾选更新完自己主动重新启动

    至此,我们持续集成的全部环境应该都满足了。

    托管你的项目

    Jenkins一定要从一个地方获得一份软件副本的,所以,要想使用持续集成,必需要有一个版本号管理工具,在Jenkins中成为scm。我们的样例使用git。而且我已经将測试project上传到CODEserver上,地址在这里:https://code.csdn.net/zangcw/integration_test

    创建一个项目

    当你的源码已经在代码托管server上之后,如今就能够在jenkins创建一个项目了。
    我们创建一个自由风格的软件项目

    而且对其配置

    主要配置例如以下内容:

    • 源代码管理,演示样例中配置为https://code.csdn.net/zangcw/integration_test.git
    • 构建环境。要勾选RVM,否则没有办法在脚本中运行cucumber这个命令
    • 构建脚本,选择Execute shell,内容例如以下。请依据须要自行改动
    1
    2
    3
    4
    
    cd $WORKSPACE
    /usr/local/bin/xctool -workspace integration_test.xcworkspace -scheme integration_test-cal -sdk iphonesimulator7.1 clean build
    mkdir -p test-reports
    cucumber --format json -o test-reports/cucumber.json
    • 构建后的操作,选择Publish Cucumber test result report。指定报告的文件夹test-reports/cucumber.json

    之后点击应用,即完毕了配置

    马上构建

    还在等什么?立即点击立即构建吧。

    。。

    等待构建的过程中,我们能够查看控制台输出

    模拟器也会在中途弹出。然后自己主动关闭

    构建结束后,我们能够看到构建结果

    结果展示了变更、由谁触发的构建和測试报告,很多其它的信息大家能够自行挖掘。总之构建是完毕了。

    想要进行持续构建。须要设置成每一个一段时间自己主动构建。在Build periodically中配置就可以。

    下一步该做什么?

    在淌通了这一整套流程之后,事实上还是有非常多事情等着我们来做的。以下是几个样例:

    1. 为Jenkins创建用户管理
    2. 改动脚本,自己主动存放ipa并上传到特定server
    3. 配置构建策略,每日1次,或者多次,或者监听git变化,有上传就构建
    4. 配置邮件策略,使大家及时获得反馈

    总之,拥抱集成測试吧

  • 相关阅读:
    Jmeter分离登录事务的另一种方式
    数据驱动 vs 关键字驱动:对搭建UI自动化测试框架的探索
    使用jmeter往指定文件中插入一定数量的数据
    JMeter 各组件介绍以及用法
    JVM(2) Java内存溢出异常
    JVM(1) Java内存区域
    OptimalSolution(1)--递归和动态规划(4)其他问题
    MySQL开发篇(5)索引、视图、触发器、SQL中的安全问题、SQL Mode、
    OptimalSolution(1)--递归和动态规划(3)数组和字符串问题
    OptimalSolution(1)--递归和动态规划(2)矩阵的最小路径和与换钱的最少货币数问题
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7258962.html
Copyright © 2011-2022 走看看