背景

在实际的项目开发过程中,每次开发完成,发布测试包或者正式包的时候都需要一个一个去打包,打包完成后还需要上传到各类的分发平台。如果上传到App Store之类的可能还好一点。这边主要讲解下如何利用fastlane来一条命令构建两个包,并且上传到fir分发平台

什么是fastlane

fastlane是为您的iOSAndroid应用程序自动化测试部署和发布的最简单方法。🚀 它可以处理所有繁琐的任务,例如生成屏幕截图、处理代码签名和发布您的应用程序。(来自官网docs.fastlane.tools/)。

初始化fastlane

iOS

进入到Flutter项目的iOS目录文件夹中,执行fastlane init

首次会询问你用来做什么,我们这边选择4,手动配置,等他执行完成后,我们先等待。

Android

Android这边有点不太一样,因为不需要上传到Google商店,因此初始化过程中可能会出现报错,但不影响

分为两步骤

  • 询问你PackageName,按照真实项目的地址填写

  • SecretJson文件,这个没有,因为不上传Google Play,因此直接回车(注意,这里回车后会出现一些错误信息,忽略即可)

构造fastlane脚本

iOS

目录架构

如果缺少文件的话后面会说道,我们一个文件一个文件的讲解

设置Appfile

  • app_identifier:bundle identifier

  • apple_id:Your Apple email address

  • team_id:团队开发者证书ID

Match证书配置

fastlane match init

选择证书管理方式,我这边选择了1,当然你可以选择其他的方式。等运行完成后,会出现Macthfile文件

下面的信息根据你自己的实际情况来修改

git_url("git@gitlab.xxxxxx.com:it/xiaoku-xxxxxx.git")

storage_mode("git")
gitlab_host("https://gitlab.xxxxx.com")

type("development") # The default type, can be: appstore, adhoc, enterprise or development

app_identifier(["com.xxxxx"])
# username("user@fastlane.tools") # Your Apple Developer Portal username

# For all available options run `fastlane match --help`
# Remove the # in the beginning of the line to enable the other options

# The docs are available on https://docs.fastlane.tools/actions/match

生成开发者证书

fastlane match development

fastlane会自动去你的iOS开发者账号生成相关的证书,并且上传到git仓库中,方便其他同学的证书管理

生成正式环境证书

fastlane match enterprise

我这边生成的是企业证书,你如果有其他需求可以生成adhocappstore根据你自己的情况来

构建fastfile脚本

# This file contains the fastlane.tools configuration
# You can find the documentation at https://docs.fastlane.tools
#
# For a list of all available actions, check out
#
#     https://docs.fastlane.tools/actions
#
# For a list of all available plugins, check out
#
#     https://docs.fastlane.tools/plugins/available-plugins
#

# Uncomment the line if you want fastlane to automatically update itself
# update_fastlane

default_platform(:ios)

platform :ios do

    before_all do
      ENV["MATCH_PASSWORD"] = "MATCH_PASSWORD"
    end

    lane :dev do
      version = get_version_number(xcodeproj: "Runner.xcodeproj", target: "Runner")
      matchCert(
        type: "development",
      )
      gym(
        workspace:"Runner.xcworkspace",
        scheme:"Runner",
        export_method:"development",
        configuration:"Development",
        clean:true,
        output_directory:"build_ipa_development",
        output_name:"xiaoku.ipa",
        export_options:{
          manifest: {
            appURL: "xxxxx.ipa",
            displayImageURL: "xxxx",
            fullSizeImageURL: "xxxxx",
          },
        }
      )
    ipa_dir  = "../build_ipa_development"
    ipa_name = 'xiaoku.ipa'
    # 上传至 fir.im
    firim(firim_api_token: "xxxxxxx")

    UI.success("Successfully uploaded version #{version} to fir.im!")
    end

    desc "打包,同时生成manifset文件,上传至OSS中"
    lane :app do
      version = get_version_number(xcodeproj: "Runner.xcodeproj", target: "Runner")
      matchCert(
        type: "enterprise",
      )
      gym(
        workspace:"Runner.xcworkspace",
        scheme:"Runner",
        export_method:"enterprise",
        configuration:"Release",
        clean:true,
        output_directory:"build_ipa_release",
        output_name:"xiaoku.ipa",
        export_options:{
          manifest: {
            appURL: "xxxxx.ipa",
            displayImageURL: "xxxx",
            fullSizeImageURL: "xxxxx",
          },
        }
      )
    UI.success("Successfully finished deployment")
    UI.success("iOS install url: itms-services://?action=download-manifest&url=xxxxx/#{version}/manifest.plist")
  end

  desc "拉取git仓库的证书"
  lane :matchCert do |options|
    match(
      app_identifier: ["com.xxxx.xxx.xxx"],
      type: options[:type],
      force_for_new_devices: options[:force_for_new_devices],
      readonly: is_ci,
      keychain_password: "keychain_password",
    )
  end
