美文网首页iOS开发技巧征服iOS技术重塑
使用 fir 和 fastlane 实现 iOS 持续集成

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

作者: yanging | 来源:发表于2016-08-24 19:25 被阅读7558次

    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

    相关文章

      网友评论

      • macfai:你好,楼主,请问你的开发者帐号是个人的还是公司的,你打的包上传到fir,用的是开发证书打包吗,fastlane在打包时候会自动根据帐号选择使用什么证书吗
        谢谢
      • f1535a71d2d8:The xcworkspace file is missing, check the BUILD_DIR
      • ivanStronger:给个赞,我是自定义的sh脚本,没有直接在fastlane上加action。正好需要自动增加build号,参考你的代码。
      • zenoszhang:Could not find action or lane 'option'. Check out the README for more details: https://github.com/fastlane/fastlane/tree/master/fastlane,请教下大神,这个问题该怎么解决呀
        PisPMPL:请问你这个问题解决了嘛
        PisPMPL:@Draven_Lu 难道不是在和.xcodeproj一个路径下调用么
        Draven_Lu:Check out the README for more details: 这句话的意思是你调用fastlane的path不对
      • fb2585f74d0f:+------+-------------------------------------+-------------+
        | fastlane summary |
        +------+-------------------------------------+-------------+
        | Step | Action | Time (in s) |
        +------+-------------------------------------+-------------+
        | 1 | Verifying required fastlane version | 0 |
        | 2 | default_platform | 0 |
        | 3 | cocoapods | 20 |
        | 4 | increment_version_number | 1 |
        | 5 | increment_build_number | 0 |
        +------+-------------------------------------+-------------+

        [20:50:31]: fastlane finished with errors

        [!] Exit status of command 'cd /Users/xuminjie/Desktop/buyCar_fastlane && agvtool next-version -all && cd -' was 6 instead of 0.
        There does not seem to be a CURRENT_PROJECT_VERSION key set for this project. Add this key to your target's expert build settings.
        想问一下大神,我这是啥意思

      本文标题:使用 fir 和 fastlane 实现 iOS 持续集成

      本文链接:https://www.haomeiwen.com/subject/quvisttx.html