iOS可持续化集成: Jenkins + bundler + cocoapods + shenzhen + fastlane + pgyer

工具介绍

1. bundler

bundler用于管理ruby gem的工具,我们用来管理cocoapods以及fastlane的版本号。直接sudo gem install bundler即可。然后在工程的根目录下,添加Gemfile文件:
source 'http://ruby.taobao.org'
source 'http://ruby.taobao.org'
gem 'cocoapods', '~>0.37.2'
gem 'fastlane', '~>1.4.0'
然后执行,bundle install即可,执行完同时会生成一个Gemfile.lock文件,把这个和Gemfile文件一起添加到git中管理,用这个我们可以很方便大家一起同步gem source和cocoapods以及fasten的版本号。

2. cocoapods

这个不用多说,各方面参考资料已经太多了,这个不了解的话,在iOS开发方面真的是属于比较薄弱了。

Command Line

1). 我是选择fastlane作为打包以及分发的工具,这个是在shenzhen基础之上进行了封装,非常简单易用。详细参考官方的资料即可以及还有一些其他的对xcodebuild的封装:
1)  https://github.com/nomad/shenzhen
2)  http://fastlane.tools
3)  https://github.com/nomad/cupertino,
4)  https://github.com/facebook/xctool,这是facebook对xcodebuild封装的一个开源库,也可以用来构建安装包。

如果安装有多个Xcode版本,可以使用xcode-select选择对应的Xcode版本进行build,这个工具也是非常有用的。
使用xcpretty (  https://github.com/supermarin/xcpretty) 对xcodebuild的输出进行格式化。
使用xcodebuild -list查看所有可用的schemes。
xcrun是Xcode自带的一个命令行工具,主要有两个用途: 找到开发工具,执行这些开发工具。比如 xcrun —find ld,用于定位ld工具的位置。xcrun git —version,则是直接执行git —version命令。
总之来说,当我们使用fastlane和shenzhen之后,这部分就变得非常简单,不需要我们再过多关注。

2). agv — Apple Generic Version 工具的使用
Apple官方提供的更改版本号的功能,设置参考:
  • http://youandthegang.com/2015/continuous-integration-delivery-with-jenkins/
  • http://segmentfault.com/a/1190000002423661
  • <Pro iOS Continuous Integration>

Jenkins

1. 安装启动

在 https://jenkins-ci.org/或者通过命令: "curl -L http://mirrors.jenkins-ci.org/war/latest/jenkins.war -O" 下载jenkins.war都某个目录下面。 通过命名行 "java -jar jenkins.war" 启动jenkins,也可以通过 —httpPort 和 —httpListenAddress 指定端口和设定IP来启动。

如果希望jenkins可以开机自启动以及异常自动重启,可以把jenkins设置为Launch Daemon的方式启动。

1). 运行命令 “sudo touch /Library/LaunchDaemons/org.jenkins-ci.plist” 来创建配置文件

2). 文件的内容如下,参考gist:  https://gist.github.com/lihei12345/84a4ed83aa07a9d3a7d7 :
iOS可持续化集成: Jenkins + bundler + cocoapods + shenzhen + fastlane + pgyer_第1张图片
Refer:  http://savvyapps.com/blog/continuous-integration-ios-jenkins/, http://9elements.com/io/index.php/continuous-integration-of-ios-projects-using-jenkins-cocoapods-and-kiwi/

3) 重新启动jenkins就会在后台自启动了,或者直接使用”sudo launchctl load -w /Library/LaunchDaemons/org.jenkins-ci.plist”命令行

无论通过哪种方式来启动jenkins,启动之后,在浏览器中输入: http://localhost:8080,就可以直接进入jenkins后台了。

2. Jenkins基本设置

进入jenkins之后,需要做一些基本的设置来设置一个管理账户,或者设置LDAP这这样的通用身份系统认证系统 (参考一篇很棒的文章: http://zhuanlan.zhihu.com/prattle/19974568)

1). 进入系统管理 -> Configure Global Security -> 点击”启用安全” 。启用安全下面选择,“Jenkins专有用户数据库”,勾选允许用户可以注册。然后在“授权策略”中选择“任何用户可以做任何事(没有任何限制)”。当然,也可以使用LDAP身份认证机制,直接使用外部统一的身份机制来做认证。
2). 返回注册一个账户,登录之后再次进入安全管理。勾选“登录用户可以做任何事”,这样就只有登录用户才能做操作了。
3). 插件管理,我使用的jenkins版本,发现我所需要的插件都已经添加了,只需要update一下即可。