end

主要修改脚本内的以下内容

  • ipa名称

  • displayImageURL地址

  • fullSizeImageURL地址

  • manifest.plist的下载地址

  • keychain_password

  • MATCH_PASSWORD

  • firim_api_token(如果不需要上传到fir,可以把这一段删除)

Fastane firim插件安装(如果不需要,则忽略)

fastlane add_plugin firim

Android

安卓的稍微简单一点,没有证书管理这么一套东西

设置Appfile

json_key_file("") # Path to the json secret file - Follow https://docs.fastlane.tools/actions/supply/#setup to get one
package_name("com.krausefx.app") # e.g. com.krausefx.app

构建fastfile脚本

# This file contains the fastlane.tools configuration
# You can find the documentation at https://docs.fastlane.tools
#
# For a list of all available actions, check out
#
#     https://docs.fastlane.tools/actions
#
# For a list of all available plugins, check out
#
#     https://docs.fastlane.tools/plugins/available-plugins
#

# Uncomment the line if you want fastlane to automatically update itself
# update_fastlane

default_platform(:android)

platform :android do
  desc "Deploy a new version to the Google Play"
  lane :app do
    gradle(
      task: 'assemble',
      build_type: 'Release',
      properties: {
        "android.injected.signing.store.file" =>  Dir.pwd + "/../keystore.keystore",
        "android.injected.signing.store.password" => "password",
        "android.injected.signing.key.alias" => "alias",
        "android.injected.signing.key.password" => "password",
      },
    )
    sh ("mv ../../build/app/outputs/apk/release/app-release.apk ../build/xiaoku.apk")
    firim(
      apk:"./build/xiaoku.apk", 
      platform:"android", 
      firim_api_token: "firim_api_token", 
      app_changelog: "Release",
      gradle_file: "./app/build.gradle",
      app_name:"xiaoku"
    )
  end
end

主要修改以下内容

  • 证书:keystore.keystore

  • password:证书密码

  • alias:证书别名

  • firim_api_token:(不需要则把这一段删除)

Fastane firim插件安装(如果不需要,则忽略)

fastlane add_plugin firim

准备Shell脚本

Release脚本

#!/bin/bash

# 定义颜色
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m' # 没有颜色

# 进入ios目录并执行fastlane dev
cd ios && fastlane app
if [ $? -ne 0 ]; then
    echo -e "${RED}❌ iOS部分执行失败!请检查错误日志。${NC}"
    exit 1
else
    echo -e "${GREEN}✅ iOS部分执行成功!${NC}"
fi

# 进入android目录并执行fastlane app
cd ../android && fastlane app
if [ $? -ne 0 ]; then
    echo -e "${RED}❌ Android部分执行失败!请检查错误日志。${NC}"
    exit 1
else
    echo -e "${GREEN}✅ Android部分执行成功!${NC}"
fi

echo -e "${YELLOW}🎉 所有任务都已成功完成!${NC}"

Dev脚本

#!/bin/bash

# 定义颜色
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m' # 没有颜色

# 进入ios目录并执行fastlane dev
cd ios && fastlane dev
if [ $? -ne 0 ]; then
    echo -e "${RED}❌ iOS部分执行失败!请检查错误日志。${NC}"
    exit 1
else
    echo -e "${GREEN}✅ iOS部分执行成功!${NC}"
fi

# 进入android目录并执行fastlane app
cd ../android && fastlane app
if [ $? -ne 0 ]; then
    echo -e "${RED}❌ Android部分执行失败!请检查错误日志。${NC}"
    exit 1
else
    echo -e "${GREEN}✅ Android部分执行成功!${NC}"
fi

echo -e "${YELLOW}🎉 所有任务都已成功完成!${NC}"

大功告成

以上操作全部完成之后,后期的打包动作大家应该都知道是啥了吧。就是执行上面的两个脚本就全部打包完成,并且同时上传到了fir上,用户可以直接利用fir链接进行安装

Release打包

sh build_release.sh

Dev打包

sh build_dev.sh