見出し画像

GitHub ActionsでGitのタグ付けを自動化する

リリースした時とか、特定の条件に従ってGitのタグを付けておきたい場合があると思う。ただ毎回リリースのたびに手動でタグを付けてたりすると忘れてしまったり、面倒くさかったりとできれば手作業でやりたくない。

そこで今回はGitHub Actionsを使ってGitのタグ付け作業を自動化してみる。

特定のブランチがマージされたらタグを付ける

どの様にタグを管理すべきかみたいな所は諸説あると思うが、ここでは release/ で始まるブランチのPullRequestが main ブランチにマージされたら、マージ元のブランチ名に従ってタグを付けることとしてみる。

・release/v1.2.3 から main に対してPRを出す
・PRをマージする
・release/v1.2.3 に対して v1.2.3 というタグを付けて反映​

WorkFlowの起動条件

まず、PRがマージされたタイミングなので on: pull_request を指定してみる。これだけだとPRが出されたタイミングで起動してしまうので、PRがマージされたタイミングのみ処理を実行したい。

↑を見てみると、on: pull_request の細かい状態を types で指定できるらしい。今回はPRがマージされた時なので closed にすれば良いらしい。

on:
 pull_request:
   branches:
     - main
   types:
     - closed

Jobの起動条件

次に、PRが閉じた時&&マージされた時の条件を作る。色々と調べた結果、${{ github.event.pull_request.merged }} でマージされたかどうかのフラグが取れるとのことなので、これを元に if 条件を指定すればOK。

また、release/ で始めるブランチ名のみ対象としたい。これも色々と調べた結果 ${{ github.event.pull_request.head.ref }} でマージ元のブランチ名が取得出来るとのことなので、プレフィックスの判定処理を if 条件に追加すればOK。

jobs:
 main:
   runs-on: ubuntu-latest
   if: github.event.pull_request.merged == true && startsWith(github.event.pull_request.head.ref, 'release/')

${{ github.event.pull_request }} の中身はドキュメントにまとまっているので、どういったパラメータがあるかは↓を確認すればOK。

タグ付け処理

あとは、簡単。マージ元のブランチ名は取得できているので、fetch して checkout して tag して push すればOK。タグ名は release/ のプレフィックスを取り除いた値なのでそこだけ置換しておく。

多少冗長ではあるので、気になる時は set-output とかでタグ名を変数に突っ込むとスッキリするかもしれない。

jobs:
 main:
   runs-on: ubuntu-latest
   if: github.event.pull_request.merged == true && startsWith(github.event.pull_request.head.ref, 'release/')
   steps:
     - uses: actions/checkout@v2
     - run: git fetch origin ${{ github.event.pull_request.head.ref }}
     - run: git checkout ${{ github.event.pull_request.head.ref }}
     - run: git tag `echo '${{ github.event.pull_request.head.ref }}' | sed 's/release\///'`
     - run: git push origin `echo '${{ github.event.pull_request.head.ref }}' | sed 's/release\///'`

WorkFlow全体

全体をまとめるとこんな感じ。これで面倒くさい作業を自動化することができた。

name: Git Tag
on:
 pull_request:
   branches:
     - main
   types:
     - closed
jobs:
 main:
   runs-on: ubuntu-latest
   if: github.event.pull_request.merged == true && startsWith(github.event.pull_request.head.ref, 'release/')
   steps:
     - uses: actions/checkout@v2
     - run: git fetch origin ${{ github.event.pull_request.head.ref }}
     - run: git checkout ${{ github.event.pull_request.head.ref }}
     - run: git tag `echo '${{ github.event.pull_request.head.ref }}' | sed 's/release\///'`
     - run: git push origin `echo '${{ github.event.pull_request.head.ref }}' | sed 's/release\///'`

最後に

EventTypeだけ見るとWorkFlowの起動条件を細かく制御できないように思ってしまうが。types や if を組み合わせることで実はもの凄く細かい制御が可能な気がする。


この記事が気に入ったらサポートをしてみませんか?