持续集成系列 - Github中的魔法工具:Travis CI

基础知识,参考博文:Jenkins

1. Travis-CI 简介

Travis-CI 是一个开源的持续构建项目,能够测试和部署;Travis-CI 会同步你在 GitHub 上托管的项目,每当你 Commit Push 之后,预装的编译脚本会分析你的 Xcode 项目,并对每个 target 进行编译.如果所有文件都没有编译错误,并且测试也没有被打断,那么项目就编译成功了.

对比 Jenkins
  • Jenkins 和 Travis-CI 类似,前者主要用于公司中项目的 CI(商业化),后者则主要用在 GitHub 中(小众)
  • 都是基于 Vagrant/Virtualbox技术
  • 配置文件:Jenkins 配置在 Jenkins 服务器中,后者配置文件和源码一起.使用 DSL 编写的
  • Travis Ci 与 Github 集成非常紧密,官方的集成测试托管只支持 Github 项目
  • 总的来说:如果是开源项目,放在 GitHub 上,使用 Travis CI 来做集成测试是最佳选择.但如果是公司项目,当然是搭建 Jenkins 环境.

2.Travis-CI 配置小教程

  • 1.用你的 GitHub 账号登录 Travis-CI,赋予 TCI 访问 GH 的授权.

对于私有仓库,需要注册一个 Travis 专业版账号

  • 2.登录之后 Travis-CI 就会同步 GitHub 账号的仓库,然后打开个人页面并给你想要构建的项目启用 Travis-CI

  • 3.创建一个 .travis.yml 文件,在项目的根目录下.则 Travis-CI 会按照 .travis.yml 里的内容进行构建

  • 4.最后可以在构建状态页面来查看你的项目是否构建成功

project 项目配置
language: swift # 语言种类
#language: objective-c 

osx_image: xcode8 # 环境

# 根据项目类型不同,可以选择两个 key :xcode_project 或者  xcode_workspace
xcode_project: ./UITEST.xcodeproj # 项目文件相对于.travis.yml文件的路径

xcode_scheme: UITEST # 你需要集成测试的scheme

xcode_sdk: iphonesimulator10.0 # 模拟器

workspace 管理的项目配置
language: swift # 语言种类
#language: objective-c 

osx_image: xcode8 # 环境

# 根据项目类型不同,可以选择两个 key :xcode_project 或者  xcode_workspace
xcode_workspace: ./UITEST.xcworkspace # 项目文件相对于.travis.yml文件的路径

xcode_scheme: UITEST # 你需要集成测试的scheme

xcode_sdk: iphonesimulator10.0 # 模拟器

同时也要设置 Target 为 shared 状态.

打开项目 -> Manage Schemes -> 把需要构建的 Target 勾上 shared -> 选中你需要管理的 scheme,点击左下角的 Edit 按钮 -> 选择 Build 选项,点击左下角的+号按钮,添加你需要依赖的 CocoaPods 管理的第三方静态库的名字,下图是已经添加后的截图.

以上配置,可以看看官方文档,写的挺详细的

3. 应用程序的签名\证书

