26.fastlane 自动打包上传

fastlane安装

fastlane文档
安装最新版Xcode命令行工具,打开终端输入一下命名

xcode-select --install

如果已经安装过了,会提示
xcode-select: error: command line tools are already installed, 
use "Software Update" to install updates

使用 gem 直接安装 fastlane, 执行下面命令

sudo gem install fastlane

安装完成之后,进入到 项目目录中,并执行下面命令

// 安装后自动生成./Gemfile文件 ./fastlane目录 => Appfile Fastfile
fastlane init

//下面是 swift 的 可使用swift编写配置文件
fastlane init swift

fastlane插件Plugins配置

根据自己需要添加FTP、蒲公英、firim等等插件,进入到项目目录,执行命令

# https://docs.fastlane.tools/plugins/available-plugins/
// 蒲公英配置
fastlane add_plugin pgyer

// firim配置
//先通过 gem 安装 fir环境
sudo gem install fir-cli 
// 添加firim
fastlane add_plugin firim

ftp配置
fastlane add_plugin ftp

fastlane 配置打包上传

上面安装并初始化 fastlane 之后,会生成一个 fastlane文件夹,里面有两个文件需要配置 Appfile 和 Fastfile,下面配置他们两个

Appfile

Appfile 主要是配置项目的 账号名字 和 bundleID

app_identifier("APP_IDENTIFIER") # The bundle identifier of your app
apple_id("APPLE_ID") # Your Apple email address
itc_team_id("xx96xx6xx") # App Store Connect Team ID
team_id("xxYNxxK") # Developer Portal Team ID

=begin
如果本地 xcode 已经登录 apple账号 配置好了相关证书,那么直接使用本地环境下的账号信息即可
app_identifier   ENV['App_Identifier']
apple_id         ENV['Apple_Id']
itc_team_id      ENV['Itc_Team_Id']
team_id          ENV['Team_Id']
=end

# For more information about the Appfile, see:
#     https://docs.fastlane.tools/advanced/#appfile
Fastfile

fastfile 是项目配置的关键,打包发布的逻辑都在这里

打包企业版ipa并上传至FTP服务器,Fastfile如下所示
# 企业版打包 正式版: bundle exec fastlane ios release
# 默认使用/Applications/Xcode.app打包,get_build_number需要CURRENT_PROJECT_VERSION有值且与Info.plist build版本号一致

default_platform(:ios)

platform :ios do

  # 获取当前项目相关信息
  currentTime = Time.new.strftime("%Y-%m-%d %H-%M-%S")
  version_number = get_version_number # App版本号
  build_number = get_build_number # (xcodeproj: ENV['xcodeproj']) 具体项目 build版本号
  version_build = "#{version_number}#{'_'}#{build_number}"
  # puts version_build
  ipa_directory = "#{'/Users/xxx/Documents/IPA/Project  '}#{currentTime}"

  desc "正式版(enterprise)打包并上传FTP服务器"
  lane :release do | options |
    gym(workspace: ENV['Workspace'], # 编译项目文件,为目录环境下的workspace
    scheme: ENV['Scheme'], # scheme为环境下的
    clean:true, # 构建前先清理项目缓存
    silent: true, # 静默构建
    configuration: "Release",
    export_method: "enterprise",
    output_name:"#{'ios-phone-xxx-'}#{version_build}#{ENV['ipa']}",
    output_directory: ipa_directory) # Build your app - more options available
    # deliver(force: false)

    # 上传ipa文件至服务器
    ipa_name = "#{'ios-phone-xxx-'}#{version_build}#{'.ipa'}"
    ipa_src = "#{ipa_directory}#{'/'}#{ipa_name}"
    ftp(
      host: 'ftp.domain.com',
      username: 'your username',
      password: 'your password',
      upload: {
        src: ipa_src,
        dest:"/xxx/" 
      }
    )
  end

#  desc "上线 App Store"
#  lane :releaseAppStore do
#    increment_build_number(xcodeproj: "Project.xcodeproj")
# build_app(
            workspace: ENV['Workspace'], # 编译项目文件,为目录环境下的workspace
            scheme: ENV['Scheme'], # scheme为环境下的的scheme
            clean: true, # 构建前先清理项目缓存
            silent: true, # 静默构建
            output_directory: './fastlane/appstore/', # 设置导出ipa目录
            output_name:"#{currentTime}#{ENV['ipa']}") # 包的名称
