1981 字
10 分钟
iOS 自动化打包发布
2019-04-15

从远古iOS开发过来的开发人员都经历过一段痛苦的开发过程,被苹果的证书以及缓慢的打包上传速度所折磨,这几年兴起的devops使得外国一些大佬鼓捣出一些iOSci cd工具。各种脚本各显神通,不过今天我想说的是其中一个比较著名的工具 [fastlane](https://github.com/fastlane/fastlane) 。截止到目前为止github上面的start数目已经达到 24978 个。

fastlane 是什么#

fastlane is a tool for iOS and Android developers to automate tedious tasks like generating screenshots, dealing with provisioning profiles, and releasing your application.

官网上是这样介绍的,帮助 iOS 和安卓开发者自动化操作一些任务比如说截图,管理证书或者发布应用。

fastlane 如何用#

按照官网的doc进行操作。一共分为 3 个步骤:

安装#

首先安装 xcode 命令行工具:

xcode-select --install

接着使用gem 安装 fastlane 或者 使用homebrew也都行.(题外话说两句,gem 是ruby的包管理工具,由于fastlane是使用ruby来编写的一个工具,所以可以使用 gem 来安装。对于 iOS 开发中大名鼎鼎的Cocoapods也是使用ruby来编写的,我们安装是也是通过gem来安装的)。homebrew 家庭酒酿这个是用来喝酒的。。 大雾。homebrewMac里面的一个包管理工具,它使得我们脱离各种繁琐的环境配置,只需要输入命令安装,卸载,brew管理包都是存放在/usr/local下,通过软链接的形式来使用。

homebrew

扯远了,使用下面的命令即可安装:

如果没有安装homebrew (https://brew.sh/) 的去官网按照步骤安装即可:

# Using RubyGems
sudo gem install fastlane -NV

# Alternatively using Homebrew
brew cask install fastlane

使用#

用命令行cd到工程目录下,使用命令初始化fastlane init:

步骤一

命令行会显示几种不同的自动化方式,我们选择上传App store的方式。结束之后的文件目录形式如下图:

步骤二

可以看到文件夹中多了一个文件和一个文件夹,gemfile 这个文件很简单,类似于iOS工程的Podfile一样,里面存放的是ruby所需要的第三方库,我们看到里面的内容,可以看到填写的是fastlane。再看到文件夹,文件夹里面有两个文件,我们重点关注的是fastfile这个文件。

source "https://rubygems.org"

gem "fastlane"

Appfile#

Appfile 主要存储的是一些每一个fastlane脚本需要使用的通用信息,比如说 Apple ID 或者是 APPBundle Id。更详细的配置可以参考官网的doc

FastFile#

这里就是我们自定义脚本的地方,可以打开这个文件看到里面有了一段默认的代码:


default_platform(:ios)

platform :ios do
  desc "Description of what the lane does"
  lane :custom_lane do
    # add actions here: https://docs.fastlane.tools/actions
  end
end

这里的语言使用的是ruby 语言,不太了解的可以看看ruby的语法,也挺简单的。我这里简单的说一下。default_platform(:ios)调用一个函数设置默认的平台iOS。后面针对iOS的平台来写脚本,lane 是定义一个模块的意思,我们自定义的每个不同的操作都可以用lane来表示。

fastlane里面有很多已经被人写好的actionaciton就是类似于一段别人写好的函数,我们可以在我们自定义的lane中调用。在官方的 doc 中已经有很多 action 了,测试,构建,截图,打包,证书管理,上传到 App Store 等等。

这里我自己写了个测试的 lane,没有做测试,仅供参考,让读者大概知道这么个意思就行,具体的还是需要根据自己的实际需求进行测试和验证。

  lane :releaseDemo do
    app_identifier = "demo.com"
    cocoapods

    get_certificates(
      app_identifier:app_identifier
    )

    get_provisioning_profile(
      app_identifier:app_identifier


    build_app(workspace: "Project.xcworkspace"scheme: "test")
    upload_to_app_store(app_identifier:app_identifier,skip_metadata: trueskip_screenshots:true)
  end

从第一行代码来看,顾名思义,这一行对下面这个 lane 的描述。这些描述在执行命令之后 fastlane 都会为用户生成一个 md 的文档,文档中显示着每个 lane 的执行方式和描述。接下来的代码使用 lane 来定义一个操作,releaseDemo 是这个 lane 的名称,fastlane定义了很多的action,这些我们都可以直接拿来组合使用,这和调用 api 差不多,具体的参数可以查询官方文档也可以使用命令行来查询。

  1. cocoapods 这个action 是将当前的工程执行pod install命令,podfile默认在当前工程目录下寻找,如果说不是则需要自己指定podfle文件路径。
  2. get_certificates 是获取证书的,app_identifier参数 是appbundle id
  3. get_provisioning_profile 是获取 provisioning_profile的。
  4. build_app 是用来构建app的,workspace 参数指定xcworkspace文件,scheme指定工程的target
  5. upload_to_app_store 上传构建出ipa文件到APP storeskip_metadata设置为true这个参数是用来跳过元数据的,skip_screenshots 设置为true 用来跳过上传截图。

关于上述的skip_metadataskip_screenshots这两个参数有的读者会比较疑惑,其实 upload_to_app_store 这个action有个别名叫deliver,这个action可以上ipa 还有 APP store connect 中需要的元数据和截图。在这里我并没有使用这个功能。在下面会讲到。

上述的 lane 写好之后我们就可以保存,在工程目录下执行

fastlane releaseDemo

就可以看到项目按照我们上面所定义的步骤开始自动化操作了。

deliver#

我们在工程目录下面使用命令行执行

fastlane deliver init

根据提示输入Apple IDBundle Identifier ,我们就得到了两个新的文件夹和一个文件.

文件夹

Deliverfile 可以在文件中对上传到 App Store 的过程中的操作进行一些配置,比如说设置语言,针对不同的语言来设置不同的元数据。

metadata 里面存放的就是App Store Connect 中存放关于app的元数据,当执行 fastlane deliver init 时 这些信息都会从线上下载到本地,包括截图。当我们需要使用 deliver 的功能来上传截图或者修改元数据时,只需要修改这里面对应的文件即可。

多 target 打包#

想必现在的工程肯定存在多 target。使用的时候就需要建立几个不同的环境配置文件,这种文件是以.env.targetName 这种形式来命名的。下面是公司现在的项目的配置文件的截图。

配置文件

在里面设置针对不同 target 所需要的不同配置进行填写。

再到 fastfile 中进行使用。

  lane :release do |options|
  app_identifier = ENV['app_identifier']
  scheme = ENV['scheme']
  type = options[:type]
 if type.eql?('release')
        #上传到app store
   upload_to_app_store(app_identifier:app_identifier,ipa:ipa_path, skip_metadata: trueskip_screenshots:true)
        #上传dsym到 fabric
      upload_symbols_to_crashlytics(dsym_path: dsym_path)
      elsif type.eql?('beta')
        upload_to_testflight(app_identifier:"com.GoToBus.app"ipa:"outPut/GotoBus/GotoBus.ipa"skip_waiting_for_build_processing: true)
      end

上面是截取公司的一部分的代码,使用时取得 app id 和 app 的 target name。就可以针对不同的 target 进行打包。 上面代码中有个 option,这是一个可以供用户输入的东西,后面调用的时候可以使用

    sh "fastlane release type:'release' --env GotoBus"

来调用这个这个 lane,option 得到的 type 类型时 release,或者还可以将 release 改成 beta 来打包测试版本的。

最后还可以加上执行成功之后发送邮件或者 slack 消息进行通知。

More#

fastlane 还可以执行测试,自动化截图,生成测试报告等等功能。还有官网上很多的 action,我们可以自定义组合这些东西来生成最适合自己的工作流。当然还可以结合 jekins 或者 Git lab 的 ci/cd 工具都是可行的,本质上通过调用 lane 来进行操作,这些我都进行尝试过。行文比较粗糙。如果对于文章中存在什么问题或者疑问,可以发邮件来和我进行讨论。

iOS 自动化打包发布
https://vaezc.github.io/posts/ios-自动化打包发布/
作者
vaezc
发布于
2019-04-15
许可协议
CC BY-NC-SA 4.0