当前位置:网站首页>Fastlane 一键打包/发布APP - 使用记录及踩坑
Fastlane 一键打包/发布APP - 使用记录及踩坑
2022-07-04 12:32:00 【iOSTianNan】
最近有空, 搞一搞fastlane 一键打包发布App store / testflight / fir.com
相关资料
安装fastlanebrew install fastlane
fastlane的安装和使用
Fastlane 官方文档
fastlane自动化打包(android)
fastlane - fastfile一些基础
idea使用vs code , 可以安装一些代码片段插件,快速上手
如何传参
传参写法
desc "Add description of lane"
lane :test1 do |options|
puts(options[:arg1])
puts(options[:arg2])
puts(options[:arg3])
end
命令行调用
fastlane test1 arg1:a arg2:b arg3:c
日志输出
[]
[14:33:30]: ------------------------------
[14:33:30]: --- Step: default_platform ---
[14:33:30]: ------------------------------
[14:33:30]: Driving the lane 'ios test1'
[14:33:30]: a
[14:33:30]: b
[14:33:30]: c
+------+------------------+-------------+
| fastlane summary |
+------+------------------+-------------+
| Step | Action | Time (in s) |
+------+------------------+-------------+
| 1 | default_platform | 0 |
+------+------------------+-------------+
[14:33:30]: fastlane.tools finished successfully
issuer_id
这个必须是主账户才能看到
如果提示找不到 p8 file, 记得检查一下路径, 要在fastlane 路径下, 如果是
./
路径, 会报错
key_filepath: ‘./fastlane/AuXXXX.p8’,
app_store_connect_api_key(
key_id: "D83848D23",
issuer_id: "227b0bbf-ada8-458c-9d62-3d8022b7d07f",
key_filepath: "D83848D23.p8",
duration: 200,
in_house: true
)
iOS端 步骤 (默认已经做好环境配置)
1.cd ios
2.fastlane init
3.编写 Fastfile 文件
4. .p8文件放入 ./fastlane文件目录
5. Fastfile文件代码如下
# This file contains the fastlane.tools configuration
# You can find the documentation at https://docs.fastlane.tools
#
# For a list of all available actions, check out
#
# https://docs.fastlane.tools/actions
#
# For a list of all available plugins, check out
#
# https://docs.fastlane.tools/plugins/available-plugins
#
# Uncomment the line if you want fastlane to automatically update itself
# update_fastlane
default_platform(:ios)
platform :ios do
desc "test"
lane :test do |options|
#add actions here
puts(Dir.pwd)
puts("test ----> 1")
end
desc "打包iOS+上传"
lane :app do |options|
# 数据变量部分
targetName = "channelMarketing"
scheme = targetName
fastlane = "fastlane"
ipa = "ipa"
workspace = targetName+".xcworkspace"
workspace_path = './'+workspace
output_directory = './'+fastlane+"/"+ipa
output_name = targetName + ".ipa"
# 自增build版本号
increment_build_number()
gym(
clean:true, # 打包前先clean一下
workspace:workspace,
configuration:'Release',
scheme:scheme,
silent:false, # 隐藏构建时不需要的所有信息 默认false
output_directory:output_directory,
output_name:output_name,
include_symbols:true,
export_method: 'app-store', # app-store | ad-hoc | development 等
export_xcargs: '-allowProvisioningUpdates'
)
# 获取ipa路径
ipa_file_path = lane_context[SharedValues::IPA_OUTPUT_PATH]
# 获取ipa基本信息
app_name = get_ipa_info_plist_value(ipa: ipa_file_path, key: "CFBundleDisplayName")
package_name = get_ipa_info_plist_value(ipa: ipa_file_path, key: "CFBundleIdentifier")
version_name = get_ipa_info_plist_value(ipa: ipa_file_path, key: "CFBundleShortVersionString")
version_code = get_ipa_info_plist_value(ipa: ipa_file_path, key: "CFBundleVersion")
puts("iPA基本信息: app_name = " + app_name);
puts("iPA基本信息: package_name = " + package_name);
puts("iPA基本信息: version_name = " + version_name);
puts("iPA基本信息: version_code = " + version_code);
# 复制一份ipa + 修改复制文件 包名
sh("open ./ipa")
changeName_cp = "cp"
changeName_file_org = "./"+ipa+"/"+output_name
changeName_file_new = "./"+ipa+"/"+targetName+"_"+version_name+"_"+version_code+".ipa";
sh(changeName_cp +" "+ changeName_file_org +" "+ changeName_file_new)
# 3.上传
api_key = app_store_connect_api_key(
key_id: 'xxxxxxx',#自行配置
issuer_id: 'xxxxxxx',#自行配置
key_filepath: './fastlane/xxxxxx.p8', #自行配置
duration: 1200,
in_house: false
)
# 上传到testflight
upload_to_testflight(
# 上边设置的授权信息
api_key: api_key,
skip_waiting_for_build_processing: true,
# 打包好要上传的文件
ipa: ipa_file_path,
skip_submission: true
)
end
# 提交一下git
after_each do |lane, options|
# ...
puts(Dir.pwd)
# 提交变动的build号
sh("cd .. && cd .. && git add . && git commit -m -a")
end
end
android端 步骤 (默认已经做好环境配置)
1.cd ios
2.fastlane init
3. 安装一些插件
fastlane add_plugin firim
安装插件的一些坑
踩坑1:
踩坑2 上传 fir.im
可是使用fastlane的插件 fir-im, 这里我采用了fir-cli, 直接走脚本上传了,
直接用fir-cli提供的命令行工具
在 lane中添加 就可以上传
sh "fir publish xxxxx your apk file xxxxxxx -T xxxxxxxxyou tokenxxxxxxxx"
当然安装插件的踩坑也是有的,主要是因为 Gemfile文件路径的问题
安卓根目录下 Gemfile 与 fastlane 同级
Could not find gem 'fir' in any of the gem sources listed in your Gemfile.
报错:
由于我在Android项目根目录下创建的 fastlane init 所以,Gemfile文件里面 plugins_path
要注意下获取路径
原Gemfile文件对 plugins_path
路径的写法为:
plugins_path = File.join(File.dirname(__FILE__), '.', 'Pluginfile')
eval_gemfile(plugins_path) if File.exist?(plugins_path)
这边改为:
plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile')
eval_gemfile(plugins_path) if File.exist?(plugins_path)
fir.im:80
报错:
遇到这个报错,主要还是fir-cli的版本过低,新版本升级后就替换了新域名
fir.im 更换域名至 betaqr.com 后, 需要升级至 fir-cli >= 2.0.4 有部分用户反馈 2.0.2 无法直接使用 gem update fir-cli 升级到 2.0.4, 则可以尝试卸载后重新安装, 即 gem uninstall fir-cli 后 gem install fir-cli
踩坑3: lane 中执行 sh "fir version"失败
can't find executable fir for gem fir-cli. fir-cli is not currently included in the bundle, perhaps you meant to add it to your Gemfile? (Gem::Exception)
问题还是出在Gemfile中, 确保其中有
gem "fastlane"
gem "fir"
Fastfile文件:
# This file contains the fastlane.tools configuration
# You can find the documentation at https://docs.fastlane.tools
#
# For a list of all available actions, check out
#
# https://docs.fastlane.tools/actions
#
# For a list of all available plugins, check out
#
# https://docs.fastlane.tools/plugins/available-plugins
#
# Uncomment the line if you want fastlane to automatically update itself
# update_fastlane
default_platform(:android)
platform :android do
desc "package"
lane :app do |options|
gradle(
task: 'assemble',
build_type: 'Release',
properties: {
"android.injected.signing.store.file" => Dir.pwd + "/xxxxx",
"android.injected.signing.store.password" => "xxxxxxxx",
"android.injected.signing.key.alias" => "xxxxxx",
"android.injected.signing.key.password" => "xxxxxxxx",
},
);
end
after_each do |lane, options|
# ...
apk_name = "xxxxxx.apk"
apk_path = Dir.pwd+"/"+apk_name
fir_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
apk_file_path = lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH];
build_type = lane_context[SharedValues::GRADLE_BUILD_TYPE];
sh("cp #{
apk_file_path} #{
apk_path}")
sh("fir version")
sh("fir login #{
fir_token}")
sh "fir me"
sh "fir publish #{
apk_path}"
sh("open .")
end
end
边栏推荐
- Detailed explanation of classic process synchronization problems
- How to disable debug messages on sockjs stomp - how to disable debug messages on sockjs Stomp
- AI should take code agriculture? Deepmind offers a programming version of "Alpha dog" alphacode that surpasses nearly half of programmers!
- Function parameters (positional parameters, default value parameters, variable parameters, named keyword parameters, keyword parameters)
- Install freeradius3 in the latest version of openwrt
- Process communication and thread explanation
- Practical dry goods: deploy mini version message queue based on redis6.0
- Global function Encyclopedia
- Bottom Logic -- Mind Map
- OSI model notes
猜你喜欢
It's hard to hear C language? Why don't you take a look at this (V) pointer
[Yunju entrepreneurial foundation notes] Chapter II entrepreneur test 22
ASP. Net razor – introduction to VB loops and arrays
DDS-YYDS
QQ group administrators
(August 10, 2021) web crawler learning - Chinese University ranking directed crawler
Summary of Shanghai Jiaotong University postgraduate entrance examination module firewall technology
Entitas learning [3] multi context system
Tableau makes data summary after linking the database, and summary exceptions occasionally occur.
Entitas learning [iv] other common knowledge points
随机推荐
Decrypt the advantages of low code and unlock efficient application development
Using terminal connection in different modes of virtual machine
World document to picture
MYCAT middleware installation and use
[the way of programmer training] - 2 Perfect number calculation
Possible to restore a backup of SQL Server 2014 on SQL Server 2012?
[directory] search
Sys module
OSI model notes
Day01 preliminary packet capture
Globalsign's SSL certificate products
How to use the mongodb ID array to get multiple documents- How to get multiple document using array of MongoDb id?
[Yunju entrepreneurial foundation notes] Chapter II entrepreneur test 6
Tableau makes data summary after linking the database, and summary exceptions occasionally occur.
Games101 Lesson 8 shading 2 Notes
[Yunju entrepreneurial foundation notes] Chapter II entrepreneur test 19
Haproxy cluster
Interview question MySQL transaction (TCL) isolation (four characteristics)
'using an alias column in the where clause in PostgreSQL' - using an alias column in the where clause in PostgreSQL
Reptile learning 4 winter vacation series (3)