#    build_app(workspace: "Project.xcworkspace", scheme: "Project")
#    upload_to_app_store(skip_metadata: true, skip_screenshots: true)
#  end

#  desc "Push a new beta build to TestFlight"
#  lane :beta do
#    build_app(workspace: "Project.xcworkspace", scheme: "Project")
#    upload_to_testflight
#  end

end

存在多个Xcode时,如果想使用旧版Xcode打包并上传FTP服务器,Fastfile配置如下所示

# Xcode项目配置自动签名,Info文件路径:./项目名/Info.plist(CFBundleVersion=整型数)
# 企业版旧版Xcode打包 内测版: bundle exec fastlane ios alpha_release

default_platform(:ios)
platform :ios do
    
  # 获取当前项目相关信息
  currentTime = Time.new.strftime("%Y-%m-%d %H-%M-%S")
  xcode_select("/Applications/Xcode 10.1.app") # 选择旧版Xcode10.1打包
  version_number = get_version_number(xcodeproj: ENV['xcodeproj']) # App版本号
  #build_number = get_build_number(xcodeproj: ENV['xcodeproj']) # 具体项目 build版本号
  build_number = get_info_plist_value(path: "./Project/Info.plist", key: "CFBundleVersion")
  version_build = "#{version_number}#{'_'}#{build_number}"
  # puts version_build
  ipa_directory = "#{'/Users/xxx/Documents/IPA/Project '}#{currentTime}" # ipa导出目录
  
  # ipa名称前半部分ios-phone-
  def getIpaName(var="sys")
    ipa_name = "#{'ios-phone-'}#{var}#{'-'}"
    # puts "#{'ipa名称:'}#{ipa_name}"
    return ipa_name
  end

  desc "内测版(enterprise)打包并上传FTP服务器"
  lane :alpha_release do | options |
    # xcode_select("/Applications/Xcode 10.1.app")
    ipa_name_prefix = getIpaName("alpha") 
    gym(build_path: "/Applications/Xcode 10.1.app",
    workspace: ENV['Workspace'], # 编译项目文件,为目录环境下的workspace
    scheme: ENV['Scheme'], 
    clean:true, # 构建前先清理项目缓存
    silent: true, # 静默构建
    configuration: "Release",
    export_method: "enterprise",
    export_options: {
      provisioningProfiles: { 
        "bundle_identifier" => "xxxDistributionProfile"
      },
      "signingStyle": "manual"
    },
    output_name:"#{ipa_name_prefix}#{version_build}#{ENV['ipa']}",
    output_directory: ipa_directory) # Build your app - more options available
    # deliver(force: false)

    # 上传ipa文件至服务器
    ipa_name = "#{ipa_name_prefix}#{version_build}#{'.ipa'}"
    ipa_src = "#{ipa_directory}#{'/'}#{ipa_name}"
    ftp(
      host: 'ftp.domain.com',
      username: 'your username',
      password: 'your password',
      upload: {
        src: ipa_src,
        dest:"/alpha/" 
      }
    )
  end 

end

上传蒲公英Fastfile

desc "上线蒲公英"
lane :adhoc_pgy do |options|
    # 编译版本号自增设置,项目的版本号需要自己设定的和appstore一样,自己项目中设置好即可
    increment_build_number(xcodeproj:ENV['Xcodeproj'])
    # 获取时间,用于设置包目录或者包名
    currentTime = Time.new.strftime("%Y-%m-%d-%H-%M-")
    logDirectory = "#{currentTime}"

    build_app(
        workspace: ENV['Workspace'],
        scheme: ENV['Scheme'],
        silent: true,
        clean: true,
        output_directory: './fastlane/pgy/',
        output_name:"#{currentTime}#{ENV['ipa']}",# 设置导出ipa目录
        export_method:"ad-hoc") # 导出方式为 ad-hoc

    # 设置蒲公英的 api_key 和 user_key
    # pgyer(api_key:'xxb3dd2ab6a5efc2b7d861356854xx',
    # user_key:'xxx753c46ae83961ed9478bdae86ebxx')
        
    # 使用本地环境下的蒲公英 key 信息,运行后首次需要自己输入账号密码
    # pgyer(api_key: ENV['api_key'],
    # user_key: ENV['user_Key'])
end

运行 fastlane

进入到项目目录,运行下面命令

// 自行选择lane执行
bundle exec fastlane

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

推荐阅读更多精彩内容