Jenkins打包iOS自动修改build号
2019-04-15 本文已影响0人
jayhe
- 有时候打AppStore的ipa,发现之前上传的ipa有问题之后又要重新打包,就需要修改build号,否则替换Itunes Connet上的包就报错;手动修改难免会忘记
- 使用脚本去修改Info.plist的build号,来避免遗忘修改
设计思路
- Jenkins打包目录下,记录上次打包的build信息(包括版本号、build号)
- 打包前读取上次打包配置,同项目的Info.plist比较,版本号一致的情况:就将上次打包的build号+1,版本不一致的情况:取Info.plist的build号+1
- 将Info.plist中的build号修改,并将本次修改的配置写入本地的打包配置中
-
由于之前设计的是用一个build.json来存放打包的信息,打包之后将新的build号和version信息写回去,后来发现当多个版本交叉打包的时候,出现build修改异常的问题
- 解决这个问题就是将每个版本的build号都记录下来,或者build号一直累加;这里选择前者,如何存储每个版本的build号,可以一个文件按照版本号为key将信息存起来或者一个版本一个文件存信息,我选择了后者,主要是一个json文件存多个版本信息,取得时候还好说,写的时候要修改某个版本的值,还不会~
- 实现思路就是:创建一个文件夹用来存放版本信息文件,打包前先读文件中有没有版本号对应的json文件,有的话,取出buildNumber+1,没有的话就用plist中的配置加1,最后将打包的配置写到对应版本号的json中
脚本
#!/bin/bash -il
export LC_ALL=en_US.UTF-8
source ~/.bashrc
# 存储所有版本号的打包版本信息文件夹【一个版本对应一个json避免一个json导致打了不同的版本的包覆盖的情况】,这个文件夹由外部传入,一般放到Jenkins的主目录
BuildNumberPath=$1
if [[ ! -d $BuildNumberPath ]]; then
mkdir $BuildNumberPath
chmod 777 $BuildNumberPath
echo ${BuildNumberPath}
else
echo ${BuildNumberPath}
fi
# 版本号自增
PlistDir="YourProjectInfoPlistPath"
BuildVersion=$(/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" "${PlistDir}")
BuildJsonPath=${BuildNumberPath}/${BuildVersion}.json
echo ${BuildJsonPath}
if [[ -f $BuildJsonPath ]]; then
# 读取Json中上次打包的build信息
echo "读取Json中上次打包的build信息"
PreBuildVersion=`cat ${BuildJsonPath} | jq -r ".BuildVersion"`
PreBuildNumber=`cat ${BuildJsonPath} | jq -r ".BuildNumber"`
echo "PreBuildVersion:${PreBuildVersion}"
echo "PreBuildNumber:${PreBuildNumber}"
echo "Plist中BuildVersion:${BuildVersion}"
else
# 使用项目Info.plist的信息
echo "使用项目Info.plist的信息"
BuildNumber=$(/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "${PlistDir}")
echo "Plist中BuildNumber:${BuildNumber}"
fi
if [ "${PreBuildVersion}" == "${BuildVersion}" ]; then
echo "版本号未改变"
BuildNumber=`expr ${PreBuildNumber} + 1`
else
echo "版本号改变"
BuildNumber=$(/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "${PlistDir}")
echo "BuildNumber:${BuildNumber}"
BuildNumber=`expr ${BuildNumber} + 1`
fi
echo "自增之后BuildNumber:${BuildNumber}"
if [[ "${BuildNumber}" != "" ]]; then
# 修改Info.plist的build号
echo "修改Info.plist的build号"
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion ${BuildNumber}" "${PlistDir}"
# 写本次打包信息到build.json
echo "{\"BuildNumber\":\"${BuildNumber}\", \"BuildVersion\":\"${BuildVersion}\"}" > ${BuildJsonPath}
fi
PlistDir
是项目的Info.plist的路径,这里需要修改为你的项目中的路径
BuildJsonPath
是本地用于存储打包的版本和build号信息的文件路径 eg:xx/xx/build.json
执行脚本
cd ./shellDir && ./modify_build_number.sh 'BuildJsonPath'
shellDir
表示脚本的路径
BuildJsonPath
表示上次打包配置的本地缓存文件,一般存放到Jenkins的打包主目录就好