返回
Featured image of post iOS 自动化打包发布

iOS 自动化打包发布

从远古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

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

如果没有安装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_identifierskip_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_identifieripa: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 来进行操作,这些我都进行尝试过。行文比较粗糙。如果对于文章中存在什么问题或者疑问,可以发邮件来和我进行讨论。

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy