和重复劳动说再见-使用fastlane进行iOS打包

fastlane00

背景

初识fastlane

fastlane是一个经过简单命令来完成诸如截图、获取证书、编译、导出安装包、提交iTunesConnect等一系列操做的工具,它同时支持iOS和Android。 你可以经过简单的方式配置流程进行的顺序,并经过很是简单的命令执行其中的一个流程。固然它的简单并不表明功能也简陋,有开源社区的支持,更新迅速且有不少功能可以知足你的需求。 ios

fastlane01

为何使用它

以前咱们使用的是jenkins内的Xcode integration进行编译工做,可是其更新比较慢(至2017.12.20还未支持Xcode9),Xcode大版本更新后出现没法继续使用的问题。 后改用fastlane,发现其使用和配置还算简单,有开源社区支持,更新迅速功能强大。且相比jenkins里的插件,fastlane能够单独使用,也能够被多种CI接入git

配置使用环境

fastlane使用的是ruby环境且对ruby有版本要求(官网要求是ruby2.0以上),因此若是须要的话更新一波ruby,而后经过gem安装fastlane。github

更新ruby

更新ruby使用的是RVM工具,在命令行进行以下操做,安装时可能出现进度不动,多半多是由于被墙了。shell

#安装RVM工具
RVMcurl -L get.rvm.io | bash -s stable

#列出可安装的ruby版本(有原始的ruby也有其余版本的版本)
rvm list known

#根据刚才列出的ruby版本,安装一个ruby版本
rvm install ruby-xxxxx(xxx为版本号) 
复制代码

列出来ruby的版本,选择#MRI Rubies这一大类下面的,我装的是2.4的版本 api

fastlane02

由于我以前已经安装过了,因此提示是已经安装成功 ruby

fastlane03

安装fastlane

若是ruby版本知足要求,能够直接在命令行执行如下命令安装fastlane,这个安装比较顺利没出现报错,若是有报错能够根据缘由搜索一下解决办法。bash

#安装fastlane
sudo gem install -n /usr/local/bin fastlane
复制代码

配置fastlane

使用的环境搭建好了,就能够进行这一步来配置fastlane了。markdown

初始化

执行默认的初始化app

cd 项目目录
fastlane init
复制代码

根据提示输入信息,这一步我没有按照提示处理,由于在有多个BundleID多个target的工程上使用,实际上生成的配置仍是要修改的。curl

若是你的项目只有一个bundle id也只有一个开发者帐号的话,能够直接遵循官方的步骤配置。

fastlane06

初始化完成后能够看到项目目录里多出了一个fastlane文件夹,内有两个比较重要的文件AppfileFastfile

fastlane07
fastlane08

大体流程

经过在命令行执行fastlane [lane-name]以执行fastlane/Fastfile中的一个lane。 这个操做会依次从.env文件Appfile文件Deliverfile文件读取配置信息,最后由Fastfile中的逻辑来进行工做。

配置和使用

fastlane能够经过配置 .env文件、Appfile、Deliverfile、Fastfile 来完成各类工做。

其中Fastfile是最核心的用来控制流程走向的配置文件,.env和Appfile能够辅助Fastfile来设置一些参数,Deliverfile可用于配置提交iTunesConnect的一些参数。

须要查看,样例配置可直接前往下载样例配置

Appfile

Appfile是用来配置一些相似于AppleID、BundleID参数(参数是fastlane已经定义好的,新增的并无用,若是想新增变量须要使用.env方式),能够在Fastfile中使用,AppleID、BundleID等其实会被一些actions直接调用,并不须要写出来传递。

普通配置方式

直接在Appfile里填写app_identifier、apple_id、team_id等,而后根据lane的不一样能够设置成不一样。

# 默认配置
app_identifier    "com.devhy.test"
apple_id    "devhy1@xxxx.com"
team_id    "xxxxxxxxx1"

# 若是lane是ent换成Dev的配置
for_lane :ent do
  app_identifier    "com.devhy.testDev"
  apple_id    "devhy2@xxxx.com"
  team_id    "xxxxxxxxx2"
