fastlane的使用及文件编写

6,350 阅读6分钟

背景

我们在开发过程中总免不了需要经历发测、上传等环节。这开发环节中,我们需要打不同环境的包,上传对应的分发后台(例如”蒲公英“、TestFlight、iTunes Connect)等。每次的手动打包的过程中,我们都要选择对应的环境、对应打包的证书、正确的target等工作。万一上述步骤哪一步选错了,轻者得重新走一遍上述的流程,更严重点还有可能会把测试服的数据传到正式服去了。仔细想想后患无穷。有没有一种方法可以在设置好一系列的任务流程后,只需要一句代码就可以自动帮我们完成上面提及的一些列操作。既减少我们手动操作的同时,还能减少选择环境证书导致错误的方法呢?有!fastlane就能帮到你。

fastlane

fastlane是一个自动化构建工具,主要包含测试、打包、发布等功能,它内部是由ruby实现的,是一款自动化非常高的脚本工具。

安装

mac自带的ruby,需要 sudo权限 sudo gem install fastlane

初始化

在项目根目录(通俗一点就是跟你.xcworkspace、Podfile文件同级的t地方)下,初始化Fastlane: fastlane init

选择对应需要的功能后完成初始化,这里我们选择4。

在初始化完成后我们看到在根目录下生成了一个fastlane的文件夹还有一个Gemfile文件

-fastlane
  -Fastfile(核心文件,主要用于 命令行调用和处理具体的流程,lane相对于一个方法或者函数)
  -Appfile(存储有关开发者账号相关信息)
-Gemfile(Gemfile是我们创建的一个用于描述gem之间依赖的文件。gem是一堆Ruby代码的集合,它能够为我们提供调用)

至此我们完成了第一步,fastlans的初始化。打开Fastfile我们就可以看见fastlane的核心文件了。

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

我们只需要在命令行敲fastlane custom_lane就可以执行这个自定义的任务。但当然由于我们啥都没设置,他并不会有任何效果。

Fastfile文件编写

和我们iOS的ViewController一样,fastlane也是有生命周期的。fastlane的生命周期为

执行顺序 方法名 说明
1 before_all 在执行 lane 之前只执行一次
2 before_each 每次执行 lane 之前都会执行一次
3 lane 自定义的任务
4 after_each 每次执行 lane 之后都会执行一次
5 after_all 在执行 lane 成功结束之后执行一次
6 error 在执行上述情况任意环境报错都会中止并执行一次

lane

lane是fastfile中的方法定义标签,可以理解为函数。fastlane 都是基于ruby,所以fastfile中也是使用ruby语法的。

定义一个简单的无参lane
lane :noParam_lane
    puts "这是一个无参数的lane"
end

调用方法fastlane noParam_lane

定义一个带参的lane,在fastfile中option类似于一个字典集。我们可以通过 option[:configuration] 取其中value
lane :param_lane do |option| 
   param = option[:param]
   puts "这是一个有参数的lane"
   puts param
end

调用方法param_lane(param: '我是参数')

Action

除开我们自定义fastfile中的方法,fastlane还提供了很多已经写好的独立的方法库,也就是Actions。 常见的action可以查阅Actions 或调用fastlane代码fastlane actions

举例

下面我们举一个简单的打包例子

