使用 fir 和 fastlane 实现 iOS 持续集成

fir

fir.im 是一个免费的应用内测平台,可上传测试包到 fir 上,然后测试人员就可以下载安装应用测试了。fir 提供了一个命令行工具
fir-cli,可编译 iOS/Android 应用,并上传应用到 fir 平台上。

安装 fir-cli

$ gem install fir-cli

获取 fir 账号的 token,执行 fir login,当使用 fir login 登录了之后, 后续命令都不需要加上 -T 参数, 会默认使用当前用户的 token 进行相关操作。

$ fir login XXX_YOUR_API_TOKEN_XXX

fir build_ipa 编译打包 ipa 文件:

schema="testFir"
fir build_ipa ~/Developer/$schema -o ~/Developer/build -w -C Release -S "$schema"

参数说明:-w 是 --workspace 的简写,表示编译 *.xcworkspace, 没有带这个参数则编译 xcodeproj 文件。 -C Release, 以 Release 方式打包,若 Debug 则是打调试包。 -S: 编译用 CocoaPods 做依赖管理的 .ipa 包。

上传包命令:

fir publish -c "first version log" ${schema}*.ipa

-c 后带 log。该命令将上传上一步生成的 ipa 包。默认的包名是 schema-版本号-build-build 号,如 testFir-2.5.3-build-576.ipa。把这几行代码保存成一个 shell 脚本,然后运行这个脚本就可以自动编译打包并上传应用到 fir 上,一步到位!

Fastlane

Fastlane 是一个 ruby 脚本集合成的工具套件,旨在实现iOS应用发布流程的自动化。Fastlane 包括了向 App Store 提交新应用或更新已有应用所需要的常用任务。

  • gym 编译打包生成 ipa 文件
  • deliver 用于上传应用的二进制代码,应用截屏和元数据到 App Store
  • sigh 可以生成并下载开发者的 App Store 配置文件
  • snapshot 可以自动化iOS应用在每个设备上的本地化截屏过程

使用 gem 安装 fastlane

 sudo gem install fastlane

确保 Xcode 命令行工具已安装:

xcode-select --install

进入工程目录,初始化 fastlane 配置,运行命令

fastlane init

如图

fastlane init

在“Your Apple ID" 这一步输入苹果开发者账号,fastlane 会自动获取工程文件名,目录等其他数据。这一步“Please confirm the above values”,确认信息,没问题则输入 y。然后,fastlane 会进行一系列的初始化操作,包括下载 App Store 上的元数据和截屏文件。等待初始化完成之后,工程目录下就多了一个 fastlane目录:

$ cd fastlane && ls
Appfile            Fastfile           metadata           report.xml
Deliverfile        README.md          screenshots

metadata 和 screenshots 是目录,metadata 下会存放元数据文件,包括关键词,版本更新日志等信息。screenshots 下是 App Store 上的截屏图片。

Appfile 记录应用的 bundle ID、Apple ID、Team ID,这个文件不用修改。
Fastfile 是执行脚本,有几个默认的选项,可直接使用。

打包并上传应用到 Apple TestFlight,运行命令:

$ fastlane beta

打包并上传应用到 App Store,执行命令

$ fastlane appstore 

默认的脚本会上传元数据、应用截屏图片到 App Store,但我们可能只想传包。我们还需要设置版本号和编译号,这个时候就得修改 Fastfile。

首先在 Fastfile 文件开头添加一个函数,prepare_version设置版本号。

default_platform :ios

scheme = "xiaoxinyong"

def prepare_version(options)
    increment_version_number(
        version_number: options[:version]
    )

    increment_build_number(
        build_number: options[:build]
    )
end

编译生成 ipa 文件,并上传至 App Store 的部分代码修改如下:

  desc "Deploy a new version to the App Store"
  lane :appstore do |options|
    # match(type: "appstore")
    # snapshot
    
    prepare_version(options)
    
    full_version = options[:version] + '_' + options[:build]

    gym(scheme: "#{scheme}", 
      workspace: "#{scheme}.xcworkspace",
      silent: true,
      clean: true, 
      output_directory: "./build", 
      output_name: "#{scheme}_#{full_version}.ipa" ,
      configuration: "Release") # 编译打包 ipa 文件
      
    deliver(force: true, 
      skip_screenshots:true, 
      skip_metadata: true)    # 不上传截屏文件和元数据。
    
    # frameit
  end

gym 是编译打包工具,可设置的参数:

scheme "Example"  # 工程名

clean true  # 编译前执行 clean,可减少 ipa 文件大小 

output_directory "./build"    # 打包后的 ipa 文件存放的目录
output_name "MyApp"           # ipa 文件名
configuration: "Release"      # 打包方式,Release 或者 Debug
gym 编译包

需要注意的是,用 gym 打包的 ipa 文件会比直接用 Xcode 导出 ipa 文件大,但实际上传到 App Store 上的文件大小和 Xcode 的差不多。所以如果发现 ipa 文件大了许多,不用在意。

修改完之后,打包并上传应用到 App Store 的命令如下:

$ fastlane appstore version:2.5.4 build:200

如果我们想让 build number 自动生成,而不是每次都手动输入,使用increment_build_number即可,但我在执行的时候,总会报错,于是改用其他方式,shell 脚本如下:

#!/bin/sh

#
# usage:
# > sh build_appstore.sh 2.5.4
#

SCHEMA="your schema"
PROJECT_PATH="/Users/your username/Developer/$SCHEMA"
BUILD_PATH="$PROJECT_PATH/build"
echo $PROJECT_PATH
# echo $BUILD_PATH

function useExample {
    echo "\nUse Example: sh build_appstore.sh 2.5.4\n"
    exit 1
}

[ -z "$1" ] && echo '请输入版本号' && useExample
    
PRODUCT_SETTINGS_PATH="$PROJECT_PATH/$SCHEMA/Info.plist"

OLD_NUMBER=`/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$PRODUCT_SETTINGS_PATH"`
 
# If the build number key doesn't exist in the plist, we'll add it by setting its initial value to 1.
if [ $? -ne 0 ]; then
  STARTING_NUMBER=1
  OLD_NUMBER=1
  echo "No build number present. Starting from ${STARTING_NUMBER}."
  `/usr/libexec/PlistBuddy -c "Add CFBundleVersion string $STARTING_NUMBER" "$PRODUCT_SETTINGS_PATH"`
 # exit 0
fi

NEW_NUMBER=$((OLD_NUMBER+=1))
`/usr/libexec/PlistBuddy -c "Set CFBundleVersion $NEW_NUMBER" "$PRODUCT_SETTINGS_PATH"`
[ $? -ne 0 ] && echo "error for increment build number" && exit 1

buildNumber=$NEW_NUMBER # 2000
versionNumber=$1 # 2.5.4
laneName=appstore
echo "build: $buildNumber, version: $versionNumber, lane: $laneName"
fastlane $laneName version:$versionNumber build:$buildNumber

之后要上传新版本到 App Store,运行如下命令即可:

$ sh build_appstore.sh 2.5.4

有了这几个脚本,编译发包只需一条命令,是不是很简单!

参考链接:
使用fastlane实现iOS持续集成
Automating Version and Build Numbers Using agvtool

Automatically Incrementing Version and Build Numbers

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容