iOS 开发者快速入门 fastlane

通俗来讲,fastlane 是用于 App 自动化测试、打包、发布的工具,向上一层的抽象概念是我们常听到的持续集成 CI (Continuous Integration) /CD (Continuous Delivery) . 当前市场上,App 端实现 CI/CD 比较成熟的两种方式是 Jenkins 和 fastlane. 两者都是跨平台使用,既可以用在 Android ,也可以使用 fastlane 。 Jenkins 基于 java 语言编写,具有一定的可视化界面。fastlane 基于 Ruby 语言,全部为命令行操作。个人认为命令行的方式,更能彰显程序猿的身份,所以选择了 fastlane 来实现 iOS 端的 CI/CD.

fastlane 的官方文档 https://docs.fastlane.tools/ 中,详细介绍了 fastlane 的安装、配置和使用,但是由于英文文档的语言差异,阅读过后在实践中,有一些小细节需要特别注意,下面就自己在实际操作中遇到的困难,详细记录一下使用方式。

1 初始化

fastlane 安装后,需要 cd 到工程所在的目录,执行 fastlane init 命令,然后输入 4 选择 Manual setup,然后 2 次回车。如果安装成功,能在工程目录的同一级下,看到新生成的 fastlane 文件夹和 Gemfile 文件:

fastlane 初始化

各个文件的用途:

Gemfile -----显示本工程 fastlane 安装的插件和依赖包;
Gemfile.lock --- 记录 gem  的版本和仓库信息;
Appfile ---- 配置 App 的 bundle ID 、version、profile 文件等,以及 AppleID 账号相关等信息;
Fastfile ---- 配置 fastlane 的各种 Action , 本工程使用的 fastlane 命令都在此处配置;

Gemfile 和 Gemfile.lock 两个文件的理解,可以参照 cocoapods 的设置,Gemfile 类别 podfile , 定义了 gem 需要依赖的库文件;Gemfile.lock 类比 podfile.lock, 定义了 pod 的版本。当本地工程的 fastlane 依赖其他插件时,修改 Gemfile 文件,然后运行 bundle update 命令,即可更新本地 fastlane 。

2 文件含义

fastlane 运行的命令都在 Fastfile 文件中定义, 比如对工程 testFastlane 定义如下命令:

default_platform(:ios)

platform :ios do
  
  desc "Use test"
  lane :test do   
     scan(
         scheme: testFastlane
         output_directory: "fastlane/tests",
         clean: true
         )
  end 
end

然后在本地目录下,运行命令 fastlane test, 就能对 scheme -> testFastlane 进行测试。注:工程中的 scheme 需要设置为 shared

3 工具 dotenv

使用 gem 工具 dotenv ,可以为 fastlane 指定环境变量。

打开 Gemfile 文件,能够看到 fastlane 默认的 gem 源为 https://rubygems.org , 该网站在国内访问不太稳定,通常需要更改为国内的镜像网站 https://gems.ruby-china.com/ 。保存后,使用命令 gem install dotenv 命令安装。

本工程安装了 dotenv 后,默认会自动加载 fastlane 目录下的 .env 或者 .env.defalut 文件。在 fastlane 目录下,输入命令touch .env新建文件,在文件中添加如下内容:

XCODE_SCHEME = testFastlane
XCODE_CLEAN = true
EXPORT_OUTPUT_DIRECTORY = fastlane/tests

在 fastfile 文件中就可以使用,以上定义的环境变量。比如,对上面的 lane :test 进行改造:

default_platform(:ios)

platform :ios do
  
  desc "Use test"
  lane :test do   
     scan(
         scheme: ENV['XCODE_SCHEME'],
         output_directory: ENV['EXPORT_OUTPUT_DIRECTORY'],
         clean: ENV['XCODE_CLEAN']
         )
  end 
end

切换到 fastlane 文件夹所在的上层目录,使用命令 fastlane test,运行结果通过。在 iOS 打不同包时,如果想要新建多个环境,可以在 fastlane 目录下,新建多个名称为 .env.xxx 的环境文件。然后通过为 fastlane 命令加参数的方式 fastlane lane命令 --env xxx就能切换到需要的环境。

4 插件

fastlane 功能十分完善,其实现方式采用了元命令+插件的方式。其中 build 、test、build_ios_app 等都属于元命令。其他命令,比如自动增加版本号、增加 build 值等,通过插件来添加。fastlane 可以使用的插件,参考https://docs.fastlane.tools/plugins/available-plugins。安装后, 会在工程的 Gemfile 文件中记录。通过 bundle update 可以更新安装的插件。