APP_NAME = "XXX"
SCHEME = "XXX"
platform :ios do
  #在执行lane前先跑一遍cocoapods
  before_all do
    cocoapods
  end

  #debug包
  lane :iosDebug do
    package(configuration: "Debug",method:"development")
  end

  #release包
  lane :iosRelease do
    package(configuration: "Release",method:"ad-hoc")
  end

    #发布包
  lane :iosAppStore do
    package(configuration: "Release",method:"app-store"")
  end

  #打包函数
  lane :package do |option|
     #打包
     gym(
      scheme: "#{SCHEME}",
      export_method: option[:method],
      configuration: option[:configuration],
      include_symbols: true,
      include_bitcode: false,
      export_xcargs: "-allowProvisioningUpdates"
      )
      
  end

首先我们在Fastfile中全局定义了几个参数分别用于存储应用名、SCHEME等公用参数。在上一章节中我们说过fastlane的生命周期中有一个before_all(在执行 lane 之前只执行一次),我们在这个方法中先更新了一遍cocoaPods。然后定义了3个lane,分别对应我们开发过程中测试服发测、正式服发测、以及上传appstore的3种打包流程。在流程中通过对configuration 和method 的传参达到配置不同打包环境的效果。

switch lane

我们可以从代码中看到,iosDebug、iosRelease、iosAppStore 3个lane最后都调用了一个公用的lane package。这种在一个lane中调用另一个lane的使用方式我们把它命名为switch lane

gym

gym其实是actionbuild_app的别名。按照他的官方的说法,使用gym来构建ipa文件,会比其他构建工具还要快30%(真香)。

gym的参数有非常多取几个比较常用的来讲一下

| 参数名 | 解释 |默认值| |: --------: | :-----: | :----: | | workspace | workspace文件的路径| | | project | project文件的路径| | | scheme | 要打包项目的scheme| | | clean | 打包前要不要clean一下(最好还是clean一下吧,这个默认值是不clean的)|false | | output_directory | 打包后导出的目录|*(根目录) | | output_name | 导出ipa的名字| | | configuration | 打包的配置| ”Release”| | include_symbols | ipa文件应包含符号表吗| | | include_bitcode | ipa文件应包含include_bitcode吗| | | export_method | 导出有效值的方法,有效值包括:app-store, ad-hoc, package, enterprise, development, developer-id| | 其他详细的不常用的就不复制粘贴了大家可以看build_app这里 。

执行打包

有了上面对打包方法的封装,我们只需要根据不同的打包需求。测试服发测调用iosDebug;正式服发测调用iosRelease;打appstore包调用iosAppStore 即可获得我们想要的不同环境的包了。

上传蒲公英

我们在发测过程中还有上传到软件分发后台的操作,这个功能fastlane同样帮我们封装成插件了。我们只需要在在终端中,输入以下命令,即可安装蒲公英的 fastlane 插件。 fastlane add_plugin pgyer

安装完毕后,我们在Fastfile里需要上传到蒲公英的lane中加入相应的命令即可在得到ipa包后直接上传蒲公英

#debug包
lane :iosDebug do
  package(configuration: "Debug",method:"development")
  pgyer(api_key: "7f15xxxxxxxxxxxxxxxxxx141", user_key: "4a5bcxxxxxxxxxxxxxxx3a9e")
end

#release包
lane :iosRelease do
  package(configuration: "Release",method:"ad-hoc")
  pgyer(api_key: "7f15xxxxxxxxxxxxxxxxxx141", user_key: "4a5bcxxxxxxxxxxxxxxx3a9e")
end

PS:api_key和user_key在蒲公英的后台获取。

最后再调用一下lane:

可以看到在执行完cocoaPods、打包、上传蒲公英3个操作后。lane结束了任务!帮我们省了9分钟呢!9分钟打局王者他不香么!

拓展

有一个振奋人心的消息是:fastlane支持Swift编写了!!!Swift成为世界最好的语言指日可待!其实用法跟ruby版本类似,我也根据说明文档写了一下,如果是熟悉Swift代码编写的同行应该很容易上手。但其实这个fastlane.swift只是基于ruby的封装,并不是原生的Swift。但还是足以让iOS开发者兴奋的。不过局限于当前的bate版本是不支持插件的,因此像上文提及的上传到蒲公英这些操作fastlane.swift还无法实现。所以实用性还是不能跟ruby原生版本相提并论的。或许将来的某天fastlane.swift正式版发布可以解决这一问题,到时候我再补充Swift版本。Fastlane的开发者们加油吧!期待正式版发布!

参考资料:

Fastlane/Jenkins:一人團隊也用得上的 Continuous Delivery 系統

Fastlane官网

Fastlane(一):用法