[参见(https://objccn.io/issue-6-5/)

4.部署

负责分发部署的平台很多像:TestFlight \ HockeyApp \ 蒲公英 \ fir.im 等等

可以配置然后在上述平台进行部署.

密码和证书安全

对于密码等敏感信息,Travis CI提供了2种解决方案:

  • 对密码等敏感信息进行加密,然后再构建环境时解密
  • 在 Travis CI控制台设置环境变量,然后使用 System.getenv() 获取值

其他

显示构建状态

跳过自动构建

如果commit不想让travis ci构建,那么就在commit message里加上[ci skip]就行了。

git commit -m "[ci skip] commit message"

资源

-优秀的文章为 iOS 建立 Travis CI:签名+部署+发布 -备份版:优秀的文章为 iOS 建立 Travis CI:签名+部署+发布

为 iOS 建立 Travis CI: https://objccn.io/issue-6-5/

自动化测试 –> 持续部署

在互联网的产品开发时代,产品迭代越来越频繁,“从功能开发完成直到成功部署”这一阶段被称为软件开发“最后一公里”。很多开发团队也越来越认识到,自动化测试和持续部署可帮助开发团队提高迭代效率和质量。 那么,如何更好地解决“最后一公里”这一问题呢?

一切从自动化测试开始,让自动化测试贯穿在整个项目开发-集成-部署-交付的-开发流程中。

在这个分层自动化测试金字塔中,

Unit 代表单元测试:

XCTest是苹果在iOS 7和Xcode5引入的一个简单而强大的测试框架,它的测试编写起来非常简单,并且遵循xUnit风格。XCTest的优点是与Xcode深度集成,有专门的Test导航栏,但因为受限于官方测试API,因此功能不是很丰富。

iOS 中的单元测试开源库:

  • Kiwi是对XCTest的一个完整替代,使用xSpec风格编写测试。Kiwi带有自己的一套工具集,包括expectations、mocks、stubs,甚至还支持异步测试。
  • Specta与Kiwi功能相似,但在架构上非常不同。Kiwi注重功能的整合,而Specta则注重模块化。它本身只专注于运行测试,而将模拟、匹配等功能交给第三方。下 下面这些一些开源测试组件,它们能与Specta和Kiwi框架搭配使用:
  • Expecta:匹配程序框架。
  • OCHamcrest:匹配程序框架。
  • OCMock:模拟测试框架。
  • OCMockito:模拟测试框架。
  • OHTTPStubs:模拟网络请求的库,基于block的语法来匹配URL。
  • Nocilla:模拟网络请求的库,使用链式API。
  • Quick是:一个使用Swift开发的新测试框架,对测试使用Swift编写的App非常友好。它还有一个Nimble库用于编写匹配模式。

对软件中的最小可测试单元进行检验。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。相比其他层级的测试,单元测试发现并解决问题付出的成本相对来说最低,而投入产出比最高

UI 测试

  • KIF(Keep It Functional)是用Objective-C编写的用户界面测试框架。KIF tester使用了私有API来了解App中的视图层级。缺点是运行较慢。

相关文章:Swift中KIF测试的特点-b

  • Subliminal是另一款与XCTest集成的框架。与KIF不同的是,它基于UIAutomation编写,旨在对开发者隐藏UIAutomation中一些复杂的细节。不过它最后更新日期是2014年2月,可能已停止更新。

  • Calabash是跨平台开发工具Xamarin推出的一款测试工具。它使用BDD风格来编写验收测试。它的优点是支持跨平台(需使用不同的库),声明式的测试风格非常易于读写。缺点是不够稳定并且运行速度慢。

  • Service 代表服务集成测试: 集成测试是在单元测试的基础上,将所有模块按照设计要求(如根据结构图)组装成为子系统或系统,进行集成测试集成测试是在单元测试的基础上,测试在将所有的软件单元按照概要设计规格说明的要求组装成模块、子系统或系统的过程中各部分工作是否达到或实现相应技术指标及要求的活动。也就是说,在集成测试之前,单元测试应该已经完成。这一点很重要,因为如果不经过单元测试,那么集成测试的效果将会受到很大影响,并且会大幅增加软件单元代码纠错的代价。

  • 系统测试:将需测试的软件,作为整个基于计算机系统的一个元素,与计算机硬件、外设、某些支持软件、数据和人员等其他系统元素及环境结合在一起测试。系统测试的目的在于通过与系统的需求定义作比较,发现软件与系统定义不符合或与之矛盾的地方。

  • UI 代表页面级的功能测试: 页面展示逻辑及界面前端与服务展现层交互的集成验证.对于前端而言,不同的开发框架有不同的测试工具.

你是否曾经试着为 iOS 项目搭建一台支持持续集成的服务器,从我的个人经验而言,这可不是一个轻松的活。首先需要准备一台 Mac 电脑,并安装好全部所需的软件和插件。你要负责管理所有的用户账户,并提供安全保护。你需要授予访问仓库的权限,并配置所有的编译步骤和证书。在项目运行时期,你需要保持服务器的稳健和最新。

最后,原本你想节省的时间,会发现你花费了大量的时间去维护这台服务器。不过如果你的项目托管在 GitHub) 上,现在有了新的希望:Travis CI。该服务可以为你的项目提供持续集成的支持,也就意味着它会负责好托管一个项目的所有细节。在 Ruby 的世界中,Travis CI 已久负盛名。从 2013 年 4 月起,Travis 也开始支持 iOS 和 Mac 平台。

在 Ruby 的世界中,Travis CI 已久负盛名,从 2013 年 4 月起,Travis 也开始支持 iOS 和 Mac 平台。

在项目中集成 Travis CI,不仅包括项目的编译和单元测试的运行,还包括将应用部署到 Fir.im 的测试设备上。

UI自动化测试框架

一些第三方自动化测试框架则比较成熟,如Appium, MonkeyTalk,Frank等,这里介绍KIF和EarlGrey:开源\内嵌式框架 (以 framework 形式内嵌至应用中) , 本质上是iOS的Unit test \使用Object-C和Swift\支持真机和模拟器

  • EarlGrey:原生的 iOS UI 自动化测试框架,写法多样,操作灵活,作为后来者的EarlGrey功能更加强大.github/文档
  • KIF:出来早\KIF的语法比较简单\适合快速开发.github文档

iOS 自动化测试实践

###单元测试(Unit Testing)是针对程序单元进行正确性检验的测试工作,程序单元是应用的 最小可测试部件.

  • Expecta:专为Objective-C/Cocoa而生,相比OCHamcrest,其优化了匹配的语法,测试用例的可读性更高。
  • OCHamcrest:
  • GHUnit已被弃用,不能积极维护!使用XCTest来代替。
  • OCUnit,被官方集成进XCode 4.x版本中;

持续集成CI(Continuous Integration)是一种实践,可以让团队在持续的基础上收到反馈并进行改进,不必等到开发周期后期才寻找和修复缺陷.通俗一点儿说:就是指对于开发人员的每一次代码提交,都自动地把Repository中所有代码Check out到一个空目录,并且自动运行所有Test Case.如果成功则接受这次提交,否则告诉所有人,这是一个失败的Revision[2]

工具

而 JavaScript 作为一种客户端脚本语言,和传统编程语言 OC、Java 等相比,没有诸如 Xcode\Eclipse等集成开发调试环境,好在 JS 有较为丰富的测试单元测试框架:Buster.js\TestSwarm\JsTestDriver\Jasmine 等

  • 单元测试:Qunit\、Jasmine\Mocha
  • Jasmine: JS 测试框架,可进行单元测试等
  • Karma:自动化完成单元测试并执行代码覆盖率检测
  • Travis:完成基于github平台的CI持续集成
  • Jenkins: 自动化的构建
  • fir-cli: fir.im提供的简单工具,支持命令行进行打包分发
  • fir.im: http://fir.im__ 应用分发:目前支持 Android 和 iOS 应用的分发。

持续集成平台

这里列出的持续集成工具都是基于云平台的,因为自己搭建类似Jenkins这样的持续集成环境代价高昂。

下面的列表是目前支持iOS的主流CI(持续集成)平台。

  • Travis CI
  • Ship.io
  • Sauce Labs
  • Bitrise
  • Testdroid

持续集成(Continuous Integration) CI

持续集成是指个人开发的模块,向项目主体交付,频繁进行集成以便更快地发现其中的错误。

  • 全面的自动化测试。这是实践持续集成&持续部署的基础,同时,选择合适的自动化测试工具也极其重要;
  • 灵活的基础设施。容器,虚拟机的存在让开发人员和 QA 人员不必再大费周折;
  • 版本控制工具。如 Git,CVS,SVN 等;
  • 自动化的构建和软件发布流程的工具,如 Jenkins,flow.ci;
  • 反馈机制。如构建/测试的失败,可以快速地反馈到相关负责人,以尽快解决达到一个更稳定的版本。

持续交付 Continuous Delivery

持续交付在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的「类生产环境」(production-like environments)中。持续交付优先于整个产品生命周期的软件部署,建立在高水平自动化持续集成之上。 持续交付的好处 持续交付和持续集成的优点非常相似:

快速发布。能够应对业务需求,并更快地实现软件价值。 编码->测试->上线->交付的频繁迭代周期缩短,同时获得迅速反馈; 高质量的软件发布标准。整个交付过程标准化、可重复、可靠, 整个交付过程进度可视化,方便团队人员了解项目成熟度; 更先进的团队协作方式。从需求分析、产品的用户体验到交互 设计、开发、测试、运维等角色密切协作,相比于传统的瀑布式软件团队,更少浪费。

构建iOS持续集成平台(三)——CI服务器与自动化部署 fir.im weekly - 「 持续集成 」实践教程合集 谈谈持续集成,持续交付,持续部署之间的区别 使用Travis CI自动部署React Native项目(iOS篇) 构建iOS持续集成平台(三)——CI服务器与自动化部署为 iOS 建立 Travis CI iOS 持续集成 –Travis CI + Fir.im 自动编译发布 iOS 持续集成–Travis CI + Fir.im自动编译发布 为 iOS 建立 Travis CI 在Docker Hub上配置自动构建 利用pod trunk发布程序 使用GitLab来实现IOS项目的持续集成CI Jenkins + GitHub + fir-cli 一行命令从源码到 fir.im 用持续集成工具Travis进行构建和部署

fir.im

使用 fir CLI插件上传 Swift 应用至fir.im

Travis

相关的文章:Travis

持续部署 Continuous Deployment

fastlane 解决持续部署问题

官网 github 用 Travis CI 自動部署網站到 GitHub 在实际开发中,iOS开发\打包\发布流程:

  • 开发项目,单元测试
  • 模块开发,集成\UI 测试
  • Archive项目
  • 上传包到iTunes
  • 在iTunes后台提交版本截图\描述等信息(也可以在测试完成后配置)
  • 配置TestFlight,分发测试Beta版
  • 测试,改 bug
  • 测试完成,提交App Store审核

以上步骤虽然看着不多,但是每一步都有可能是一个大坑~ 其实可以使用 fastlane 解决以上问题;fastlane是一个完全开源的项目,现在被Twitter收购,是Fabric的一部分,主要是提供自动化构建和发布的一系列的工具集合,他包括iOS和Android工具集,由于我们只在iOS上使用,所以这里仅介绍一下iOS相关的工具:

deliver: 上传应用截图、metadata信息和ipa包到iTunes,提交审核
snapshot: 在所有分辨率的iOS设备上截图并上传iTunes
frameit: 快速地把应用截图放入设备框里
pem: 自动生成推送使用到的的profiles
sigh: 创建、更新、下载和修复provisioning profiles,支持App Store, Ad Hoc, Development和企业profiles,而且可以自动添加测试设备UDID
produce: 使用命令行在iTunes和Dev后台创建iOS app
cert: 自动化创建和维护你的iOS签名证书
pilot: 管理TestFlight的测试版本和测试设备
boarding: 自动创建一个表单来邀请参与TestFlight的用户
gym: 编译、打包iOS app,生成签名的ipa文件
match: 通过git在团队中共享和同步你的证书和profiles,避免团队开发经常遇到的iOS证书不一致的蛋疼问题
scan: 跑测试用例

上述gym, sigh, match等几个工具可以说是极大提高效率的神器。

使用 TestFlight 进行 App Beta 版测试 使用TestFlight进行App构建版本测试 onevcat testflight 持续部署是指当交付的代码通过评审之后,自动部署到生产环境中。持续部署是持续交付的最高阶段。这意味着,所有通过了一系列的自动化测试的改动都将自动部署到生产环境。它也可以被称为“Continuous Release”。

自动发布

  • Fastlane 是一组工具套件,旨在实现iOS应用发布流程的自动化,并且提供一个运行良好的持续部署流程.
  • 使用场景: push 时执行单元测试,集成测试;创建屏幕截图发给客户;构建分发 Beta 版本;构建并分发到 appstore;
  • 支持与Jenkins和CocoaPods,xctools等其他第三方工具的集成
  • 博客教程:http://www.infoq.com/cn/news/2015/01/fastlane-ios-continuous-deploy
  • 官方教程:https://docs.fastlane.tools/getting-started/ios/screenshots/

配置Travis CI

如果你的项目是托管在 Github 上,那么 Travis CI 是做持续集成非常好的选择。在 Ruby 的世界中,Travis CI 已久负盛名,从 2013 年 4 月起,Travis 也开始支持 iOS 和 Mac 平台。

首先需要将 github 的项目与 Travis 进行关联,

支持一下

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码支持一下

打开支付宝扫一扫,即可进行扫码打赏哦