http://www.cocoachina.com/ios/20150916/13433.html

简介

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

本文主要使用fastlane配置iOS的持续集成,自动编译、打包出多个版本。

最近转行iOS开发,首要任务是使用Jenkins(算是hudson的兄弟)配置iOS工程的持续集成。 查找各种资料后,整理出以下几个关键词。

jenkins搭建。

使用fastlane中提供的工具修改工程配置。

gym 或 ipa 工具编译工程。

目标

  1. 配置一台电脑自动获取代码,并定时打包出以下版本的ipa文件。

    • 内部测试版本:使用标准开发者的Developer证书签名的ipa文件。

    • 公开测试版本:使用企业账户的Distribute InHouse证书签名的ipa文件。

    • AppStore版本:使用标准开发者的AppStore证书签名的ipa文件。

    • 渠道版本:内部测试版本,但Info.plist中增加每个渠道的标示符(因为渠道例如fir.im会使用自己的证书重新签名ipa,因此侧部测试版本就可以)PS: 2015年11月24日补充,fir.im 不会重新签名ipa。

  1. 保留每个版本的dSYM调试符号文件。

源代码

https://github.com/everettjf/ios_ci_fastlane_demo

安装

fastlane和shenzhen都需要gem安装,把gem更换为淘宝源。

安装fastlane

1
sudo gem install fastlane

安装shenzhen

1
  sudo gem install shenzhen

示例步骤

在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 fastlane
drwxr-xr-x  10 everettjf  staff   340B Sep  8 22:00 fastlanedemo
drwxr-xr-x   5 everettjf  staff   170B Sep  8 22:38 fastlanedemo.xcodeproj
drwxr-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}"
end
def 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.0
buildNumber=$2 # 2000
 
rm -rf build
 
basicLanes="AdHoc AppStore Develop InHouse"
for laneName in $basicLanes
do
    fastlane $laneName version:$versionNumber build:$buildNumber
done
 
channelIds="fir 91"
for channelId in $channelIds
do
    fastlane Channel version:$versionNumber build:$buildNumber channel_id:$channelId
done
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.fastlanedemo
Provisioning Profiles中增加一个 iOS Distribution(AdHoc 和 AppStore) 和 iOS Development

企业账户:bbb@bbb.com

1
2
Identifier中增加com.everettjf.fastlanedemoqiye
Provisioning Profiles中增加一个 iOS Distribution(AdInHouse)

相关文档

其他途径

  1. Jenkins的xcode插件:Jenkins有个xcode插件,网上有些文章,不过自己没有使用。不知道能否 动态的更换证书。

  2. 一次编译多次签名:在没有使用fastlane之前,看到fastlane提供了一套工具集,就使用gym先编译 一个Developer证书签名的ipa,之后使用其他证书分别签名。

重要补充

  • 安装jenkins的机器上的Xcode要导入开发者账户(存在私钥的账户信息,通过首次创建证书的电脑上的Xcode导出)

文章首次发布于:everettjf.github.io

使用 fastlane 实现 iOS 持续集成(转)的更多相关文章

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

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

  2. iOS 持续集成

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

  3. fir.im Weekly - 暖心的 iOS 持续集成,你值得拥有

    一则利好消息,flow.ci 支持 iOS 项目持续集成,想试试的伙伴去 Gitter群 问问.首批尝鲜用户@阿米amoy 已经用 flow.ci 实现了基本的 iOS 持续集成,并详细记录整个 Bu ...

  4. 使用VSTS/TFS搭建iOS持续集成环境

    TFS 自2015版开始支持跨平台的持续集成环境,通过提供开源的build agent为 Windows / linux / macOS 提供了统一的持续集成环境管理能力.这篇文章给大家介绍一下如何使 ...

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

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

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

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

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

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

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

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

  9. 【iOS】史上最全的iOS持续集成教程 (下)

    :first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdow ...

随机推荐

  1. 【转】【经典算法】——KMP,深入讲解next数组的求解

    前言 之前对kmp算法虽然了解它的原理,即求出P0···Pi的最大相同前后缀长度k:但是问题在于如何求出这个最大前后缀长度呢?我觉得网上很多帖子都说的不是很清楚,总感觉没有把那层纸戳破,后来翻看算法导 ...

  2. 剑指offer-面试题17.合并两个排序的链表

    题目:输入两个递增的排序的链表,合并这两个链表并使新链表中的节点仍然是 按照递增排序的.例如链表1链表2合并为链表3. List1:->->-> List2:->->-& ...

  3. ios sourecTree

    1, http://www.jianshu.com/p/be9f0484af9d 2, http://blog.csdn.net/viewcode/article/details/42291973  

  4. grep, egrep, fgrep笔记

    grep, egrep, fgrep grep: 根据模式搜索文本,并将符合模式的文本行显示出来.Pattern: 文本字符和正则表达式的元字符组合而成匹配条件 grep [options] PATT ...

  5. C语言结构体的内存对齐问题

    在C语言开发当中会遇到这样的情况: #include <stdio.h> struct test { int a; char b; }; int main(int argc, const ...

  6. Unity 接MM横屏闪退的原因

    =.=研究了1天接SDK到处都在报错,于是使用logcat查看原因截取到这样的Exception. call to OpenGL ES API withno current context(logge ...

  7. 编程获取linux的CPU使用的内存使用情况

    Linux可用下top.ps命令检查当前的cpu.mem用法.下面简单的例子: 一.采用ps查看资源消耗的过程 ps -aux 当您查看进程信息,第三列是CPU入住. [root@localhost ...

  8. Babel6.x 转换ES6

    本文介绍Babel6.x的安装过程~ 首先呢,可以使用Babel在线转换 https://babeljs.io/repl/ 然后进入主题:安装Babel(命令行环境,针对Babel6.x版本) 1.首 ...

  9. C# 封装-属性

    属性使封装更容易 可以使用属性(properties),这些方法对其他对象来说就像是字段,可以用属性来获取或设置一个后备字段,后备字段就是由属性所设置的一个字段名 private int number ...

  10. Input输入字体颜色改变js(兼容IE)

    从网上找的代码,自己封装了一下(前提:引用jQuery库) 方法1: HTML: <div class="box"> <div class="ipt1& ...