3. 设置git

1). “新建” —> 勾选“构建一个自由风格的软件项目”  -> “源码管理”中勾选“Git”
2).  配置repo的URL以及SSH keys生成的private key填入下面的输入框中。生成SSH keys的过程具体请参考: https://help.github.com/articles/generating-ssh-keys/,对git比较熟悉的话,这个过程应该不会陌生。记得不要忘记把public key添加 repo的访问权限中,无论是github/gitlab/bitbucket都是类似的。执行下面两行命令,直接到输入框里粘贴即可。
ssh-keygen -t rsa -N "" -f ~/Tools/jenkins.key # 生成key
cat ~/Tools/jenkins.key | pbcopy # 把private key copy到粘贴板

iOS可持续化集成: Jenkins + bundler + cocoapods + shenzhen + fastlane + pgyer_第2张图片

 然后返回git设置,”Credentials”选择刚才输入的username即可。
iOS可持续化集成: Jenkins + bundler + cocoapods + shenzhen + fastlane + pgyer_第3张图片


4. Jenkins Job设置

1). 使用shenzhen测试构建环境是否正常

在项目的根目录下,先使用shenzhen直接执行测试,看是否能够成功构建,没有构建成功的话,需要google一下解决掉,再往下进行。执行一下命令进行测试:
”ipa build -c Release -d ~/Desktop”
“cd ~/Desktop"
然后上传到蒲公英或者fir.im平台,之后就可以直接在这些平台上面直接下载了
“ipa distribute:pgyer -u USER_KEY -a APP_KEY” # 上传到蒲公英
"ipa distribute:fir -u USER_TOKEN -a APP_ID” # 上传到fir.im

如果发现能够打包并且下载成功,则在Job的构建里面添加以下shell命令, https://gist.github.com/lihei12345/5076a737261e97ca0856,进行构建测试。
iOS可持续化集成: Jenkins + bundler + cocoapods + shenzhen + fastlane + pgyer_第4张图片
这个测试过程中,我这边总是会报错,在console output中查看一下错误信息: “No schemes found in Xcode project or workspace”,解决办法如下: http://stackoverflow.com/questions/14368938/xcodebuild-says-does-not-contain-scheme,把workspace的shared勾选即可。修复之后,很顺利构建成功。

5. fastlane

1) 关于fastlane
在使用shenzhen测试之后,如果一切正常,那我们就可以继续配置Job了,shenzhen已经是一个非常方便的工具了,但是更近一步,有一个更加自动化和便于使用的工具—fastlane,我们下面基于fastlane配置用于测试分发(fir.im/TestFlight)的AdHoc Job以及上传到Appstore的App Store Job。fastlane官方关于集成Jenkins的文档,  https://github.com/KrauseFx/fastlane/blob/master/docs/Jenkins.md,内部需要安装几个Jenkins插件。在查看fastlane之后,我发现fastlane的确非常强大,可以大大简化我们的工作,尤其适合个人开发者,但是这个还是有一定学习成本的。

https://github.com/KrauseFx/fastlane
http://www.infoq.com/cn/news/2015/01/fastlane-ios-continuous-deploy

fastlane是一组工具套件,让你可以定义和运行特定环境下各种部署流程的自动化,它是由fastlane提供的工具(例如snapshot/sigh/deliver等)以及各种第三方工具(例如cocoapods/xctool等)连接在一起组成的,可以提供一个运行良好的可持续部署流程。如下图,在Test / TestFilght Beta /Appstore 这些不同的环境下,运行的部署流程是不一样的。

iOS可持续化集成: Jenkins + bundler + cocoapods + shenzhen + fastlane + pgyer_第5张图片

下面我们说一下由fastlane提供的各种工具:
  • delivery:用于上传应用的二进制代码,应用截屏和原数据到 App Store
  • snapshot:可以自动化iOS应用在每个设备上的本地化截屏过程
  • frameit:用于在应用截屏外添加设备的边框
  • PEM:可以自动化生成和更新应用推送通知描述文件
  • sigh:可以生成并下载开发者的应用商店配置文件
  • product:可以使用命令行在iTunes Connect中创建iOS应用以及Developer Portal
  • cert:可以自动创建并维护iOS的签名证书
  • codes:使用命令行来生成应用的优惠码

