るいすのブログ

オタクエンジニアの雑記

CircleCI で GitHub のラベルを見て自動でタグをプッシュする


流れ

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つしか上げられない

気が向いたら直す。

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