前提
現在携わっているサービスでGitLab CI/CDを利用してリリース番号がついているtagをpushすると
自動でデプロイされるように設定しています
...
...
...
only:
- /^release-.*$/
リリースのたびにtagのsemantic versionをインクリメントするのがめんどくさいので
自動化できないか考えてみました
# masterブランチで差分を取り込む
$ git checkout master
$ git pull
# インクリメントするために最新のタグを取得
$ git describe --abbrev=0 --tags
> release-1.1.1
# 新しいタグを追加
$ git tag release-1.1.2
# タグをリモートにプッシュ
$ git push --tags
# この一連の作業を自動化したい
巨人の肩に乗る
調べるとパッチバージョンのみインクリメントできるシェルスクリプトを書いてくれる人がいたので
シェルスクリプト初心者ですが少し改良してみました
作成したシェルスクリプト
#!/bin/bash
#checkout master and pull
git checkout master
git pull
#get highest tag number
VERSION=`git describe --abbrev=0 --tags`
#replace . with space so can split into an array
VERSION_BITS=(${VERSION//./ })
#get number parts and increase
VNUM1=`echo ${VERSION_BITS[0]} | sed -e 's/[^0-9]//g'`
VNUM2=${VERSION_BITS[1]}
VNUM3=${VERSION_BITS[2]}
if [ ${VNUM3} -ge 9 ]; then
if [ ${VNUM2} -ge 9 ]; then
VNUM1=$((VNUM1+1))
VNUM2=0
VNUM3=0
else
VNUM2=$((VNUM2+1))
VNUM3=0
fi
else
VNUM3=$((VNUM3+1))
fi
#create new tag
SEMVER="$VNUM1.$VNUM2.$VNUM3"
TAG_PREFIX="release-"
NEW_TAG="$TAG_PREFIX$SEMVER"
read -p "Do you really updating $VERSION to $NEW_TAG (y/n)" YN_LOADSETTING
if [ "${YN_LOADSETTING}" != "y" ]; then
echo "bye"
exit 1
fi
#get current hash and see if it already has a tag
GIT_COMMIT=`git rev-parse HEAD`
NEEDS_TAG=`git describe --contains $GIT_COMMIT 2>/dev/null`
#only tag if no tag already
if [ -z "$NEEDS_TAG" ]; then
git tag $NEW_TAG
echo "Tagged with $NEW_TAG"
git push --tags
else
echo "Already a tag on this commit"
fi
改良してみた点
-
readコマンドで確認
万が一うまくインクリメントできていなかったりリリースの必要がなかった場合など一回確認しておきたいためread
を追加しました -
パッチバージョンのインクリメント以外も対応
パッチバージョンが9
かどうかで上位のバージョンもインクリメントするか分岐させました
終わりに
シェルスクリプトを初めてちゃんと書いてみましたがとても勉強になりました
そもそもリリースの内容によってパッチを上げるかマイナーを上げるかなど考慮する必要がありますが
そこができていないのでいずれ引数を持たせてあげるバージョンを選べるようにしてみたいです
こっちの方がイケてるとかあればぜひご教示ください
ご読了ありがとうございました