7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Linkbal(リンクバル)Advent Calendar 2021

Day 14

git tagのsemantic versionを自動でインクリメントしてpushするシェルスクリプト

Posted at

前提

現在携わっているサービスでGitLab CI/CDを利用してリリース番号がついているtagをpushすると
自動でデプロイされるように設定しています

.gitlab-ci-production.yml
...
...
...
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

# この一連の作業を自動化したい

巨人の肩に乗る

調べるとパッチバージョンのみインクリメントできるシェルスクリプトを書いてくれる人がいたので
シェルスクリプト初心者ですが少し改良してみました

作成したシェルスクリプト

deploy.sh
#!/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コマンドで確認
    image.png
    万が一うまくインクリメントできていなかったりリリースの必要がなかった場合など一回確認しておきたいためreadを追加しました

  • パッチバージョンのインクリメント以外も対応
    パッチバージョンが9かどうかで上位のバージョンもインクリメントするか分岐させました

終わりに

シェルスクリプトを初めてちゃんと書いてみましたがとても勉強になりました
そもそもリリースの内容によってパッチを上げるかマイナーを上げるかなど考慮する必要がありますが
そこができていないのでいずれ引数を持たせてあげるバージョンを選べるようにしてみたいです

こっちの方がイケてるとかあればぜひご教示ください
ご読了ありがとうございました

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?