继之前完善了Jenkins打包,可以交给那些点点点们一键化打出各种环境的包后,在最终上线前,需要打Release发到TestFlight上去。
前面Jenkins的配置和基础打包操作铺垫在之前的文章中都OK了(详见:自动化打包实战 — Jenkins),那我们接下来实现打Release包上传TestFlight,并且在这之前需要先自己push一个修改Build号的提交(因为TestFlight上需要不一样的Build号),这里使用Shell脚本处理的,行了,开工。
在拉取最新分支的代码后整个过程总共分为3步:
1、自动修改Build号,并生成提交,push到远程分支上;
2、开始打Release包,并导出IPA文件;
3、利用Application Loader插件实现自动上传。
前提:Jenkins相关配置已经完成,发布证书、本地Git用户、push到Git上的权限账户等都已配置完成,如果配置未完成,部分错误在后面会出现,再补上也OK。
一、自动修改Build号,并生成提交,push到远程分支上
1、自动修改Build号 (Shell脚本)
(1)先取到当前Build号,Shell中读取plist文件的方法比较简单,利用的是Mac中操作plist文件的PlistBuddy,路径在/usr/libexec/PlistBuddy下,这点在之前的文章中写过:Jenkins 自动打包后打一个tag并同步到origin。
// Jenkins项目拉取下来后,本地的project中,info.plist的路径
PRODUCT_SETTINGS_PATH=/Users/xxxxx/.jenkins/workspace/xxxxx/xxxxx/Info.plist
// 取到Build号(示例:1.0.8.3)
BundleVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$PRODUCT_SETTINGS_PATH")
(2)将版本号(示例:1.0.8.3)先分割字符串,取到最后一个元素(可能会是2位数字或者3位数字),然后把最后一个元素转数字,再 +1 ,再转回字符串。
// 定义一个数组,将前面取到的Build号字符串根据“.”进行分割,得到@[1, 0, 8, 3]
array=(${BundleVersion//./ })
// 拿到数组中最后一个字符串 "3",(其中 ${#array[*]} 是获取数组的length)
lastNumber=${array[${#array[*]}-1]}
// 将这个字符串转数字并且 +1 ,得到 4
newLastNumber=`expr $lastNumber + 1`
// 再转回字符串 得到“4”
newLastNumberString=${newLastNumber}
(3)进行字符串拼接,最终效果:1.0.8.4
// 定义一个新字符串,为数组第一个元素“1”
NewBundleVersion=${array[0]}
// 定义分隔符字符串 “.”
point=.
// 用for循环,从第2个元素开始一直到倒数第2个元素都取出(不取最后一个,因为要用新的)
for ((i = 1; i < ${#array[@]}-1 ; i++ ))
do
// 自己 = 自己 + . + 元素
NewBundleVersion=${NewBundleVersion}${point}${array[$i]}
done
// 最后把前面 加了1的新元素 添加到最后,于是得到1.0.8.4
NewBundleVersion=${NewBundleVersion}${point}${newLastNumberString}
(4)将新的Build号写入info.plist文件
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $NewBundleVersion" "$PRODUCT_SETTINGS_PATH"
2、生成commit,然后push上去 (Git命令)
(1)生成提交描述:
// 取到最新的Build号
PRODUCT_SETTINGS_PATH=/Users/xxxxx/.jenkins/workspace/xxxxx/xxxxx/Info.plist
BundleVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$PRODUCT_SETTINGS_PATH")
// 拼接一个提交描述的字符串
CommitMessage="自动提测testflight,build:"${BundleVersion}
(2)到对应的Git目录下进行Git操作
// 进入项目路径
cd /Users/xxxx/.jenkins/workspace/xxxxxxxx
// git add -u 加上路径,只添加指定路径的文件到暂存区,这里是把修改过的info.plist文件加入
git add -u /Users/xxxx/.jenkins/workspace/xxxxxxxxxx/xxxxxxxx/Info.plist
// 利用前面生成的提交提交描述生成commit
git commit -m ${CommitMessage}
// push到指定的远程分支上,我这里是develop
git push origin HEAD:develop
附上完整版给伸手党朋友:
写成两个Shell步骤即可:
PRODUCT_SETTINGS_PATH=/Users/xxxx/.jenkins/workspace/xxxxxxx/xxxxx/Info.plist
BundleVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$PRODUCT_SETTINGS_PATH")
array=(${BundleVersion//./ })
lastNumber=${array[${#array[*]}-1]}
newLastNumber=`expr $lastNumber + 1`
newLastNumberString=${newLastNumber}
NewBundleVersion=${array[0]}
point=.
for ((i = 1; i < ${#array[@]}-1 ; i++ ))
do
NewBundleVersion=${NewBundleVersion}${point}${array[$i]}
done
NewBundleVersion=${NewBundleVersion}${point}${newLastNumberString}
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $NewBundleVersion" "$PRODUCT_SETTINGS_PATH"
PRODUCT_SETTINGS_PATH=/Users/xxxxx/.jenkins/workspace/xxxxx/xxxxx/Info.plist
BundleVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$PRODUCT_SETTINGS_PATH")
CommitMessage="自动提测testflight,build:"${BundleVersion}
cd /Users/xxxx/.jenkins/workspace/xxxxxxxx
git add -u /Users/xxxx/.jenkins/workspace/xxxxxxxxxx/xxxxxxxx/Info.plist
git commit -m ${CommitMessage}
git push origin HEAD:develop
二、开始打Release包,并导出IPA文件
这点在之前的Jenkins文章中写过了,主要是利用xcbuild命令去做的,这里要注意的就是打包的类型要又debug改为release即可。
xcodebuild -archivePath "/Users/xxxx/.jenkins/workspace/xxxxxxxxx/build/Release-iphoneos/xxxxxx.xcarchive" -workspace 项目.xcworkspace -sdk iphoneos -scheme "你想打包的scheme" -configuration "Release" archive
xcodebuild -exportArchive -archivePath "/Users/xxxx/.jenkins/workspace/xxxxxxxxxxx/build/Release-iphoneos/xxxxxxx.xcarchive" -exportPath "/Users/xxxx/.jenkins/workspace/xxxxxxxxx/build/输出地址" -exportOptionsPlist '/Users/xxxx/.jenkins/workspace/xxxxxxxxxx/build/ExportOptions.plist' -allowProvisioningUpdates
三、利用Application Loader插件实现自动上传
// 取到Application Loader中上传插件altool的地址
ALTOOLPATH=/Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool
// 你的Apple ID和密码,这里密码不是登录密码,自己去生成一个使用密码
APPID="xxxxxxx@xxxx.com"
APPPASSWORD="xxxx-xxxx-xxxx-xxxx"
// IPA文件的路径,就是前面导出IPA包时候填的地址
IPA_PATH="/Users/xxxx/.jenkins/workspace/xxxxxxxx/build/xxxxxxxxxx/xxxxxx.ipa"
#验证信息
"${ALTOOLPATH}" --validate-app -f "${IPA_PATH}" -u "${APPID}" -p "${APPPASSWORD}" --output-format xml
#上传iTunesConnect
"${ALTOOLPATH}" --upload-app -f "${IPA_PATH}" -u "${APPID}" -p "${APPPASSWORD}" --output-format xml
至此,三大步骤走完了,开始让热心的测试们自己点点点去吧,不要再跟他们纠结于打包事情上面了,算是节约了自己的时间吧。