上篇说了一些问题,这篇文章就来看一下怎么打包过程。这里就按照步骤来讲一下。git
按照咱们APP现有的需求,先列举一下:服务器
fir.im
,且成功后发送一条消息到钉钉首先,按照常规步骤先走一遍,来看看是如何作的。markdown
desc "打测试包专用"
lane :fir do
...接下来这个步骤的全部命令所有在这里...
end
复制代码
由于我我的自己仍是习惯直接经过 ssh
的,因此按照上一篇的加上网络
# unlock_keychain
keychain_pass = sh("cat ~/.keychain_pass_file")
sh "security unlock-keychain -p #{keychain_pass}"
unlock_keychain(path: "~/Library/Keychains/login.keychain", password: "$(cat ~/.keychain_pass_file)")
复制代码
毕竟咱们打包确定要用最新代码的吧,因此这一步作了一些事,且保证不会和咱们上传的有区别:app
gsub
表示去除空行、换行符等--no-edit
表示自动合并,不然可能拉取以后须要手动输入合并信息pod update
并再次重置,主要是有时候更新会致使工程文件变化。使用 --no-repo-update
纯粹是由于网络很差# git branch
branch_name = sh("git rev-parse --symbolic-full-name --abbrev-ref HEAD").gsub(/\s+/, "")
# git pull
sh "git reset --hard"
sh "git pull origin #{branch_name} --no-edit"
# pod update
sh "pod update --no-repo-update"
sh "git reset --hard"
复制代码
这里有点坑,fastlane
自带的那个 increment_build_number
有点坑,没办法使用。因此只能就手动读取、设置ssh
PLISTPATH
的值# set version
prev_apk_version = get_info_plist_value(path: "#{ENV["PLISTPATH"]}", key: "CFBundleShortVersionString")
prev_build_version = get_info_plist_value(path: "#{ENV["PLISTPATH"]}", key: "CFBundleVersion")
apk_versions = prev_apk_version.split(pattern=".")
step = 1
if apk_versions[2].to_i == 0
step = 0
elsif (apk_versions[2].to_i % 2) == 0
step = 2
end
current_apk_version = "#{apk_versions[0]}.#{apk_versions[1]}.#{apk_versions[2].to_i+step}"
current_build_version = "#{prev_build_version.to_i + step}"
next_apk_version = "#{apk_versions[0]}.#{apk_versions[1]}.#{apk_versions[2].to_i+step+1}"
next_build_version = "#{prev_build_version.to_i + step + 1}"
set_info_plist_value(path: "#{ENV["PLISTPATH"]}", key: "CFBundleShortVersionString", value: current_apk_version)
set_info_plist_value(path: "#{ENV["PLISTPATH"]}", key: "CFBundleVersion", value: current_build_version)
复制代码
这个步骤也就是指定了打包目录和打包类型,没什么好说的。测试
# output path
output_name = "#{ENV["SCHEMA"]}_v#{current_apk_version}.ipa"
output_directory = "~/Desktop/ad-hoc/#{ENV["TAGNAME"]}/"
output_path = output_directory + output_name
# gym build
gym(
scheme: ENV["SCHEMA"],
workspace: "ksh3.xcworkspace",
include_bitcode: false,
export_method:"ad-hoc",
output_name: output_name,
output_directory:output_directory)
复制代码
fir.im
并从消息中读取到 Release id,这样子能够拼接成指定版本的连接(以前咱们都是手动去网站找的,累)fir publish -s #{ENV["FIRLINK"]} #{output_path}
# fir cli & grep Release id
release_id = sh("fir publish -s #{ENV["FIRLINK"]} #{output_path} | grep -i 'Release id is ' | grep -o -E '[a-z0-9]{16,}'")
# dingtalk
upload_msg = " #{ENV["APPNAME"]}v#{current_apk_version}"
upload_url = "https://fir.im/#{ENV["FIRLINK"]}?release_id=#{release_id}"
dingtalk(access_token:dingtoken, title:upload_msg, message:upload_msg, more_url: upload_url)
复制代码
# update tags & version
sh "git reset --hard"
sh "git pull origin #{branch_name} --no-edit"
sh "git tag #{ENV['TAGNAME']}_#{current_apk_version}"
set_info_plist_value(path: "#{ENV["PLISTPATH"]}", key: "CFBundleShortVersionString", value: next_apk_version)
set_info_plist_value(path: "#{ENV["PLISTPATH"]}", key: "CFBundleVersion", value: next_build_version)
sh "git add ."
sh "git commit -a -m 'update version'"
sh "git push origin #{branch_name} --tags"
sh "git push origin #{branch_name}"
复制代码
因为马甲包为了上架作了些混淆工做,因此会建立一个单独的 分支名_appstore
的分支做为混淆分支,这样会便于同步最新代码网站
主要步骤:ui
1. 拉取非混淆分支最新代码
2. 拼接分支名,切换到非混淆分支
3. 合并不是混淆分支代码到非混淆分支(这一步骤须要检查,可能有改动会形成冲突)
4. 经过正常打包逻辑打混淆包
5. 打包结束后,切换到正常分支
6. 遴选到最后更新版本的那条记录到正常分支,而后推送到服务器
复制代码
desc "打混淆包专用"
lane :mix do
# git branch
branch_name = sh("git rev-parse --symbolic-full-name --abbrev-ref HEAD").gsub(/\s+/, "")
# 混淆后的分支名,默认为:分支名_appstore
appstore_branch = "#{branch_name}_appstore"
# 拉服务器最新代码
sh "git reset --hard"
sh "git pull origin #{branch_name} --no-edit"
# 切换到混淆分支打包,以后切回来,遴选更新版本的变动到主分支
sh "git checkout #{appstore_branch}"
sh "git pull origin #{appstore_branch}"
sh "git merge #{branch_name}"
fir
sh "git checkout #{branch_name}"
sh "git cherry-pick #{appstore_branch}"
sh "git push origin #{branch_name}"
end
复制代码
其实上边已经把我整个打包脚本代码贴出来了,其中也没有什么敏感信息。url
文件保存到和
Fastfile
同级,名称应为.env.xxx
。命令记得带上fastlane fir --env xxx
// .env.ksh3
SCHEMA="" # schema的名字
PLISTPATH="" # Info.plist 的位置,路径为相对于程序根目录
FIRLINK="" # fir.im 的短链,如 wcfg2018
APPNAME="" # APP名,中英文随意
TAGNAME="" # git标签名,叫什么随意,不过最好有点意义,能够用拼音或者英文名
复制代码
这里我按照上篇的考虑,选择了从远程获取,这样能够始终保持最新版本
import_from_git(url: '....git', path: 'Fastfile')
复制代码