fastlane 相关的配置
fastlane 的安装过程略。
配置 adhoc
需求是打包上传,并将 app 上传到 fir.im 上。 幸运的是 fir 提供了相应的插件,并且支持回调给钉钉机器人。
default_platform(:ios)
platform :ios do
before_all do
ENV['CHANGE_LOG'] = '脚本自动打包'
end
desc "adhoc"
lane :adhoc do
cocoapods
sigh(
force: true,
adhoc: true,
output_path: "./fastlane/build/adhoc"
)
recentTagName = last_git_tag
recentTagName = recentTagName.nil? ? "" : recentTagName
ipa_name = recentTagName + "_adhoc_" + Time.new.strftime('%Y%m%d%H%M')
start_t = Time.now
gym(
clean: true,
scheme:"goodDoctor",
export_method:"ad-hoc",
output_name: "#{ipa_name}.ipa",
output_directory:"./fastlane/build/adhoc"
)
end_t = Time.now
delta_t = (end_t - start_t).to_i.to_s
changelog = ENV['CHANGE_LOG_JENKINS'].nil? ? ENV['CHANGE_LOG_JENKINS'] : ENV['CHANGE_LOG']
fir_cli(
api_token: "<fir.im提供的api token>",
dingtalk_custom_message: "release: adhoc版本上传成功,打包总共耗时#{delta_t}秒",
dingtalk_access_token: "<钉钉webhook的access token>",
changelog: changelog,
specify_file_path: ("./fastlane/build/adhoc/" + "#{ipa_name}.ipa")
)
end
end
配置 testflight
需求是 build 号根据 testflight 最近的 build 自增,然后发布到
default_platform(:ios)
platform :ios do
before_all do
ENV['PILOT_GROUPS'] = '测试组A'
ENV['FASTLANE_ITC_TEAM_ID'] = '<对应itc team id>'
ENV['CHANGE_LOG'] = '脚本自动打包'
end
desc "上传testflight"
lane :tf do
sigh(
adhoc: false,
output_path: "./fastlane/build/adhoc"
)
build_number = (latest_testflight_build_number.to_f + 0.01).round(2).to_s
increment_build_number({
build_number: build_number
})
c = get_version_number
ipa_name = version + "_build#{build_number}_testflight_" + Time.new.strftime('%Y%m%d%H%M')
gym(
clean: true,
scheme:"<需要打包的scheme,如果只有一个可不指定>",
export_method:"app-store",
output_directory:"./fastlane/build/appstore",
export_options: {
"compileBitcode":false,
"uploadSymbols":true,
"stripSwiftSymbols":true
},
output_name: "#{ipa_name}.ipa"
)
groups = ENV["PILOT_GROUPS"].split(",")
changelog = ENV['CHANGE_LOG_JENKINS'].nil? ? ENV['CHANGE_LOG_JENKINS'] : ENV['CHANGE_LOG']
upload_to_testflight(
ipa: "./fastlane/build/appstore/#{ipa_name}.ipa",
changelog: changelog,
groups: groups
)
noti_content = {
msgtype: "link",
link: {
title: "some text (iOS)#{iOS}build#{build_number} testflight内测版 release",
text: "已经更新啦,快去下载吧!",
messageUrl: "https://testflight.apple.com/join/6bSrNybc"
}
}
uri = URI.parse("https://<钉钉机器人webhook的地址>")
https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true
request = Net::HTTP::Post.new(uri.request_uri)
request.add_field('Content-Type', 'application/json')
request.body = noti_content.to_json
response = https.request(request)
puts "------------------------------"
puts "Response #{response.code} #{response.message}: #{response.body}"
end
end
可能遇到的一些问题说明
fir_cli 无法通知钉钉
出于安全考虑,钉钉机器的需要设置关键词 or 加签名 or 设置 ip 段。
笔者为了方便起见,选择了“关键词”,发送消息的时候添加对应的关键词即可。
gem 源的问题
由于天朝网络环境的问题,导致 gem install 卡住,可以使用 rub-china 源头,指定 Gemfile:
source "https://gems.ruby-china.com/"
gem "fastlane"
(ps:全局的 gem 源应该不用修改,笔者未做测试,换源操作如下:)
➜ gem source -l
*** CURRENT SOURCES ***
https://rubygems.org/
➜ gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
https://gems.ruby-china.com/ added to sources
https://rubygems.org/ removed from sources
cocoapods 命令执行失败
解决方法: 使用 gem 安装 cocoapods(sudo gem install fastlane -NV
),并且在 Gemfile 上配置好,例如
source "https://gems.ruby-china.com/"
gem "fastlane"
gem "cocoapods"
plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile')
eval_gemfile(plugins_path) if File.exist?(plugins_path)
Apple 鉴权认证问题
如果近期修改过密码,可能导致输入验证码时校验失败,此时可以尝试登录https://appleid.apple.com/
选择’安全‘ -> ’更改密码‘ -> "从设备和网页中注销我的 Apple ID"
但是推荐使用FASTLANE_SESSION
进行验证。
使用 App 专用密码进行登陆校验
1). 可在https://appleid.apple.com/处生成专有密码
2). 在.zshrc
添加全局变量
export FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD=App专用密码
3). 生成 session,并按提示添加 FASTLANE_SESSION
变量到.zshrc
~ fastlane spaceauth -u <
FASTLANE_ITC_TEAM_ID 的获取
FASTLANE_ITC_TEAM_ID 不同于 itc 的 team id
如果账号同时属于多个 itc,当上传包到 testflight 时,那么需要 FASTLANE_ITC_TEAM_ID 进行区分,
至少有两种方法可以获取:
方法 1,执行命令时,根据命令行页面的提示内容进行保存
方法 2,登录 itunesconnect,然后访问这里.
迁移到其他机器上
大致步骤为:
- 安装 fastlane
- bundle update
- 执行相应的命令
itc app 上传失败的问题
- 比较简单的解决方式是换个网络环境重试一下,例如用手机流量等等。
- 科学上网,设置代理
笔者发现,itc app 上传默认状态是不走终端的网络代理的(也许是借用的 xcode 内置的 app upload?), 但是使用科学上网工具(如 clash 等等)的全局代理有效。
其他待完善的
安装 Jenkins
docker 运行 Jenkins(废弃)
(废弃的方案)
使用 docker 安装,拉取最新的版本:
$ docker pull jenkins/jenkins
运行:
docker run --name jenkins \
--user=root -p 8081:8080 \
-v `pwd`/jenkins_home:/var/jenkins_home \
-d jenkins/jenkins
执行并查看密码:
$ ./docker-jenkins.sh
$ docker logs jenkins
重启命令:
直接运行 Jenkins 文件
由于涉及一些环境变量,这里放弃使用 docker 安装 jenkins,直接运行 jar 包的方式,并选择安装建议的插件。!!注意不要 sudu,会造成 cocoapods 命令执行失败。
java -jar jenkins.war --httpPort=9090
插件选择默认的插件即可。
fastlane 配置任务
本地环境配置过 fastlane,这里不再安装其他插件。
1). 选择新建任务
创建新任务,选择自由风格。
2). 一些简单的配置。
配置 git 的仓库地址,并配置 Credentials(git 用户名和密码)。
3). 直接执行相应的打包命令等,例如前文编写的 adhoc 命令
待处理的需求
如果有专门的打包机器还是非常方便的。由于初次接触 jenkins,各种插件不甚了解,一些东西功能需求有时间再进行完善。
- jenkins 打包命令之前,使用钉钉机器人进行提前通知(使用钉钉插件)
- 提取两个 tag 之间的 git log,借助插件 git-changelog-plugin,参考
- 使用 gitlab 的 webhook 主动通知 jenkins 进行更新
参考资料