使用 fastlane 实现 iOS 持续集成(转)
http://www.cocoachina.com/ios/20150916/13433.html
简介
持续集成是个“一次配置长期受益”的工作。但很多小公司都没有。以前在做Windows开发配置感觉简单一些,这次配置iOS的,感觉步骤还挺多。整理出来,分享给大家,不正确的地方请及时指正。
本文主要使用fastlane配置iOS的持续集成,自动编译、打包出多个版本。
最近转行iOS开发,首要任务是使用Jenkins(算是hudson的兄弟)配置iOS工程的持续集成。 查找各种资料后,整理出以下几个关键词。
jenkins搭建。
使用fastlane中提供的工具修改工程配置。
gym 或 ipa 工具编译工程。
目标
配置一台电脑自动获取代码,并定时打包出以下版本的ipa文件。
内部测试版本:使用标准开发者的Developer证书签名的ipa文件。
公开测试版本:使用企业账户的Distribute InHouse证书签名的ipa文件。
AppStore版本:使用标准开发者的AppStore证书签名的ipa文件。
渠道版本:内部测试版本,但Info.plist中增加每个渠道的标示符(因为渠道例如fir.im会使用自己的证书重新签名ipa,因此侧部测试版本就可以)PS: 2015年11月24日补充,fir.im 不会重新签名ipa。
保留每个版本的dSYM调试符号文件。
源代码
https://github.com/everettjf/ios_ci_fastlane_demo
安装
fastlane和shenzhen都需要gem安装,把gem更换为淘宝源。
安装fastlane
|
1
|
sudo gem install fastlane |
fastlane是ruby编写,使用gem安装。
安装shenzhen
|
1
|
sudo gem install shenzhen |
如果只使用了gym命令,而不使用ipa命令,可以不安装。
示例步骤
在xcodeproj文件同级目录下,执行
|
1
|
fastlane init |
fastlane 很强大,甚至能自动截图,自动提交AppStore审核,不过我只用最简单的打包功能。 这里会有一系列提问。
|
1
2
3
4
5
6
7
8
|
* Do you want to get started...? y* Do you have everything commited... ? y* App Identifier (com.krausefx.app): com.everettjf.fastlanedemo* Your Apple ID (fastlane@krausefx.com): xxxxxxxx@xxxx.com* ... updates to the App Store or Apple TestFlight? (y/n) n* Do you want to setup 'snapshot'... n* Do you want to use 'sigh'... n (是否自动下载provisioning文件)* The scheme name of your app: fastlanetest (如果就一个工程,也可不输入) |
上面有一步要输入AppleID,是因为fastlane(的一个工具sigh,这个字母是H)会自动下载对应的provisioning文件。自动下载provisioning文件,对于经常增加测试设备的Developer证书挺方便。不过,示例就不自动下载了。
执行完成后,会在工程目录下生成fastlane文件夹。
|
1
2
3
4
|
drwxr-xr-x 5 everettjf staff 170B Sep 8 22:32 fastlanedrwxr-xr-x 10 everettjf staff 340B Sep 8 22:00 fastlanedemodrwxr-xr-x 5 everettjf staff 170B Sep 8 22:38 fastlanedemo.xcodeprojdrwxr-xr-x 4 everettjf staff 136B Sep 8 22:00 fastlanedemoTests |
我们需要修改fastlane文件夹的两个配置文件:Appfile和Fastfile。(实际是ruby代码)
1. 修改Appfile
|
1
2
3
4
5
6
7
|
app_identifier "com.everettjf.fastlanedemo"apple_id "aaa@aaa.com"for_lane :inhouse do app_identifier "com.everettjf.fastlanedemoqiye" apple_id "bbb@bbb.com"end |
企业InHouse版本与AppStore的app_identifier、apple_id不同。 这里for_lane 就是为后面Fastfile中定义的:inhouse版本设置单独的信息。
2. 修改Fastfile
这个文件中要编写每个版本的编译和打包代码(Developer版本、AppStore版本、InHouse版本、多个渠道版本), 每个版本要经过以下几个步骤: - 修改版本号和build号(修改为外部传入的版本,例如:1.0.0和100)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
def prepare_version(options) #say 'version number:' #say options[:version] increment_version_number( version_number: options[:version], xcodeproj: PROJECT_FILE_PATH, ) #say 'build number:' #say options[:build] increment_build_number( build_number: options[:build], xcodeproj: PROJECT_FILE_PATH, )end |
修改app identifier(就是bundle id,例如:com.everettjf.fastlanedemo)
|
1
2
3
4
5
6
7
8
9
10
11
12
|
def update_app_identifier(app_id) update_info_plist( xcodeproj:PROJECT_FILE_PATH , app_identifier:app_id, plist_path:"#{PLIST_FILE_PATH}" ) update_info_plist( xcodeproj:PROJECT_FILE_PATH , app_identifier:app_id, plist_path:"#{UNITTEST_PLIST_FILE_PATH}" )end |
修改签名的配置,配置对应的provision file
|
1
2
3
4
5
6
|
def update_provision(typePrefix) update_project_provisioning( xcodeproj:PROJECT_FILE_PATH , profile:"./fastlane/provision/#{typePrefix}.mobileprovision", )end |
渠道版本修改Info.plist文件中对应的字符串
|
1
2
3
4
5
6
7
8
9
10
|
def set_info_plist_value(path,key,value) sh "/usr/libexec/PlistBuddy -c \"set :#{key} #{value}\" #{path}"enddef set_channel_id(channelId) set_info_plist_value( "./../fastlanedemo/#{PLIST_FILE_PATH}", 'ChannelID', "#{channelId}" )end |
编译打包为ipa
这步使用了工具shenzhen,也可以使用fastlane推荐的gym。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
def generate_ipa(typePrefix,options) #say 'generate ipa' fullVersion = options[:version] + '.' + options[:build] channelId = options[:channel_id] ipa( configuration:"Release", scheme:"#{SCHEME_NAME}", destination:"./build", ipa:"#{APP_NAME}_#{fullVersion}_#{typePrefix}.ipa", archive:false ) sh "mv ./../build/#{APP_NAME}.app.dSYM.zip ./../build/#{APP_NAME}_#{fullVersion}_#{typePrefix}.app.dSYM.zip"end |
3.?编写shell脚本
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#!/bin/sh## usage:# > sh build.sh 1.0.0 200#versionNumber=$1 # 1.0.0buildNumber=$2 # 2000rm -rf buildbasicLanes="AdHoc AppStore Develop InHouse"for laneName in $basicLanesdo fastlane $laneName version:$versionNumber build:$buildNumberdonechannelIds="fir 91"for channelId in $channelIdsdo fastlane Channel version:$versionNumber build:$buildNumber channel_id:$channelIddone |
|
1
|
sh build.sh 1.0.0 100 |
我们传入主版本号和一个自增的id(一般是jenkins的build number)。
配置Jenkins
有了能一键编译的脚本,让Jenkins在获取代码后,调用build.sh就可以了。
安装
|
1
|
brew install jenkins |
配置获取代码,获取代码后调用shell:
|
1
|
sh build.sh 1.0.0 ${BUILD_NUMBER} |
苹果开发者证书配置
假设我们有两个开发者账号,一个是标准开发者账户(99刀,个人或公司),一个是企业账户(299刀)。 - 标准开发者账户:aaa@aaa.com
|
1
2
|
Identifier中增加com.everettjf.fastlanedemoProvisioning Profiles中增加一个 iOS Distribution(AdHoc 和 AppStore) 和 iOS Development |
企业账户:bbb@bbb.com
|
1
2
|
Identifier中增加com.everettjf.fastlanedemoqiyeProvisioning Profiles中增加一个 iOS Distribution(AdInHouse) |
相关文档
fastlane:https://github.com/KrauseFx/fastlane/tree/master/docs
shenzhen : https://github.com/nomad/shenzhen
其他途径
Jenkins的xcode插件:Jenkins有个xcode插件,网上有些文章,不过自己没有使用。不知道能否 动态的更换证书。
一次编译多次签名:在没有使用fastlane之前,看到fastlane提供了一套工具集,就使用gym先编译 一个Developer证书签名的ipa,之后使用其他证书分别签名。
重要补充
安装jenkins的机器上的Xcode要导入开发者账户(存在私钥的账户信息,通过首次创建证书的电脑上的Xcode导出)
文章首次发布于:everettjf.github.io
使用 fastlane 实现 iOS 持续集成(转)的更多相关文章
- 使用 Fastlane 实现 IOS 持续集成
简介 持续集成是个“一次配置长期受益”的工作.但很多小公司都没有.以前在做Windows开发配置感觉简单一些,这次配置iOS的,感觉步骤还挺多.整理出来,分享给大家,不正确的地方请及时指正. 本文主要 ...
- iOS 持续集成
iOS 持续集成系列 - 开篇 前言 iOS 开发在经过这几年的野蛮生长之后,慢慢地趋于稳定.无论开发语言是 Objective-C 还是 Swift,工程类型是 Hybird 还是原生,开发思想是 ...
- fir.im Weekly - 暖心的 iOS 持续集成,你值得拥有
一则利好消息,flow.ci 支持 iOS 项目持续集成,想试试的伙伴去 Gitter群 问问.首批尝鲜用户@阿米amoy 已经用 flow.ci 实现了基本的 iOS 持续集成,并详细记录整个 Bu ...
- 使用VSTS/TFS搭建iOS持续集成环境
TFS 自2015版开始支持跨平台的持续集成环境,通过提供开源的build agent为 Windows / linux / macOS 提供了统一的持续集成环境管理能力.这篇文章给大家介绍一下如何使 ...
- CI Weekly #21 | iOS 持续集成快速入门指南
搭建 iOS 持续集成环境要多久?每个 iOSer 都有不同的答案.这次我们整理了 flow.ci 的 iOS 持续集成的相关文档和最佳实践,希望帮你更快地完成构建.更新文档见: flow.ci iO ...
- 视频云SDK iOS持续集成项目实践
1. 前言 2016年, 我们维护的 iOS推流播放融合SDK KSYLive_iOS 在github上发布了40多个版本, 平均两周发布一个新版本, 经历了最初痛苦的全手动版本构建和维护, 到后来慢 ...
- 使用Jenkins+Calabash+Cocoapods搭建iOS持续集成环境
使用jenkins+calabash+cocoapods搭建ios持续集成环境 持续集成 持续集成到底是什么呢?依据敏捷大师Martin Fowler的定义: 持续集成是一种软件开发实践. 在持续集成 ...
- 一步一步构建iOS持续集成:Jenkins+GitLab+蒲公英+FTP
什么是持续集成 持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每次集成都通过自动化的构建(包括编译,发布,自动化测试)来 ...
- 【iOS】史上最全的iOS持续集成教程 (下)
:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdow ...
随机推荐
- UESTC_Eight Puzzle 2015 UESTC Training for Search Algorithm & String<Problem F>
F - Eight Puzzle Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) ...
- RIAidea – Focus on Flash/Flex/AIR » About Me
RIAidea – Focus on Flash/Flex/AIR » About Me Browse > Home > About Me Tuesday, May 20, 2014 | ...
- powershell 将文本转换成表格的还有一种方式
$text=" 1 梦幻西游 216406 2014-01-21 资料片 2 炉石传说 15905 2014-01-24 公測 3 新大话西游 214465 2002-08-01 公測 4 ...
- 基于angularJS和requireJS的前端架构
1.概要描述 1.1.angularJS描述:angularJS是可以用来构建WEB应用的,WEB应用中的一种端对端的完整解决方案.通过开发者呈现一个更高层次的抽象来简化应用的开发.最适合的就是用它来 ...
- 模板方法模式(TemplateMethod)
定义:模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 当我们要完成在某一细节层次一致的一个过程或一系列步骤 ...
- Maven 工程下 Spring MVC 站点配置 (一)
最近,查找一些具体资料时,虽然会有很多,但是系统的却很少,尤其是对maven 下 spring mvc 站点搭建的配置,总是说的很多但让新手一目了然的步骤却少之又少. 对此闲暇时整理了一下,做了一套较 ...
- [有向图的强连通分量][Tarjan算法]
https://www.byvoid.com/blog/scc-tarjan 主要思想 Tarjan算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一棵子树.搜索时,把当前搜索树中未处理的 ...
- Table生成Excel表格
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- SQL创建登陆用户和赋予权限
主要针对Sql server 2005及以上,创建简单用户名和密码所引起的密码简单的问题.解决方案 CHECK_POLICY = OFF; --强制密码策略 use MusicStore --创建登陆 ...
- SQL随机查询,显示行号,查询数据段
1.显示行号 如果数据没有删除的情况下主键与行号是一致的,但在删除某些数据,行号就与主键不一致了,这时需要查询行号就需要用新的方法,在SQL Server2005之前,需要使用临时表,但在SQL Se ...