以上是我在 fastlane 使用中遇到的坑,尤其是运行命令时,需要注意所在的路径。现在想来,和 pod 使用时一样,只有在 podfile 所在的目录下,才可以执行 install 命令,而 pod 和 fastlane 都是基于 ruby 的工具。所以,如果其他基于 ruby 的工具,应该都需要注意路径的问题。

最后附上自己工程对 fastlane 的配置文件:

fastlane_version "2.126.0"

default_platform(:ios)

platform :ios do

  lane :lint do 
     swiftlint(
         reporter: "html",
         output_file: "fastlane/swiftlint.html",
      ignore_exit_status: true 
         )
  end    

  lane :test do 
  
     scan(
         scheme: ENV['XCODE_SCHEME'], 
         output_directory: "fastlane/tests",
         clean: true
         )
  end 
 lane :build do 

     # cocoapods(
     #      clean: true,
     #      podfile: "Podfile"
     #    )
     # incerment the build number 
     increment_build_number(
         build_number: ENV['CI_JOBENV_ID'],
         xcodeproj: ENV['XCODE_PROJECT']
         )

     # BUILD 
     gym(
         scheme: ENV['XCODE_SCHEME'],
         configuration: ENV['DEVELOP_CONFIGURATION'],
         export_method: ENV['DEVELOP_EXPORT_METHOD'],
     output_directory: "fastlane/build",
         #export_xargs: ENV['DEVELOP_XARGS'],
         silent: true, 
         clean: true,
         #codesigning_identity: "iPhone Developer: Miao Wang (7298FM259A)",
         # export_options: {
        #   method: ENV['EXPORT_METHOD'],
        #      # provisioningProfiles: { 
        #      #            "com.jujinyufu.test" => "com.jujinyufu.test"
        #      #        }
         #  }
         )

  end 
  desc "Archive iOS app" # use with --env for env setting   
  # desc "****3) #{ENV['EXPORT_METHOD']}"
  lane :archive_app do  
    #increment_build_number_in_plist
    build_ios_app(
      workspace: ENV['XCODE_WORKSPACE'],
      configuration: ENV['DEVELOP_CONFIGURATION'],
      scheme: ENV['XCODE_SCHEME'],
      silent: ENV['XCODE_SILENT'],
      clean: ENV['XCODE_CLEAN'],
      output_directory: ENV['EXPORT_OUTPUT_DIRECTORY'], # Destination directory. Defaults to current directory.
      output_name: ENV['EXPORT_OUTPUT_NAME'],       # specify the name of the .ipa file to generate (including file extension)          
      export_options: {
        method: ENV['EXPORT_METHOD'],
        # method: "enterprise",
        # provisioningProfiles: { 
        #   "com.example.bundleid" => "Provisioning Profile Name",
        #   "com.example.bundleid2" => "Provisioning Profile Name 2"
        # }
      }
    )
  end   

  lane :increment_number do
    increment_build_number_in_plist(
      xcodeproj: ENV['XCODE_PROJECT'],
      scheme: ENV['XCODE_SCHEME'],
      build_configuration_name: ENV['DEVELOP_CONFIGURATION'],
    )
  end

  lane :deployFirim do
    firim(firim_api_token: "your firim token")
  end
  desc "Notification" # use with --env for env setting
  lane :notificationMac do |options|
    notification(   
        subtitle: "Finished Building",  
        message: options[:message], 
    )   
  end     
end

还有 env.default 的环境变量:

XCODE_WORKSPACE = testFastlane.xcworkspace
XCODE_PROJECT = testFastlane.xcodeproj
XCODE_SCHEME = testFastlane
XCODE_CLEAN = true
XCODE_SILENT = true
DEVELOP_CONFIGURATION = Release
DEVELOP_EXPORT_METHOD = development
EXPORT_METHOD = enterprise
EXPORT_ARCHIEVE_PATH = fastlane/archieve
EXPORT_BUILD_PATH = fastlane/build
EXPORT_OUTPUT_DIRECTORY = fastlane/ipa
EXPORT_OUTPUT_NAME = testFastlane

配合托管代码的 gitlab 配置,fastlane 还能够顺利实现,在提交分支后,自动打包。这部分知识,我打算另开一篇。就酱~

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

推荐阅读更多精彩内容