使用Jenkins+Calabash+Cocoapods搭建iOS持续集成环境
使用jenkins+calabash+cocoapods搭建ios持续集成环境
持续集成
持续集成到底是什么呢?依据敏捷大师Martin Fowler的定义:
持续集成是一种软件开发实践。
在持续集成中,团队成员频繁集成他们的工作成果。一般每人每天至少集成一次,也能够多次。
每次集成会经过自己主动构建(包含自己主动測试)的检验,以尽快发现集成错误。
很多团队发现这样的方法能够显著降低集成引起的问题,并能够加快团队合作软件开发的速度。
仅仅要是开发就有分工,哪怕是自己一个写也要分成多个模块。
随着项目越来越大,模块也越来越多,各个模块能否够征程协作就成了问题,有了持续集成,能够有例如以下优点:
- 持续集成中的不论什么一个环节都是自己主动完毕的。无需太多的人工干预,有利于降低反复过程以节省时间、费用和工作量;
- 持续集成保障了每一个时间点上团队成员提交的代码是能成功集成的。换言之。不论什么时间点都能第一时间发现软件的集成问题,使随意时间公布可部署的软件成为了可能;
- 持续集成还能利于软件本身的发展趋势,这点在需求不明白或是频繁性变更的情景中尤其重要,持续集成的质量能帮助团队进行有效决策,同一时候建立团队对开发产品的信心。
以下就给大家介绍,怎样使用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 |
|
在文件夹运行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
这样新的測试目标就创建好了,为什么要创建新的目标呢?
- 不希望在公布的产品中包括測试代码
- calabash默认启动-cal结尾的目标
引入Calabash包
改动Podfile文件,增加新的pod
1 |
|
到命令行里。进入到自己的文件夹。运行
pod install --no-repo-update
运行成功后,创建用例模板
calabash-ios gen
屏幕会出现
1 |
|
按回车确认。就生成了features目录。我们的用例和測试配置都在这里了。
你能够把features这个目录拖到项目中,方便使用xcode直接编辑,注意不要选择不论什么目标。以为这些文件根本没有必要编译和存到app中。
编写用例
Cucumber是使用gherkin来进行用例描写叙述的。这是一种近乎自然语言的脚本。而且对多语言有非常好的支持。详细的语法能够查阅它的官方wiki。
这里我们先写一个简单用例,改动features/my_first.feature
1 |
|
是的。就是这种用例!
你能够书写自然语言来描写叙述一个功能。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 |
|
- 构建后的操作,选择Publish Cucumber test result report。指定报告的文件夹
test-reports/cucumber.json
之后点击应用,即完毕了配置
马上构建
还在等什么?立即点击立即构建吧。
。。
等待构建的过程中,我们能够查看控制台输出
模拟器也会在中途弹出。然后自己主动关闭
构建结束后,我们能够看到构建结果
结果展示了变更、由谁触发的构建和測试报告,很多其它的信息大家能够自行挖掘。总之构建是完毕了。
想要进行持续构建。须要设置成每一个一段时间自己主动构建。在Build periodically中配置就可以。
下一步该做什么?
在淌通了这一整套流程之后,事实上还是有非常多事情等着我们来做的。以下是几个样例:
- 为Jenkins创建用户管理
- 改动脚本,自己主动存放ipa并上传到特定server
- 配置构建策略,每日1次,或者多次,或者监听git变化,有上传就构建
- 配置邮件策略,使大家及时获得反馈
总之,拥抱集成測试吧
。
使用Jenkins+Calabash+Cocoapods搭建iOS持续集成环境的更多相关文章
- 使用VSTS/TFS搭建iOS持续集成环境
TFS 自2015版开始支持跨平台的持续集成环境,通过提供开源的build agent为 Windows / linux / macOS 提供了统一的持续集成环境管理能力.这篇文章给大家介绍一下如何使 ...
- Jenkins+MSbuild+SVN实现快速搭建.net持续集成环境(构建、编辑、部署到服务器)
Jenkins是一个可扩展的持续集成引擎,Jenkins非常易于安装和配置,简单易用,下面开始搭建.net持续集成环境 Jenkins和SVN安装这里就不介绍了 一.准备工作 1.Jenkins中系统 ...
- Docker——Jenkins + Git + Registry构建自动化持续集成环境(CI/CD)
前言 在互联网时代,对于每一家公司,软件开发和发布的重要性不言而喻,目前已经形成一套标准的流程,最重要的组成部分就是持续集成(CI)及持续部署.交付(CD). 本文基于Jenkins+Docker+G ...
- jenkins下搭建c++持续集成环境
运行环境为centos 5.8 1.下载tomcat,并解压 2.下载jenkins,把jenkins.war放到tomcat的webapp目录下 3.在tomcat的bin目录下执行./star ...
- CI Weekly #21 | iOS 持续集成快速入门指南
搭建 iOS 持续集成环境要多久?每个 iOSer 都有不同的答案.这次我们整理了 flow.ci 的 iOS 持续集成的相关文档和最佳实践,希望帮你更快地完成构建.更新文档见: flow.ci iO ...
- 一步一步构建iOS持续集成:Jenkins+GitLab+蒲公英+FTP
什么是持续集成 持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每次集成都通过自动化的构建(包括编译,发布,自动化测试)来 ...
- Jenkins+MSbuild+SVN实现dotnet持续集成 快速搭建持续集成环境
Jenkins是一个可扩展的持续集成引擎,Jenkins非常易于安装和配置,简单易用,下面开始搭建dotnet持续集成环境 一.准备工作 1.系统管理-->管理插件-->可选插件中找到MS ...
- Jenkins+Maven+SVN快速搭建持续集成环境(转)
Jenkins是一个可扩展的持续集成引擎,Jenkins非常易于安装和配置,简单易用,下面看看我们是如何几分钟就快速搭建一个持续集成环境吧. 假设我们目前已经有2个maven项目:entities(J ...
- 使用Jenkins来实现内部的持续集成流程(上)
前言 Jenkins和TeamCity都是大杀器,用于搭建内部持续集成环境都是妥妥的.本篇主要介绍Jenkins的安装,下篇将介绍相关配置和使用. 目录 安装和配置 第一次启动 插件安装,第一次进入时 ...
随机推荐
- 物理和虚拟兼容性RDM的区别
Difference between Physical compatibility RDMs and Virtual compatibility RDMs (2009226) Purpose This ...
- Oracle中DBMS_LOB包使用小结
本文主要介绍oracle数据库中dbms_lob包的使用以及使用dbms_lob包来维护lob数据库类型的基本方法.随着社会的发展,在现代信息系统的开发中,需要存储的已不仅仅是简单的文字信息,同时还包 ...
- YYH的营救计划(NOIP模拟赛Round 6)
题目描述 “咚咚咚……”“查水表!”原来是查水表来了,现在哪里找这么热心上门的查表员啊!YYH感动的热泪盈眶,开起了门…… YYH的父亲下班回家,街坊邻居说YYH被一群陌生人强行押上了警车!YYH的父 ...
- 第一部分:MongoDB备忘录
一.NoSQL 简介 Nosql的全称是Not Only Sql,这个概念早起就有人提出,在09年的时候比较火.Nosql指的是非关系型数据库,而我们常用的都是关系型数据库.就像我们常用的mysql, ...
- Fiddler抓包2-只抓APP的请求【转载】
本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/p/6582437.html 前言 fiddler抓手机app的请求,估计大部分都会,但是如何只 ...
- 一篇需要膜拜的文篇--Javascript异步编程模型进化(转)
要我能用得这么熟, 那前端出师了哈. http://foio.github.io/javascript-asyn-pattern/ 改天一个一个亲测一下. Javascript语言是单线程的,没有复杂 ...
- Python与数据库[1] -> 数据库接口/DB-API[1] -> MySQL 适配器
MySQL适配器 / MySQL Adapter MySQL是一种关系型数据库,下面主要介绍利用如何利用Python的MySQL适配器来对MySQL进行操作,其余内容可参考文末相关阅读. 1 MySQ ...
- 扩展欧拉定理【p4139】上帝与集合的正确用法
Description 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做"元". 第二天, 上帝创造了一个新的元素,称作&quo ...
- 理解boot.img与静态分析Android/linux内核
一些尝试和理解. 1>提取boot.img: 其中,msm代表是高通的芯片,msm_sdcc.1是外接的SD卡挂载的目录,by-name指的是这个sd卡分区的名称.下面几行代表每个分区存储的东西 ...
- POJ 1769 Minimizing maximizer(DP+zkw线段树)
[题目链接] http://poj.org/problem?id=1769 [题目大意] 给出一些排序器,能够将区间li到ri进行排序,排序器按一定顺序摆放 问在排序器顺序不变的情况下,一定能够将最大 ...