🏷️

デプロイ時のタグ付けを自動化したい!

2023/11/05に公開

こんにちは!
@Ryo54388667です。

今回は、デプロイ時に行うタグ付けを自動で行う設定をしたので紹介します〜

📍はじめに

アプリケーションのデプロイを行った時、同時にバージョン管理の目的として、タグ付けを行うことがあると思います。もちろん、プロジェクトの慣習にも依存するところではありますが、多くのプロジェクトでは、特定のルールに基づいてタグ名やリリースノートを設定することが多いのではないのでしょうか?
いわゆる定型作業かと思います。

手入力の場合、作業の箇所が少ない時でも、ヒューマンエラーの可能性をゼロにすることはできません。なので、手入力を避ける意味でも自動化するのが良いかと思います。個人的には「めんどくさい」これを解消したいことが一番のモチベーションですが。。😅

ということで、この定型作業をmain ブランチにマージすること(デプロイ)を契機として、タグを自動的につけてみました。


📍使用した技術


📍タグ付けの仕様

  • mainブランチへのマージをトリガーとすること。
  • タグおよびタグ名は「v1.x.x.x」の形式。(ex: v1.0.0.3)
  • タグはデプロイのたびに右端の数をインクリメントし、必要に応じて数の繰り上がりを行うこと。特に、major, minor のアップデートは関係ない。
  • リリースノートに公開日時を記述すること。


📍コードの詳細について

ymlファイルの全コード
name: Automatic Tagging

on:
  push:
    branches:
      - main

jobs:
  release:
    name: release
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: 現在の最新タグを取得し、値を設定
        id: cur_tag_var
        run: |
          git fetch --prune --unshallow
          echo "$(git tag --sort=creatordate | tail -n 1)" > CUR_TAG
          # name=cur_tag::$CUR_TAG では値を設定できない。
          echo ::set-output name=cur_tag::$(cat CUR_TAG)

      - name: リリースタグを設定
        id: set_release_tag
        run: |
          # タグが存在しない場合、初期リリースとしてv1.0.0.0をセット
          if [[ "${{ steps.cur_tag_var.outputs.cur_tag }}" == '' ]]; then
            NEW_TAG="v1.0.0.0"
            echo "Initial release: $NEW_TAG"
            echo ::set-output name=new_tag::$NEW_TAG
            exit 0
          fi

          NEW_TAG="${{ steps.cur_tag_var.outputs.cur_tag }}"
          # タグからバージョン部分を取得して分割
          IFS='.' read -ra VERSION <<< "${NEW_TAG#v}"

          # バージョンを数値として取得
          MAJOR="${VERSION[0]}"
          MINOR="${VERSION[1]}"
          PATCH1="${VERSION[2]}"
          PATCH2="${VERSION[3]}"

          # パッチバージョンをインクリメント
          PATCH2=$((PATCH2 + 1))
          # 繰り上がりの処理
          if (( PATCH2 > 9 )); then
            PATCH2=0
            PATCH1=$((PATCH1 + 1))
            if (( PATCH1 > 9 )); then
              PATCH1=0
              MINOR=$((MINOR + 1))
              if (( MINOR > 9 )); then
                MINOR=0
                MAJOR=$((MAJOR + 1))
              fi
            fi
          fi

          # 新しいタグのセット
          NEW_TAG="v$MAJOR.$MINOR.$PATCH1.$PATCH2"
          echo "New tag: $NEW_TAG"
          echo ::set-output name=new_tag::$NEW_TAG

      - name: リリースノートのコンテンツの作成
        id: set_body
        run: |
          CURRENT_DATE=$(TZ="Asia/Tokyo" date +"%Y年%m月%d日")
          BODY="${CURRENT_DATE}公開"
          echo ::set-output name=body::$BODY

      - name: リリースノートを含めたタグの設定
        uses: ncipollo/release-action@v1
        with:
          tag: ${{ steps.set_release_tag.outputs.new_tag }}
          name: ${{ steps.set_release_tag.outputs.new_tag }}
          body: ${{ steps.set_body.outputs.body }}

mainブランチへのマージをトリガーとする

on:
  push:
    branches:
      - main

新しいタグ名の作成

 # タグが存在しない場合、初期リリースとしてv1.0.0.0をセット
if [[ "${{ steps.cur_tag_var.outputs.cur_tag }}" == '' ]]; then
  NEW_TAG="v1.0.0.0"
  echo "Initial release: $NEW_TAG"
  echo ::set-output name=new_tag::$NEW_TAG
  exit 0
fi

新規リリースの場合はタグが存在しないので、専用の分岐処理が必要です。
steps.cur_tag_var.outputs.cur_tag の箇所で、先ほどのstep でセットした値を取得できます。
これを利用して分岐を行います。今回の場合、新規リリースの場合、タグを「v1.0.0.0」としました。

繰り上がり処理について

	  NEW_TAG="${{ steps.cur_tag_var.outputs.cur_tag }}"
          # タグからバージョン部分を取得して分割
          IFS='.' read -ra VERSION <<< "${NEW_TAG#v}"

          # バージョンを数値として取得
          MAJOR="${VERSION[0]}"
          MINOR="${VERSION[1]}"
          PATCH1="${VERSION[2]}"
          PATCH2="${VERSION[3]}"

          # パッチバージョンをインクリメント
          PATCH2=$((PATCH2 + 1))
          # 繰り上がりの処理
          if (( PATCH2 > 9 )); then
            PATCH2=0
            PATCH1=$((PATCH1 + 1))
            if (( PATCH1 > 9 )); then
              PATCH1=0
              MINOR=$((MINOR + 1))
              if (( MINOR > 9 )); then
                MINOR=0
                MAJOR=$((MAJOR + 1))
              fi
            fi
          fi

          # 新しいタグのセット
          NEW_TAG="v$MAJOR.$MINOR.$PATCH1.$PATCH2"
          echo "New tag: $NEW_TAG"
          echo ::set-output name=new_tag::$NEW_TAG

行っていることはシンプルです!
以前のタグ名から「v」を除き、「.」を元に分割してから、数と同様の繰り上がり処理を行っています。

リリースノートのコンテンツを作成する

      - name: リリースノートのコンテンツの作成
        id: set_body
        run: |
          CURRENT_DATE=$(TZ="Asia/Tokyo" date +"%Y年%m月%d日")
          BODY="${CURRENT_DATE}公開"
          echo ::set-output name=body::$BODY

今回の場合は公開日をリリースノートに記述するため、このような設定にしています。
リリースノートに他の情報を記述する時はこの箇所を適宜変更してみてください☺️

タグを設定する

      - name: リリースノートを含めたタグの設定
        uses: ncipollo/release-action@v1
        with:
          tag: ${{ steps.set_release_tag.outputs.new_tag }}
          name: ${{ steps.set_release_tag.outputs.new_tag }}
          body: ${{ steps.set_body.outputs.body }}

最後に、それぞれセットしたものを利用してタグに設定して完了です。body部分のコンテンツがリリースノートのコンテンツに対応しています。

繰り上がりとリリースノートの検証

うまくいってそうです!🎉


参考資料
大変、参考になりました!ありがとうございました!
https://qiita.com/itouoti/items/85f2cf796d1fb3217ca7


最後まで読んでいただきありがとうございます!
気ままにつぶやいているので、気軽にフォローをお願いします!🥺
https://twitter.com/Ryo54388667

Discussion