iOS开发技巧征服iOS技术重塑

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

2016-08-24  本文已影响7558人  yanging

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 提交新应用或更新已有应用所需要的常用任务。

使用 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

上一篇下一篇

猜你喜欢

热点阅读