在 iOS 开发中,最常见的打包方式是使用 Xcode 的 Product -> Archive 来进行打包,这种打包方式不仅慢,需要人工操作,而且打包完成之后还要手动把 ipa 包发给测试人员或上传到 AppStore,像这种重复性的工作最好由工具来完成。那么有没有一种自动化的工具可以完成这些操作呢?

fastlane 就是这么一款工具,它可以自动编译和发布 iOS 、Mac 或者 Android 程序。fastlane 包含了一系列的工具链来完成这些功能,你可以根据自己的需求定制出适合自己的持续集成方案。

fastlane 的工具链

fastlane 包含的工具链如下:

  • deliver :上传 App 的截图,元数据,二进制代码到 AppStore;
  • supply :上传 Android 应用和它的元数据到 Google Play;
  • snapshot :可以自动化 iOS 应用在每个设备上的截屏过程;
  • screengrab :可以自动化 Android 应用在每个设备上的截屏过程;
  • frameit :快速将截图放到屏幕尺寸合适的设备上;
  • pem :自动生成并且更新你的通知推配置文件;
  • sigh :可以自动的生成,更新,下载,替换你的配置文件,支持 App Store, Ad Hoc, Development 和 Enterprise 配置文件,并且支持很棒的特性,比如自动添加测试设备;
  • produce :可以用命令行在 iTunes Connect 和 Apple Dev Portal 创建新的 iOS App;
  • cert :自动创建并维护 iOS 应用的签名证书;
  • spaceship :一个用来访问 Apple Dev Center 和 iTunes Connect 的 Ruby library;
  • pilot :使用终端来管理你的 TestFlight 测试者的最好方式;
  • boarding :最简单的邀请 TestFlight beta 测试者的方式;
  • gym :编译你的 iOS App 从未如此简单;
  • match :使用 Git 在你的团队中轻松同步 certificates 和 配置文件;
  • scan :轻松在你的 iOS 或 Mac App上运行单元测试;配置文件

安装 fastlane

首先确保安装了最新的 Xcode command line tools

xcode-select --install

可以使用命令行安装 fastlane :

sudo gem install fastlane --verbose

如果 gem 速度比较慢,可以尝试将 gem 源更换为淘宝的 RubyGems 镜像:

gem sources --add https://ruby.taobao.org/ --remove https://rubygems.org/

如果想清除旧版本的 fastlane ,可以使用下面这个命令:

gem cleanup

开始使用 fastlane

在终端中 cd 到你的工程目录下,使用下面命令来初始化 fastlane:

fastlane init

fastlane 会让你输入 Apple ID 和对应的密码,如果没有创建 app identifier,fastlane 会提示你创建,接着会提示你选择打包的 Target,fastlane 会帮你在 ./fastlane 目录下创建一个Fastfile,其中包含了 fastlane 的执行流程,你可以根据自己的需要对 Fastfile 进行修改,来满足自己的需求。fastlane 的配置大致如下:

fastlane_version "1.89.0"

default_platform :ios

platform :ios do
  before_all do
    # ENV["SLACK_URL"] = "https://hooks.slack.com/services/..."
    cocoapods

  end

  desc "Runs all the tests"
  lane :test do
    scan
  end

  desc "Submit a new Beta Build to Apple TestFlight"
  desc "This will also make sure the profile is up to date"
  lane :beta do
    # match(type: "appstore") # more information: https://codesigning.guide
    gym(scheme: "xxx") # Build your app - more options available
    # pilot

    # sh "your_script.sh"
    # You can also use other beta testing services here (run `fastlane actions`)
  end

  desc "Deploy a new version to the App Store"
  lane :appstore do
    # match(type: "appstore")
    # snapshot
    gym(scheme: "ZM_Customer") # Build your app - more options available
    deliver(force: true)
    # frameit
  end
  
  # You can define as many lanes as you want

  after_all do |lane|
    # This block is called, only if the executed lane was successful

    # slack(
    #   message: "Successfully deployed new App Update."
    # )
  end

  error do |lane, exception|
    # slack(
    #   message: exception.message,
    #   success: false
    # )
  end
end

你可以通过查看 fastlane 工具链的文档来编写自己的 lanes

fastlane 的 lanes 执行流程

在终端中执行 fastlane beta,fastlane 将会:

  • 首先执行 before_all lanes 下的 Action,比如 cocoapods;
  • 然后会执行对应的 lanes beta 下的 Action,比如 gym;
  • 最后会执行 after_all lanes 下的 Action,比如 slack;
  • 如果执行中出现错误,会执行 error lanes;

使用 shenzhen 来实现应用部署到蒲公英


fastlane 也可以实现应用打包后发布,可以在对应的 lanes 最后添加相应的脚本文件,使用 curl 等命令来上传 ipa 到分发平台。

sh “curl -F xxx”

但是还有一种更方便的方式来实现应用打包部署,那就是 shenzhen,它支持的部署平台比较多,有:pgyer、firim、ftp、s3、itunesconnect、crashlytics、hockeyapp、deploygate、hockeyapp、testfairy 等常用的分发平台。

使用起来也非常简单,首先需要安装 shenzhen

gem install shenzhen

接着在 fastfile 对应的 lanes 的末尾添加如下命令:

sh "ipa distribute:pgyer -f "+ ipa_path + "/" + ipa_name +" -a USER_KEY
 -u APP_KEY"

对应的 USER_KEY 和 APP_KEY 可以到蒲公英的 API 信息中查看。

然后重新执行 fastlane beta,稍等片刻你的应用就自动打包并发布到蒲公英了!~