iOS 使用 Jeninks + Fir.im 实现 CI

8月份的时候有个需求,需要将 iOS 项目持久化构建,方便将打包上传安装程序的工作从开发人员手中脱离出来(关爱猿类、解救开发)。

需求来了,就简单分析下,实现这种需求需要以下两步:

  1. 自动编译打包,而不再是在 Xcode 中编译打包(xcodebuild, [xctool](https://github.com/facebook/xctool))
  2. 将 ipa 包上传到服务器或者 Fir.im / Pgyer 这种托管网站供下载

除了自己写脚本实现外,也有一些成熟的方案,如 Jenkins

先放出最终 OK 的的方案:

1. 使用 [Jenkins](http://jenkins-ci.org/) 从 Git 上拉取代码
2. 使用 [Fir.im CLI](http://club.fir.im/topic/54f3d26074c4c85e73e4ac14) 提供的打包程序进行打包和上传

说干就干,

  • 安装 Jenkins(具体过程不赘述,网上一票)
  • 打开http://localhost:8080/启动 Jenkins
  • 安装Xcode integration,GIT plugin,Post-Build Script Plug-in,GitHub plugin四个插件(使用 Fir.im 的 CLI 可不需要安装 Xcode integration
  • 新建一个项目,录入基本信息,Git 的地址与分支
  • 增加构建步骤 -> Execute shell:

    fir b 项目路径 -w -S Scheme名称 -p -T Fir.im API Token

  • 保存构建即可

当然这只是百般折腾后的得出的正确路线,因为项目是集成了 Cocoapods,所以遇到不少网上没有的坑。

最开始我在构建步骤里面添加了 Xcode 相关的信息,结果每次构建都会一直卡死在某个进度上。多番折腾下,仍然未果,因为项目进度与考虑到无 OS X 服务器可以用来构建,无奈放弃。

最近比较闲,再个 OS X 服务器也摆那有一阵了,手痒便折腾了一下。

这次依然遇到那个卡死的问题,我尝试了只用 Xcode 构建步骤,也尝试只用 Fir.im CLI,均有各种错误。后来尝试先脱离 Jenkins,直接本地编译。遇到以下几个坑:

我的命令是 fir build_ipa ${WORKSPACE} -S MyApp -o ${WORKSPACE}/build -w -C Release -t MyApp -n myapp

  • 还是卡住,尝试去掉 workspace 路径和 Target,变成fir build_ipa -S MyApp -o ${WORKSPACE}/build -w -C Release -n myapp
  • 运行后不会卡住,但是报了error: couldn't create directory /build: Permission denied. Failed to create temporary outfile '/build/MyApp.app.dSYM.tmp%%%%%%.dwarf': No such file or directory错误,已经好很多了。继续简化步骤,索性直接前往项目目录下,然后使用fir b -w -S MyApp,结果居然 OK 了。
  • 继续在 Jenkins 中折腾,删除 Xcode 的构建步骤,然后在 Execute Shell 中使用fir b 项目路径 -w -S Sheme名称 -p -T token
  • 报 Cocospods Lock File 错误,可以手动pod install一次,也可以将 Lock File 同步,这样就可以避免这个问题。

最终解决!回望整个过程是折腾的, 不过有几点可以记住:

  • 项目 clone 到本地后,先在 Xcode 中编译运行试试,有问题及时解决
  • 在命令行里面试试编译、打包,看是否正常
  • 上面都 OK 再在 Jenkins 这种集成平台中集成

全文完。