end
复制代码

使用.env配置方式

.env这个文件的做用是做为环境变量的配置文件,在fastlane init进行初始化后并不会自动生成,若是须要能够本身建立。

执行时默认会读取.env.env.default文件里的配置。经过执行fastlane [lane-name] --env [envName]来指定使用配置文件.env.[envName],读取顺序是.env -> .env.default -> .env.<envName>,相同的变量名会被后面的覆盖。

如我建了文件.env.myDev,里面写了一些参数,那在执行的时候使用fastlane [lane-name] --env myDev便可,想在Appfile、Deliverfile、Fastfile等调用,直接使用ENV['keyName']便可

# .env.myDev文件
# bundle id
App_Identifier = "com.devhy.testDev"
# 开发者帐号
Apple_Id = "xx2@xxxx.com"
# 开发者TeamId
Team_Id  = "xxxxxxxxx2"
# project的target scheme名称
Scheme   = "HYTestDev"
复制代码
# Appfile使用.env方式直接读取变量便可
app_identifier	 ENV['App_Identifier']
apple_id 		 ENV['Apple_Id']
team_id			 ENV['Team_Id']
复制代码

注意:由于是.env文件是.开头文件,默认是在finder中隐藏的,须要经过执行一下命令来显示

# 设置隐藏文件可见
defaults write com.apple.finder AppleShowAllFiles TRUE
# 重启finder服务以生效
killall Finder
复制代码

配置方式对比

普通配置方式:简单易懂,但不能自定义变量,且每一个lane想不同都要写一个for_lane .env配置方式:功能性强,但配置起来稍微麻烦一点

Deliverfile

Deliverfile是用来配置上传到iTunesConnect所需信息的,因为咱们主要用fastlane来打包,发布是手动将ipa包提交审核,因为没有进行过尝试因此该文件配置方式就不叙述了。

Fastfile

Fastfile是对流程进行控制的核心文件,须要设定支持的平台和在一些环节里须要作的事情。

基本结构

Fastfile主要是根据设定的平台,能够在before_all、after_all、error中作一些操做 以及 创建一些lane做为关键的执行逻辑,能够在其中使用fastlane内置的action,也能够调用自建action,还能够调用别的lane

# 由于fastlane存在新老版本兼容问题,因此通常会指定fastlane版本
fastlane_version "2.62.0"
default_platform :ios

platform :ios do
  # 全部lane执行以前,能够作如执行cocoapods的pod install
  before_all do
    cocoapods
  end
  
  # 名字叫ent的lane,命令行里执行fastlane ent
  lane :ent do
    # 执行一些action,如cert下载证书,sigh下载pp文件,gym进行编译和导出包
  end

  # 执行fastlane store便可
  lane :store do
    # 调用一些action
    
    # 调用别的lane,好比send_msg
    send_msg
  end
  
  lane :send_msg do
    # 调用一些action
  end
  
  # 全部lane完成以后,能够适用参数lane来区分
  after_all do |lane|
  end
	
  # 全部lane失败以后,能够适用参数lane来区分
  error do |lane, exception|
  end
end
复制代码

Fastfile样例

下面的Fastfile样例是配置了.env+Appfile后进行编写,由于这样在配置action时,能够省去一些入参。 由于使用了Appfile,cert的username、team_id 以及 sigh的app_identifier、username、team_id 能够不用传入了,fastlane在执行时会本身去从Appfile里取。以及以前在.env环境配置中设定了一个Scheme的字段,那么gym的scheme咱们可使用ENV['Scheme']来调用。

fastlane_version "2.62.0"
default_platform :ios

