Jenkins打包后续:做一个版本tag,不断更新
最近收到一个需求,就是使用TestFlight打包之后,打一个remote 的tag,对于这个tag有个要求,就是代表着version号,并且如果打了多次包,需要覆盖掉之前同版本的TestFlight记录的tag。
举例:比如这次打的version是1.1.2,build是1.1.2.1,打了一个tag,为version_1.1.2;过了几天,又提交了N条,现在再打TestFlight,version还是1.1.2,但是build是1.1.2.2,这个时候的tag应该还是version_1.1.2,等于说跟着实际的version号走,那么就得覆盖掉前面那个tag。
前提
Git打tag的时候不允许重复名字的tag提交。
思路
如果是重复的命名tag,那么在你本地有tag:version_1.1.2,在提交A上,此时想在B上再打一个同样名字的tag,那必须要先删除本地A上面的tag,而你利用Jenkins打包,并不能知道其他project是否本地已经存在相同命名的tag,就会报错! [rejected] version_1.1.2 -> version_1.1.2 (would clobber existing tag)
,这里也没有找到说能在Jenkins fetch代码前去操作的插件,那么我们只能用时间戳来加以区分。
1、打的tag格式为:version_1.1.2_时间戳
2、每次打新的tag前去把已有的带version_1.1.2
前缀的tag都清除掉
实践
直接上shell代码,改好路径后可以直接copy使用。
#获取version号
BundleVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" /Users/xxx用户xxx/.jenkins/workspace/xxx项目名xxx/xxxtargetxxx/Info.plist)
echo $BundleVersion
Version="version_"${BundleVersion}
echo $Version
#CD到对应项目目录下
cd /Users/xxx用户xxx/.jenkins/workspace/xxx项目名xxx
#批量删除本地和远端带有指定version前缀的tag(即我前面举例的:“version_1.1.2”)
#(这里有大坑,后面备注)
git show-ref --tag | grep $Version| awk '{print $2}'|xargs git push origin --delete
git tag | grep $Version |xargs git tag -d
#获取当前时间戳
cur_sec_and_ns=`date '+%s-%N'`
cur_sec=${cur_sec_and_ns%-*}
cur_ns=${cur_sec_and_ns##*-}
cur_timestamp=$((cur_sec*1000+cur_ns/1000000))
echo 当前时间戳=$cur_timestamp
#组合为新的tag(例如:version_1.1.2_1557392177000)
NewVersionTag=$Version"_"$cur_timestamp
#打本地tag,并同步到远端
git tag $NewVersionTag
git push origin $NewVersionTag
注意!注意!注意!
这里有一个大坑,在上面的命令中,删除tag的操作,我之前写的是先删除了本地tag,再删除了远端tag,这是不行的。
必须先执行删除远程tag,再去删除本地的才行。
发现问题过程
发现删除远端命令无用后,一直在找问题所在。
1、起初以为是命令的问题,于是把命令单独拿出来去终端中测试,是可行的。
2、然后猜测可能会不会是终端和Jenkins的执行有区别导致的,于是单独在Jenkins中执行这一句,发现也没问题,那说明是这段组合shell的问题,为了印证,把整段命令copy到一个.sh中,本地执行,发现也出现命令无效的情况。
3、那就说明是整段命令组合的问题,一一注释排除,最后发现是执行顺序的问题,必须得先执行删除远端tag,再执行删除本地tag才可行。