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

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 ([email protected]): [email protected]

* ... 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 "[email protected]"

for_lane :inhouse do

  app_identifier "com.everettjf.fastlanedemoqiye"

  apple_id "[email protected]"

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刀)。 - 标准开发者账户:[email protected]


1

2

Identifier中增加com.everettjf.fastlanedemo

Provisioning Profiles中增加一个 iOS Distribution(AdHoc 和 AppStore) 和 iOS Development

企业账户:[email protected]


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

时间: 2024-10-10 19:08:20

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

使用 Fastlane 实现 IOS 持续集成

简介 持续集成是个“一次配置长期受益”的工作.但很多小公司都没有.以前在做Windows开发配置感觉简单一些,这次配置iOS的,感觉步骤还挺多.整理出来,分享给大家,不正确的地方请及时指正. 本文主要使用fastlane配置iOS的持续集成,自动编译.打包出多个版本. 最近转行iOS开发,首要任务是使用Jenkins(算是hudson的兄弟)配置iOS工程的持续集成. 查找各种资料后,整理出以下几个关键词. jenkins搭建. 使用fastlane中提供的工具修改工程配置. gym 或 ipa

iOS 持续集成

iOS 持续集成系列 - 开篇 前言 iOS 开发在经过这几年的野蛮生长之后,慢慢地趋于稳定.无论开发语言是 Objective-C 还是 Swift,工程类型是 Hybird 还是原生,开发思想是 OOP 还是函数式,随着项目逐渐变大都在面临相同的问题: 测试.发布等重复性工作占了很大一部分时间,回归成本越来越高.持续集成不可避免地被提上了日程. 本文主要阐述 iOS 下的持续集成,以目标.内容.流程.工具入手,希望可以为大家描绘一幅 iOS 持续集成的蓝图.这可能不是一篇可以让你 Step

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

什么是持续集成 持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误. 为什么使用持续集成 1.减少风险2.减少重复过程3.任何时间.任何地点生成可部署的软件4.增强项目的可见性 常用的持续集成工具 Jenkins CI Travis CI Hudson CI Circle CI 市面上的持续集成工具有很多,考虑到Jenkins的稳定性,

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

.markdown-body hr::after,.markdown-body::after { clear: both } .loopLine,.messageLine0 { } .markdown-body { color: #24292e; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji",

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

持续集成 持续集成究竟是什么呢?根据敏捷大师Martin Fowler的定义: 持续集成是一种软件开发实践.在持续集成中,团队成员频繁集成他们的工作成果,一般每人每天至少集成一次,也可以多次.每次集成会经过自动构建(包括自动测试)的检验,以尽快发现集成错误.许多团队发现这种方法可以显著减少集成引起的问题,并可以加快团队合作软件开发的速度. 只要是开发就有分工,哪怕是自己一个写也要分成多个模块.随着项目越来越大,模块也越来越多,各个模块是否可以征程协作就成了问题,有了持续集成,可以有如下好处: 持

iOS持续集成:命令行创建工程

??在开发iOS应用的时候,大部分都是直接采用Xcode进行开发,但有时候需要用命令行来创建工程,比如最近在做ci的持续集成,就只能通过命令行的方式,这时候就需要了解一下工程文件的构成.我们知道工程文件的相关信息保存在project.pbxproj,因此可以通过脚本创建出pbxproj文件,完成基础工程的创建. pbxproj ??下面介绍一下pbxproj文件,可以拖动.xcodeproj文件到文本编辑器,如sublime,查看pbxproj文件的组成方式,主要包括: * PBXBuildFi

IOS使用jenkins进行持续集成 第二篇

上一篇,自己尝试进行持续集成,研究的不深入,这两天,为公司搭建持续集成环境,以及内部发布系统,了解的更多了,所以分享出来. 这篇主要介绍一些其他东西,不重复介绍上一篇的内容. 如果使用jenkins进行ios持续集成,需要xcode插件支持,所以先下载xcode插件,而且后期还要用到ftp服务,也安装ftp的插件. jenkins中可以自己创建特定的视图分组,all视图点击+号就能创建新视图,创建好后,在左侧的编辑视图选项,则会进入详情页,可以选择放入此视图的任务:相对于任务,我觉得最好依据代码

IOS使用jenkins进行持续集成2

上一篇,自己尝试进行持续集成,研究的不深入,这两天,为公司搭建持续集成环境,以及内部发布系统,了解的更多了,所以分享出来. 这篇主要介绍一些其他东西,不重复介绍上一篇的内容. 如果使用jenkins进行ios持续集成,需要xcode插件支持,所以先下载xcode插件,而且后期还要用到ftp服务,也安装ftp的插件. jenkins中可以自己创建特定的视图分组,all视图点击+号就能创建新视图,创建好后,在左侧的编辑视图选项,则会进入详情页,可以选择放入此视图的任务:相对于任务,我觉得最好依据代码

fir.im weekly - 「 持续集成 」实践教程合集

我们常看到许多团队和开发者分享他们的持续集成实践经验,本期 fir.im Weekly 收集了 iOS,Android,PHP ,NodeJS 等项目搭建持续集成的实践,以及一些国内外公司的内部持续集成系统的经验,供大家集中研究,参考借鉴. 先来看看国内外一些公司的实践经验: Continuous Deployment at Instagram Instagram 的开发团队每天保持着 30 - 50 次后端代码部署,几乎全程无人参与,完全自动化.这听起来很疯狂,但一切确实在这样运转.来这里看看