platform :ios do

  before_all do
    cocoapods
  end

  lane :store do
    # action(cert),下载[开发者证书.cer]
    # 下载的文件会存在项目根目录的build文件夹下
    # fastlane会让你在命令行登陆开发者帐号,登陆成功后,会在你的[钥匙串]中建立一个 {deliver.[username]} 的登陆帐户
    cert(
      # Appfile设置了这边就能够不用了
      # username: "devhy2@xxxx.com",
      # team_id: "xxxxxxxxx2",
      
      # 下载.cer文件的位置
      output_path: "build",
    )

    # action(sigh),下载[安装app匹配的Provision Profile文件(pp文件)]
    # 建议本身去苹果开发者网站证书中手动处理一波provision_profile
    # 建议用 bundleId_导出方式 来命名好比: 
    # 企业包pp文件叫 testDev_InHouse.mobileprovision
    sigh(
      # Appfile设置了这边就能够不用了
      # app_identifier: "com.devhy.testDev",
      # username: "devhy2@xxxx.com",
      # team_id: "xxxxxxxxx2",

      # 下载pp文件的位置
      output_path: "build",
      # 自动下载签名时,adc里pp名字,不写也能够会根据你的bundle id、adhoc与否去下载最新的一个
      # provisioning_name: "testDev_InHouse", 
      # 仅下载不建立,默认是false
      readonly: true, 
      # 由于是根据BundleID下载,致使adhoc和appstore会优先appstore,致使最后导出报错,若是是adhoc包请设置为true
      adhoc: true, 
    )

    # 编译配置,编译的scheme,导出包方式
    gym(
      # 使用.env配置的环境变量
      scheme: ENV['Scheme'],
      # app-store, ad-hoc, package, enterprise, development, developer-id
      export_method: "enterprise", 
      # 输出日志的目录
      buildlog_path: "fastlanelog",
      # 输出编译结果
      output_directory: "build",
      include_bitcode: false
    )
  end
  
  after_all do |lane|
  end

  error do |lane, exception|
  end
end
复制代码

actions

在fastlane中使用的诸如cer()、sigh()、gym()都是action,其本质是预先写好的ruby脚本(如:sigh.rb),fastlane中有不少已经写好的actions,固然也能够本身进行编写。

命令行经常使用的操做有:

  1. 查看全部Action fastlane actions
  2. 查看某个Action的参数说明 fastlane action [action_name]如(fastlane action gym)

配置后的使用

编写完各类配置后怎么使用?其实使用方法仍是比较简单的, 不使用.env配置,执行fastlane [lane_name]便可 使用某个.env配置,执行fastlane [lane_name] --env [env_name]便可

好比我在须要执行样例的Fastfile的store,并使用.env.myDev配置,那我能够执行fastlane store --env myDev

进阶使用

options参数传递

在执行shell脚本之类的都是能够传递一些参数的,fastlane也是有的,options就是存储了咱们在命令行中执行lane时传递的参数的字典,在befor_allafter_all、各类lane里均可以使用这个options

传递参数

# 使用key:value来传递一组对应的参数
fastlane ent key:value key2:value2
复制代码

接收参数

platform :ios do 
  before_all do |lane, options|
    #options参数
    value  = options[:key]
    value2 = options[:key2]
  end
  
  lane :ent do
  ...
  end
end
复制代码

private_lane

私有lane其实就像开发的时候的私有方法同样,外部是使用不到的,如在命令行中使用fastlane deal_param是执行不了的,但在Fastfile内部能够调用到。

platform :ios do 
  # 至关于全局变量
  build_config = "debug"

  before_all do |lane, options|
    # 调用私有lane deal_param 并将options传递过去
    deal_param options
  end
  
  lane :ent do
  # ...
  end
  
  # 私有lane,好比把传入的build参数进行一下处理
  private_lane :deal_param do |options|
    build_config = build_config ? build_config : "debug"
    build_config.capitalize!
  end
end
复制代码

自建Action

执行fastlane new_action,命令行提示输入自建的action名称,输入后fastlane会帮助生成一个action编写的模版ruby文件,在模版中编写本身的Action逻辑,具体由于暂时没有写过,请查看官方的文档。

与jenkins搭配使用

由于fastlane能够在命令行中使用,因此只要在jenkins中,构建的一些环节中使用Excute Sell方式,而后输入fastlane相关的命令便可了。

fastlane-10

附录

下载样例配置

AppFile + Fastfile .Env + AppFile + Fastfile + Options传递参数

参考资料

fastlane - Github fastlane - 官方文档

相关文章
相关标签/搜索