使用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. 配置邮件策略,使大家及时获得反馈

总之,拥抱集成測试吧

使用Jenkins+Calabash+Cocoapods搭建iOS持续集成环境的更多相关文章

  1. 使用VSTS/TFS搭建iOS持续集成环境

    TFS 自2015版开始支持跨平台的持续集成环境,通过提供开源的build agent为 Windows / linux / macOS 提供了统一的持续集成环境管理能力.这篇文章给大家介绍一下如何使 ...

  2. Jenkins+MSbuild+SVN实现快速搭建.net持续集成环境(构建、编辑、部署到服务器)

    Jenkins是一个可扩展的持续集成引擎,Jenkins非常易于安装和配置,简单易用,下面开始搭建.net持续集成环境 Jenkins和SVN安装这里就不介绍了 一.准备工作 1.Jenkins中系统 ...

  3. Docker——Jenkins + Git + Registry构建自动化持续集成环境(CI/CD)

    前言 在互联网时代,对于每一家公司,软件开发和发布的重要性不言而喻,目前已经形成一套标准的流程,最重要的组成部分就是持续集成(CI)及持续部署.交付(CD). 本文基于Jenkins+Docker+G ...

  4. jenkins下搭建c++持续集成环境

      运行环境为centos 5.8 1.下载tomcat,并解压 2.下载jenkins,把jenkins.war放到tomcat的webapp目录下 3.在tomcat的bin目录下执行./star ...

  5. CI Weekly #21 | iOS 持续集成快速入门指南

    搭建 iOS 持续集成环境要多久?每个 iOSer 都有不同的答案.这次我们整理了 flow.ci 的 iOS 持续集成的相关文档和最佳实践,希望帮你更快地完成构建.更新文档见: flow.ci iO ...

  6. 一步一步构建iOS持续集成:Jenkins+GitLab+蒲公英+FTP

    什么是持续集成 持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每次集成都通过自动化的构建(包括编译,发布,自动化测试)来 ...

  7. Jenkins+MSbuild+SVN实现dotnet持续集成 快速搭建持续集成环境

    Jenkins是一个可扩展的持续集成引擎,Jenkins非常易于安装和配置,简单易用,下面开始搭建dotnet持续集成环境 一.准备工作 1.系统管理-->管理插件-->可选插件中找到MS ...

  8. Jenkins+Maven+SVN快速搭建持续集成环境(转)

    Jenkins是一个可扩展的持续集成引擎,Jenkins非常易于安装和配置,简单易用,下面看看我们是如何几分钟就快速搭建一个持续集成环境吧. 假设我们目前已经有2个maven项目:entities(J ...

  9. 使用Jenkins来实现内部的持续集成流程(上)

    前言 Jenkins和TeamCity都是大杀器,用于搭建内部持续集成环境都是妥妥的.本篇主要介绍Jenkins的安装,下篇将介绍相关配置和使用. 目录 安装和配置 第一次启动 插件安装,第一次进入时 ...

随机推荐

  1. Python学习笔记(Django篇)——4、继续完善视图层

    在demo/views.py中添加这些代码: def detail(request, question_id): returnHttpResponse("You're looking at ...

  2. Python之多线程:线程互斥与线程同步

    一.锁在多线程中的使用:线程互斥 lock = threading.Lock()#创建一个锁对象 1.with lock: pass 和进程使用的方式相同   2.控制线程结束的时间 通过一个全局变量 ...

  3. tips 前端 点击事件

    新手总是时不时会纠结一下 点击事件 我们都知道这些小东西不难 但是偶尔难道不会想想我们可能对这些即使小kiss的问题的认知其实不够清晰 一个认识不清晰的东西使用时 总会有油然而生的不安感 从而用的不放 ...

  4. 创建型设计模式之建造者模式(Builder)

    结构 意图 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 适用性 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时. 当构造过程必须允许被构造的对象有不 ...

  5. HTML中打开新页面的方法

    HTML跳转新窗口的方法 笔试遇到这样的一个问题,特意整理一下. 方法一 纯HTML <a href="http://www.cnblogs.com" target=&quo ...

  6. JS操作checkBox

    代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w ...

  7. [MySQL] 参数: innodb_flush_log_at_trx_commit和sync_binlog

    MySQL参数: innodb_flush_log_at_trx_commit和sync_binlog innodb_flush_log_at_trx_commit和sync_binlog是MySQL ...

  8. vue学习之环境配置

    最近在学习vue,就顺手记录一下... 1. 安装 nodejs https://nodejs.org   -->注:安装LTS的(LTS为长期稳定版本) 在cmd中输入 node -v 如果显 ...

  9. 解决:java.lang.ArrayIndexOutOfBoundsException: 160 at com.alibaba.fastjson.serializer.SerializeWriter.writeStringWithDoubleQuote(SerializeWriter.java:868)

    今天线上遇到一个问题,从hbase里读取出来的数据在转换json后输出时出现异常: java.lang.ArrayIndexOutOfBoundsException: 160 at com.aliba ...

  10. python3正则表达式符号和用法