工具介绍

1. bundler

bundler用于管理ruby gem的工具,我们用来管理cocoapods以及fastlane的版本。直接sudo gem install bundler就可以。然后在project的根文件夹下,加入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基础之上进行了封装,很easy易用。具体參考官方的资料即能够及另一些其它的对xcodebuild的封装:
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之后,这部分就变得很easy,不须要我们再过多关注。


2). agv — Apple Generic Version 工具的使用
Apple官方提供的更改版本的功能。设置參考:

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 指定port和设定IP来启动。

假设希望jenkins能够开机自启动以及异常自己主动重新启动,能够把jenkins设置为Launch Daemon的方式启动。

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

2). 文件的内容例如以下,參考gist: https://gist.github.com/lihei12345/84a4ed83aa07a9d3a7d7 :


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到粘贴板



 然后返回git设置,”Credentials”选择刚才输入的username就可以。



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,进行构建測试。

这个測试过程中,我这边总是会报错。在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的确很强大。能够大大简化我们的工作。尤其适合个人开发人员,可是这个还是有一定学习成本的。



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


watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">


以下我们说一下由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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">


还有其它的OTA Distribution分发方式:TestFlight,HockeyApp。amazon S3,fir.im。蒲公英。FTP。邮件。只是因为fastlane眼下仅仅支持amazon s3的上传。其它上传方式必须使用 sh 运行命令。

直接在项目文件夹以下执行”fastlane ios alpha”。查看能否够执行成功而且上传到蒲公英上面。之后打开Jenkins的Job配置,更换我们之前暂时设置的脚本,更换为使用fastlane的脚本来进行构建就可以。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">


注意我们这里加入的有 “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”章节内。


參考资料:



其它工具

1) PLCrashReport



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

iOS可持续化集成: Jenkins + bundler + cocoapods + shenzhen + fastlane + pgyer的更多相关文章

  1. 一步一步构建iOS持续集成:Jenkins+GitLab+蒲公英+FTP

    什么是持续集成 持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每次集成都通过自动化的构建(包括编译,发布,自动化测试)来 ...

  2. 使用Jenkins+Calabash+Cocoapods搭建iOS持续集成环境

    使用jenkins+calabash+cocoapods搭建ios持续集成环境 持续集成 持续集成到底是什么呢?依据敏捷大师Martin Fowler的定义: 持续集成是一种软件开发实践. 在持续集成 ...

  3. 使用 Fastlane 实现 IOS 持续集成

    简介 持续集成是个“一次配置长期受益”的工作.但很多小公司都没有.以前在做Windows开发配置感觉简单一些,这次配置iOS的,感觉步骤还挺多.整理出来,分享给大家,不正确的地方请及时指正. 本文主要 ...

  4. 使用 fastlane 实现 iOS 持续集成(转)

    http://www.cocoachina.com/ios/20150916/13433.html 简介 持续集成是个“一次配置长期受益”的工作.但很多小公司都没有.以前在做Windows开发配置感觉 ...

  5. iOS 持续集成

    iOS 持续集成系列 - 开篇 前言 iOS 开发在经过这几年的野蛮生长之后,慢慢地趋于稳定.无论开发语言是 Objective-C 还是 Swift,工程类型是 Hybird 还是原生,开发思想是 ...

  6. 现有iOS项目集成React Native过程记录

    在<Mac系统下React Native环境搭建>配置了RN的开发环境,然后,本文记录在现有iOS项目集成React Native的过程,官方推荐使用Cocoapods,项目一开始也是使用 ...

  7. CI Weekly #21 | iOS 持续集成快速入门指南

    搭建 iOS 持续集成环境要多久?每个 iOSer 都有不同的答案.这次我们整理了 flow.ci 的 iOS 持续集成的相关文档和最佳实践,希望帮你更快地完成构建.更新文档见: flow.ci iO ...

  8. 视频云SDK iOS持续集成项目实践

    1. 前言 2016年, 我们维护的 iOS推流播放融合SDK KSYLive_iOS 在github上发布了40多个版本, 平均两周发布一个新版本, 经历了最初痛苦的全手动版本构建和维护, 到后来慢 ...

  9. 李洪强iOS之集成极光推送三iOS集成指南

    李洪强iOS之集成极光推送三iOS集成指南 SDK说明 适用版本 本文匹配的 SDK版本:r2.1.5 以后.查看最近更新了解最新的SDK更新情况.使用Xcode 6及以上版本可以使用新版Push S ...

随机推荐

  1. 问题解决:The content of the adapter has changed but ListView did not receive a notification

    1. 不要在后台线程中直接调用adapter 2. 不要在后台线程中修改adapter绑定的数据 如果对adapter或者adapter绑定的数据是在线程中,加上runOnUiThread就可以了 r ...

  2. scikit-learn模块学习笔记(数据预处理模块preprocessing)

    本篇文章主要简单介绍sklearn中的数据预处理preprocessing模块,它可以对数据进行标准化.preprocessing 模块提供了数据预处理函数和预处理类,预处理类主要是为了方便添加到pi ...

  3. 用PHP去实现数据库查询结果缓存

    有些时候我们希望减少对数据库的查询来提高程序的性能,因为这些数据不是经常变更的,而是会在很长一段时间内都不会变化,因此,我们每连接一次数据库,都会把相应的结果用文件的形式保存起来.比如对于一个商城来说 ...

  4. Pandas Installation

    1. 将环境变量PATH中加入C:\python2*\Scripts 或者 C:\Program Files\Python 3.5\Scripts 2. 进入pip.exe所在的目录:C:\Progr ...

  5. leetcode 之Longest Consecutive Sequence(六)

    这题要仔细体会下哈希表的用法,要注意的是数组本身是无序的,因此需要向左右进行扩张. 另外这个思路可以进行聚类,把连续的标记为一类. int longestConsecutive(const vecto ...

  6. ImageNet Classification with Deep Convolutional Neural Network(转)

    这篇论文主要讲了CNN的很多技巧,参考这位博主的笔记:http://blog.csdn.net/whiteinblue/article/details/43202399 https://blog.ac ...

  7. 【51nod】1227 平均最小公倍数

    题解 这个故事告诉们数论函数不要往分式上跑,你推不出来 好久没推式子了这么明显的转化我都忘了= = 首先\(A(n) = \frac{1}{n} \sum_{i = 1}^{n} \frac{i * ...

  8. mongoDB学习第二天之常用方法

    mongoDB LIMIT 和 SKIP 方法 db.colName.find().limit(num)  # limit 方法接收一个数字参数,该参数指定读取的记录条数 (db.colName.fi ...

  9. javascript 原生得到document.Element的方法

    今天这里写这个博客的主要目的是记录一下javascript原生的选择dom的集中方法. 1.document.getElementById.这个方法接收1个参数,就是DOM元素的id(区分大小写),这 ...

  10. Python开发基础-Day33 IO模型

    IO模型分类 五种IO Model blocking IO 阻塞IO nonblocking IO 非阻塞IO IO multiplexing IO多路复用 signal driven IO 信号驱动 ...