2) 配置上传蒲公英的fastlane
进入到项目根目录,使用 fastlane init 来初始化fastlane文件,具体步骤可以参考下面的资料: https://github.com/KrauseFx/fastlane/tree/master/docs。可以参考官方提供的各种fastlane脚本的demo来撇只实现自己的项目:

在fastlane文件中,添加直接通过ipa命令蒲公英上传: sh "ipa distribute:pgyer -f XXX.ipa -a XXX -u XXX”。对于fastlane,因为我自身精力有限,所以我目前只实现了一下简单的脚本进行上传蒲公英的操作,没有实现覆盖测试以及App Store上传的fastlane,关于这些方面的实现可以参考文章:  http://www.jianshu.com/p/9ae446d76271。在fastlane中添加如下的脚本,gist地址:  https://gist.github.com/lihei12345/3bc82ced45b267b1bc2c。

iOS可持续化集成: Jenkins + bundler + cocoapods + shenzhen + fastlane + pgyer_第6张图片

还有其他的OTA Distribution分发方式:TestFlight,HockeyApp,amazon S3,fir.im,蒲公英,FTP,邮件。不过由于fastlane目前只支持amazon s3的上传,其他上传方式必须使用 sh 执行命令。

直接在项目目录下面运行”fastlane ios alpha”,查看是否可以运行成功并且上传到蒲公英上面,之后打开Jenkins的Job配置,更换我们之前临时设置的脚本,更换为使用fastlane的脚本来进行构建即可。

iOS可持续化集成: Jenkins + bundler + cocoapods + shenzhen + fastlane + pgyer_第7张图片

注意我们这里添加的有 “ensure_git_status_clean”,如果我们的gemfile和podfile不是最全面的,在运行Job的时候,运行”bundle install”或者”pod update”命令的时候就会对我们的文件进行修改,这样Jenkins就会报错,“Git repository is dirty! Please ensure the repo is in a clean state by commiting/stashing/discarding all changes first”。这个时候,我们只需要运行一遍 “bundle install” 或者 “pod update”命令,然后把这些修改push到origin上即可。


6. 实现不同类型的应用

可以参考wikipedia的fastlane脚本:  https://github.com/fastlane/examples/tree/master/Wikipedia,内部实现了无需多个证书即可实现 beta/alpha版本实现的方式研究,这部分在<Pro Continuous Integration>有详细说明,在”Multiple Versions of the Application”章节内。


参考资料:

  • <Pro iOS Continuous Integration>
  • https://medium.com/ribot-labs/continuous-integration-deployment-for-ios-projects-7358b72ca2e9 (翻译:http://www.jianshu.com/p/9ae446d76271),对于CI的各个方面覆盖非常全面,可以参考这个拓展CI的使用
  • http://youandthegang.com/2015/continuous-integration-delivery-with-jenkins/
  • http://9elements.com/io/index.php/continuous-integration-of-ios-projects-using-jenkins-cocoapods-and-kiwi/
  • jenkins + 蒲公英: http://answerhuang.duapp.com/index.php/2015/04/19/jenkins/
  • http://williamzang.com/blog/2014/07/23/shi-yong-jenkins-plus-calabash-plus-cocoapodsda-jian-ioschi-xu-ji-cheng-huan-jing/
  • https://github.com/artsy/eigen
  • http://www.objc.io/issues/6-build-tools/travis-ci/
  • dysm分析工具:http://answerhuang.duapp.com/index.php/2014/07/06/dsym_tool/
  • <Xcode continuous integration guide>
  • http://macminicolo.net/dayone
  • http://savvyapps.com/blog/continuous-integration-ios-jenkins/


其他工具

1) PLCrashReport
2)  http://bugly.qq.com/
3)  https://try.crashlytics.com/
4)  http://bughd.com/



总结,搞了两天,终于把我困惑很久却一直懒得弄的东西搞完了,从jenkins,shenzhen,fastlane以及单元测试了解一遍等,深深感觉可以极大简化我们的工作复杂度。同时还有其他一些很酷的特性,比如说HipChat/Slack这样的IM的构建通知,以及github/gitlab/bitbucket的hook等等,snapshot,覆盖测试,上传appstore,可惜我目前并没有应用场景,也就不再继续学习了,以后有需要再来学习使用。 

你可能感兴趣的:(iOS可持续化集成: Jenkins + bundler + cocoapods + shenzhen + fastlane + pgyer)