流れ

1. PR を作る、ラベルで major, minor, patch のいずれをつける
2. master へマージする。
3. CircleCI がラベルを見て新しいタグをプッシュする

CircleCI

GHE 環境なのでところどころ読み直してください。
雰囲気で伝わってほしい。

push_tag:
<<: *build
steps:
- checkout
- add_ssh_keys
- run:
name: push new version tag
command: |
PR_NUMBER=$( git log ${CIRCLE_SHA1} --oneline -1 | awk '{print $5}' | sed -s 's/#//' )
label=$( curl -s -u u:p https://hoge/pulls/${PR_NUMBER} | jq -r '.labels[0].name' )
latest_version=$( curl -s -u u:p https://hoge/tags | jq -r '.[0].name' )
new_version=$( bash .circleci/push_tag.sh "${label}" "${latest_version}" )
git tag ${new_version}
git push --tags

push_tag.sh

新しいタグ(バージョン)を作って、GHE にプッシュする

#!/usr/bin/env bash
set -eu
readonly semantic_version="${1}"
readonly latest_version="${2}"
# v2.15.1 -> 2.15.1
version=$( echo "${latest_version}" | sed -e 's/v//g' )
# 2.15.1 -> [ 2, 15, 1 ]
version_split=( ${version//./ } )
new_major_version="${version_split[0]}"
new_minor_version="${version_split[1]}"
new_patch_version="${version_split[2]}"
case "${semantic_version}" in
"major" ) new_major_version=$(( new_major_version + 1 )) ;;
"minor" ) new_minor_version=$(( new_minor_version + 1 )) ;;
"patch" ) new_patch_version=$(( new_patch_version + 1 )) ;;
* ) echo "please add a label 'major', 'minor', 'patch'"
exit 1 ;;
esac
new_version=$( echo "v${new_major_version}.${new_minor_version}.${new_patch_version}" )
echo "${new_version}"
luis@ubuntu ~selected/.circleci (fix/datadog●●)$ bash push_tag.sh patch v2.15.1
v2.15.2
luis@ubuntu ~selected/.circleci (fix/datadog●●)$ bash push_tag.sh minor v2.15.1
v2.16.1
luis@ubuntu ~selected/.circleci (fix/datadog●●)$ bash push_tag.sh major v2.15.1
v3.15.1

問題点

  • 複数のラベルがあって、最初に major, minor, patch がないとエラーになる。
  • patch を2つ上げたいけど、1つしか上げられない

気が向いたら直す。

これでタグのプッシュのし忘れとか無くなって(・∀・)イイネ!!