为了项目的持续集成,最近为公司的iOS项目集成了Travis CI,并实现上传iTunes Connect(或者其他指定的服务器)。
主要参考文章:http://objccn.io/issue-6-5/,这是一篇objc中国的翻译文章,原文出处里面都有。里面基本讲述了集成Travis的流程,只是原文是2013年的,有点老吧。
在使用中主要遇到的问题和需要注意的地方有大概以下这些:
1、如果在执行脚本是遇到脚本异常时,应该检查该文件的格式:用vi打开该文件,:之后输入set ff查看格式,如果是dos要改为unix,这个跟编辑器有关系。(参考:http://www.cnblogs.com/pipelone/archive/2009/04/17/1437879.html)
2、除了这些问题之外,在编辑travis.yml时可能会遇到一些语法问题,如缩进也是yml的语法,单引号和双引号的使用等,具体可以查看yml语法,或者跟objc教程保持一样的格式就可以了。
3、执行xcodebuild命令时,注意workspace或者project所在的目录。(pwd命令可以看到当前路径)。其实只有任何跟pwd有关的参数都应该检查该参数是否与实际相符。
4、应用程序的签名中的证书和配置文件一节,建议第三步(iOS配置文件(发布))与第二步(iPhone发布证书+私钥)调换步骤。 调换和不调换生成的代码是不一样的,这个是解决可能会出现密码错误的问题。我觉得是后面加的全局变量破坏了它的加密信息吧,也可能与yml的格式有关系。
5、到了签名创建IPA步骤时,其中的脚本有一段是:
if[["$TRAVIS_BRANCH"!="master"]];then
echo"Testing on a branch other than master. No deployment will be done."
exit0
fi
$TRAVIS_BRANCE 从名字来看是获取当前的github分支名,非主分支不执行sign操作。只是可能是travis的bug(在travis项目github的issue中有对这个问题的讨论),这个参数拿到的实际上是项目的tag值(只是commit的话则为空)。实际上这边的shell代码是可以按需修改的。我修改成:
if[["$TRAVIS_TAG"==""]];then
echo"Testing on a branch other than master. No deployment will be done."
exit0
fi
参数改为tag,由tag来触发deploy操作。
6、创建好ipa文件后就可以利用travis来上传服务器了,包括testflight、fir等。他们的网站都有提供上传APP的api,写成bash shell就可以执行了。
另外也可以使用包装好的第三方库。我也有用一个第三方库来上传ipa到iTunesConnect,叫做nomad,里面有个小工具叫shenzhen(https://github.com/nomad/shenzhen),它的github项目有使用说明。ps,travis的虚拟机中本来是预装了nomad的,后来在travis的issue中看到nomad被移除了,它的负责人回复说下个release版本会重新加上。所以我们要使用shenzhen的时候要先安装,安装过程大概要个5分钟。
7、发布到github是travis本来就支持的。具体参考:http://docs.travis-ci.com/user/deployment/releases/
8、应该要注意发布到不同平台要使用不同的configuration。这个参数在xctool 编译时需要用到,如
- xctool -project TheYoungMarshal_iOS/iEileen_TheYoungMarshal.xcodeproj -scheme iEileen -sdk iphoneos -configuration ADHoc OBJROOT=$PWD/TheYoungMarshal_iOS/build SYMROOT=$PWD/TheYoungMarshal_iOS/build ONLY_ACTIVE_ARCH=NO
- xctool -project TheYoungMarshal_iOS/iEileen_TheYoungMarshal.xcodeproj -scheme iEileen -sdk iphoneos -configuration Release OBJROOT=$PWD/TheYoungMarshal_iOS/build SYMROOT=$PWD/TheYoungMarshal_iOS/build ONLY_ACTIVE_ARCH=NO
分别对应我项目中的ADHoc配置和Release的配置。发布到iTunes Connect和发布到测试平台使用不同的配置。额,好像是废话。
总结:
使用travis来自动编译、签名、上传能帮助我们更好监控项目的状态,并且可以节省上传时间(如果包很大的话😏😏)。这些只是持续集成的其中一步。