Fastlane 是一个强大的自动化工具,可以帮助 Flutter 开发者简化应用程序的构建、测试和发布流程。本文将详细介绍如何在 Flutter 项目中配置和使用 Fastlane 进行自动化部署。

Fastlane 简介

Fastlane 是一套 Ruby 编写的开源自动化 iOS 和 Android 应用测试,构建和发布的方案,可以处理比如生成截图,代码签名,打包应用等繁琐的步骤,大大提高开发效率。

安装 Fastlane

安装 Fastlane

brew install fastlane

或者直接使用 RubyGems 安装

sudo gem install fastlane

推荐使用 Gem 安装,Homebrew 安装的 Fastlane 可能会很难管理依赖版本,造成一些问题。

Fastlane 支持 Ruby 2.5 及之后的版本。

但是更推荐使用 rbenv 安装 Ruby,然后使用 bundler 来安装 fastlane。

如果使用 gem install fastlane 安装的时候长时间没有反应,尝试使用 sudo 安装。在 macOS High Sierra 以及以后的版本可能有一些权限的问题。

功能

Fastlane 具有如下的功能

  • 自动打包
  • 截图
  • 项目配置
  • 代码签名
  • 文档
  • 内测
  • 发布
  • 通知

Fastlane 还支持很多 Actions,包括

  • snapshot,生成多个设备截图
  • frameit,对截图增加物理边框
  • increment_build_number,自动增加 build number
  • testflight,上传 ipa 到 testflight
  • deliver,上传 ipa 到 AppStore

更多可以参考官网

使用

Flutter 项目下,各个平台的项目都在子文件夹下。

首先需要创建一个 FLUTTER_ROOT 指向 Flutter SDK 根目录。

首先我们来介绍一下 Android 项目

Android

进入 Flutter 的 android 文件夹,然后进行初始化

cd android
fastlane init

输入应用的包名(可以在 build.gradle 文件的 defaultConfig 中找到。

如果不上传到 Google Play,可以跳过 JSON 密钥文件设置。如果要提供 Google Play JSON 密钥文件,可以根据官方文档生成。

bundle exec fastlane run validate_play_store_json_key json_key:/path/to/fastlane-supply.json

iOS 平台

进入 iOS 目录,然后进行初始化

cd ios
fastlane init

选择合适的项目,比如 Automate beta distribution to TestFlight 或者 Automate App Store distribution。

按照提示完成 Apple ID 登录和其他设置。

配置 Fastlane

Fastfile 是 Fastlane 的核心配置文件,定义了不同的自动化任务(简称 lanes)。lanes 中可以定义 actions 组合,多个 actions 可以组合成一个 lanes。

lane :beta do
  increment_build_number
  build_app
  upload_to_testflight
end

lane :release do
  capture_screenshots
  build_app
  upload_to_app_store       # Upload the screenshots and the binary to iTunes
  slack                     # Let your team-mates know the new version is live
end

上面定义了两个不同的 lanes,一个是进行 beta 测试,一个是发布到 App Store。配置完成之后要做的就是

fastlane release

以下是一个简单的示例

default_platform(:ios)

platform :ios do
  desc "Push a new beta build to TestFlight"
  lane :beta do # beta是打包的脚本命令 打包上传时执行 fastlane beta
    build_app(workspace: "Runner.xcworkspace", scheme: "Runner") # 开始打包-打包时使用的配置文件
    upload_to_testflight #打包完成后-上传到testflight
  end
end

Android 示例

default_platform(:android)
platform :android do
  desc "构建 APK 并上传到 Firebase App Distribution"
  lane :beta do
    # 构建 Flutter Android 项目
    sh("flutter", "build", "apk")

    # 上传到 Firebase App Distribution
    firebase_app_distribution(
      app: "1:123456789:android:abcd1234",
      groups: "testers",
      release_notes: "新版本测试"
    )
  end
end

运行 Fastlane

配置完成之后,可以通过如下的命令运行 Fastlane

cd ios
fastlane beta

cd android
fastlane beta

Flutter 项目配置 fastlane

分别在 android 和 ios 目录中初始化

# iOS 配置
cd ios
fastlane init

# Android 配置
cd ../android
fastlane init

iOS 的 fastlane/Fastfile 中配置

default_platform(:ios)

platform :ios do
  desc "Push a new beta build to TestFlight"
  lane :beta do
    build_flutter
    upload_to_app_store(
      skip_screenshots: true,
      skip_metadata: true,
      submit_for_review: true,
      automatic_release: true,
      ipa: "../build/ios/ipa/aki_dict.ipa"
    )
  end

  # 添加构建 Flutter 的任务
  private_lane :build_flutter do
    sh("flutter build ipa")
  end
end

android 下配置

default_platform(:android)

platform :android do
  desc "Submit a new Beta Build to Play Store"
  lane :beta do
    build_flutter
    gradle(
      task: "bundle",
      build_type: "Release"
    )
    upload_to_play_store(
      track: 'beta',
      aab: '../build/app/outputs/bundle/release/app-release.aab'
    )
  end

  private_lane :build_flutter do
    sh("flutter build appbundle")
  end
end

track: 'beta' 在 Fastlane 的 Play Store 部署配置中表示将应用发布到 Google Play Console 的 Beta 测试通道。 Google Play 提供了几个不同的发布通道(track):

  • internal - 内部测试通道
  • alpha - 封闭测试通道
  • beta - 开放测试通道
  • production - 正式发布通道

GitHub Actions 实现 Fastlane CI/CD

分别在 Android 和 iOS 的 Fastfile 中添加发布 lane

# Android/fastlane/Fastfile
lane :beta do
  gradle(task: "clean assembleRelease")
  upload_to_play_store(track: 'beta')
end

# iOS/fastlane/Fastfile
lane :beta do
  build_app(workspace: "Runner.xcworkspace", scheme: "Runner")
  upload_to_testflight
end

在项目根目录,创建 .github/workflows/release.yml 文件

name: Release
on:
  push:
    tags:
      - 'v*'

jobs:
  release_android:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-java@v3
        with:
          java-version: '12.x'
      - uses: subosito/flutter-action@v2
        with:
          flutter-version: '3.3.8'
      - run: flutter pub get
      - run: flutter build appbundle
      - uses: ruby/setup-ruby@v1
        with:
          ruby-version: '3.1.2'
      - run: cd android && bundle install && fastlane beta

  release_ios:
    runs-on: macos-latest
    steps:
      - uses: maxim-lobanov/setup-xcode@v1
        with:
          xcode-version: latest-stable
      - uses: actions/checkout@v3
      - uses: subosito/flutter-action@v2
        with:
          flutter-version: '3.3.8'
      - name: Install Fastlane
        run: cd ios && bundle install && cd ..
      - name: Get Flutter dependency
        run: flutter pub get
      - name: Installl Pods
        run: cd ios && pod install && cd ..
      - run: flutter build ios --release --no-codesign
      - uses: ruby/setup-ruby@v1
        with:
          ruby-version: '3.1.2'
      - run: cd ios && bundle install && fastlane beta

需要添加必要的密钥和证书文件到 GitHub Secrets。

触发新的发布,创建 Git 标签并推送到 GitHub 可以出发自动发布流程

git tag -a v1.0.0 -m "Release v1.0.0"
git push origin v1.0.0