CI(Continue Integrate)自动化持续集成和发布

  • 引言

    在App项目中频繁的发布版本可能是一件比较头疼的问题。经常会有客户追着PM要版本,PM追着测试要版本,测试又去追着开发要版本的情况,要是哪天赶上开发跑肚拉稀,生病住院,那整个项目都会delay。这个场景相信很多同事都遇到过。但是大家有没有想过,开发每天要应对各种需求变更,还要编写设计文档,实现具体功能,修改bug,发布版本,工作属实是有些繁杂。那么如何解放双手,提升效率呢?进化论有言:人动物最根本的区别是能否使用工具。那么让我们一起来学习自动化集成工具吧!

  • Continue Integration是什么

    软件开发项目中最为稀缺的资源是什么——时间。在有限的时间内,减少出错,提升开发效率,避免重复劳动,让机器替人完成必要的工作这才是我们开发的意义所在。CI的出现就是为了解决这个问题。它可以把Release Version ,Code Review,Uint Test,Destribuion等等工作都集中到一起去自动化执行。说完了大概念,我们来说点实际的。CI有几种是实现方案?老牌的当然就是大名鼎鼎的Jenkins。不过业界有两个非常优秀的 Jenkins 替代产品 travis-ci 和 circle-ci。他们对 GitHub 的支持完美,且对开源项目是免费的,不过私有项目则需要付费试用。本文主要是针对时下使用最为广泛的Jenkins展开,毕竟老牌的信誉值得信赖。

  • CI 适合哪些项目

    工欲善其事,必先利其器。但是有个前提就是这个兵器首先要趁手,要适合。CI是一套相对比较复杂的系统,搭建和使用都会有一定的成本。所以并不是所有项目都适合加入CI。这里我大致整理了一下CI的使用场景,供大家参考。

  1. 项目处于开发的中后期,已经形成比较稳定的版本。
  2. 开发团队和测试团队要具有一定的规模
  3. 适合于迭代开发和迭代测试
  4. 适用于项目频繁发版,而且是存在多渠道包的情况
  5. 适合于运营时间长,代码量比较大的项目

  总之使用CI需要项目具有一定的量如果你只是一个人想做个Demo,那还是算了吧。

  • CI的具体搭建方案

    CI的搭建也是很灵活的,大家可以根据当前公司的资源情况来决定。由于iOS需要在Mac OS环境下编译,所以如果公司资源充足建议用 Mac 服务器,利用Xcode Server去集成构建。这种方案搭建起来最简单,提供可视化的界面,也不用单独引入Jinkens来构建,当属土豪级的方案。但是Xcode Server苹果一直也没有推广和深入开发,所以国内公司用的也不多。言归正题,不是土豪的我们还是老老实实的用Jenkins吧。那没有Mac服务器怎么办?——拆分功能。我的具体方案是用一台闲置的 Macbook Pro 做Build Server。然后利用本地服务器或第三方做发布服务器,这里考虑到搭建和维护的成本,采用的是蒲公英作为发布服务器。具体的部署方案如下。主要的工作流程是由用户配置构建方案,编译周期等参数。然后由BuildServer到SVN或Git拉取最新的代码,运行代码检查,单元测试和打包App。最后将成果物上传到Distribution Server,并通知开发和测试人员获取最新的d

  • 搭建和使用CI

    搭建部分网上资料很多,大家可以很容的就能查到,这里我只是简单的梳理一下搭建的流程,以便后续CI过程中出现问题,我们可以快速的定位问题出现在那个步骤:

  1. 配置Java环境,Jenkins是基于Java运行的
  2. 下载Jenkins,可以通过Home brew,也可以直接官网下载安装包,或直接下载war包。我直接下载的就是war包,优势就是无需安装,一键启动。启动终端,cd到Jenkins目录,输入 java -jar Jenkins.war。
  3. 浏览器打开 local:8080 创建用户名密码,就可以开始创建工程了。这里我就创建了一个Freestyle的项目工程,命名为ESI。
  4. 然后安装插件。针对搭建的iOS/Android持续集成打包平台,我使用到了如下几个插件。
    • GIT plugin
    • SSH Credentials Plugin
    • Git Changelog Plugin: 获取仓库提交的commit log
    • build-name-setter:用于修改Build名称
    • description setter plugin:用于在修改Build描述信息,在描述信息中增加显示QRCode(二维码)
    • Post-Build Script Plug-in:在编译完成后通过执行脚本实现一些额外功能
    • Xcode integration: iOS专用(可选)
    • Gradle plugin: Android专用(可选)
  5. 创建Job,配置项目。在配置页面里面可以配置Git或SVN路径,设置触发时机,构建配置,以及构建后续操作。这里我用Git维护的代码,并设置触发时机。
    • 配置Git/SVN代码仓库
    • 配置构建触发器
    • 配置构建方式
    • 构建后处理
    • 成果物收集

      详细步骤可以参照:http://debugtalk.com/post/iOS-Android-Packing-with-Jenkins/

  6. 编写脚本。之前几步都是准备工作,真正的难点在编译脚本的编写。这需要根据具体的项目情况编写。iOS需要xcodebuild来完成自动编译,而且每次xcode版本的更新都需要运维去更新脚本,来适应最新的编译流程。我这里根据项目的需要提供了两个编译脚本,可以当前最新的 xcodebuild 文档可以参考这个:http://www.matrixprojects.net/p/xcodebuild-export-options-plist/。当然大家也可以采用Jenkins的插件Xcode integration插件进行构建,配置会比较复杂,需要在Jenkins中导入开发证书,并填写多个配置项。不过,如果是采用打包脚本进行构建的话,情况就会简单许多。只要在Jenkins所运行的计算机中安装好开发者证书,打包命令在Shell中能正常工作,那么在Jenkins中执行打包脚本也不会有什么问题。
  7. 版本发布。完成构建后,生成的编译成果物(ipa/apk)会位于指定的目录中。但是,如果要直接在手机中安装iPA/APK文件还比较麻烦,不仅在分发测试包时需要将好几十兆的安装包进行传送,体验用户在安装时也还需要通过数据线将手机与计算机进行连接,然后再使用PP助手或豌豆荚等工具进行安装。

        当前比较优雅的一种方式是借助蒲公英(pgyer)或fir.im等平台,将iPA/APK文件上传至平台后由平台生成二维码,然后只需要对二维码链接进行分发,体验用户通过手机扫描二维码后即可实现快速安装,效率得到了极大的提升。

  • 总结

    本文主要是对如何使用Jenkins搭建iOS/Android持续集成打包平台的基础概念和实施流程进行了介绍。目的是让大家了解CI,使用CI,让ci成为我们开发的一部分,在方便我们工作的同时,也提高了我们工作的效率。本文没有描述具体的搭建细节,脚本的实现等等,如果大家有具体的细节问题欢迎提问。当然CI还有很多可以拓展的功能没有提到,例如CodeReview,UintTest等等。这些功能就留给后续有时间慢慢研究吧。

你可能感兴趣的:(IOS,Android,ios,自动化,发布,CI,Jenkins)