📘

JIRAとGitLabを連携して、マージリクエストがマージされた際自動でステータス移動をできるようにする

2023/09/17に公開

GitLab でマージリクエストをマージした時にステータス移動を行う。

はじめに

あくる日の業務中。
上司:「あれ?この Jira のイシューまだレビュー中です?マージされてませんでしたっけ?」
私:「あー!すみません…。ステータス移動し忘れています…。」
上司:「了解です。移動しておきますね」
私:「ありがとうございます。すみません…。」
また別の日
同僚:「マージされているので、担当されていたイシューのステータス移動しておきました。」
私:「すみません…。ありがとうございます。」
このように、私は Jira のステータスをちょくちょく移動し忘れて、他の方に迷惑をかけていました。
さらに、現在イシューに対してのリードタイムを計測することになっており、ステータス移動忘れがますます致命的となっています。
このままではマズいと思い、Jira と Gitlab を連携し、マージリクエストがマージされたときに指定のステータスへ移動するようにしました。
今回はその方法の共有です。
とても簡単なので、同じような悩みを抱えている方がいらっしゃれば是非試してみてください。
なお、今回は Jira Cloud で行っております。

Jira 側の準備

Jira 側で必要な情報は以下の 3 つです。

  • Jira の API トークン
  • Jira の対象ステータスの Transition ID
  • Jira の URL
    一つづつ取得方法を見ていきます。

Jira の API トークン

こちらの API トークンを取得するページにアクセスして、「API トークンを作成する」ボタンをクリックします。
Untitled
すると以下のようにトークンの名前を聞かれるので、任意の文字列を入力して、「作成」ボタンをクリックします。
Untitled
するとトークンが表示されるので、「コピーする」ボタンをクリックします。
なお、このトークンは一度モーダルを閉じると再度取得はできないので、メモ帳などに記録しておいてください。

対象イシューの Transition ID 取得

マージリクエストをマージした時に、指定のステータスへ移動するためにはステータスの ID が必要となります。
その取得方法は「https://Jira のプロジェクト名.atlassian.net/rest/api/2/issue/イシューの識別子/transitions」にアクセスすることです。
上記 URL にアクセスすると、以下のような JSON が表示されるので、移動させたいステータスの id を確認して、API トークンの時と同様にメモ帳へ記録しておいてください。
ちなみに、今回は見やすいように整形した JSON を記載していますが、実際はフォーマットされていない JSON が返ってくるので頑張って探してください。

{
	"expand": "transitions",
	"transitions": [
		{
			"id": "11",
			"name": "バックログ",
			"to": {
				...略
				}
			},
			...略
		},
		{
			"id": "21",
			"name": "Selected for Development",
			"to": {
				...略
				}
			},
			...略
		},
		{
			"id": "31",
			"name": "進行中",
			"to": {
				...略
				}
			},
			...略
		},
		{
			"id": "41",
			"name": "完了",
			"to": {
				...略
				}
			},
			...略
		},
		{
			"id": "51",
			"name": "レビュー中",
			"to": {
				...略
				}
			},
			...略
		}
	]
}

なお、イシューの識別子は Jira のイシューを開いたときに表示される下記画像の赤枠部分のことです。
2023-09-17_10h53_48.png

Jira の URL

これはhttps://Jira のプロジェクト名.atlassian.netです。

GitLab 側の準備

連携したい GitLab プロジェクトの Settings 内にある、Integrations に行きます。
2023-09-17_11h08_30.png
すると、様々な外部機能の一覧が表示されているので、その中にある Jira をクリックします。
2023-09-17_11h10_05.png
クリックすると入力フォームが表示されるので、以下のように入力します。

  • Enable integration
    これにチェックを入れないと実際に連携されないので、必ずチェックを入れてください。
  • Web URL,Jira API URL
    連携する URL を指定します。
    Jira の設定の際に取得した「https://Jira のプロジェクト名.atlassian.net」を入力してください。
    ちなみに、Jira API URL は Web URL と同じであれば空白でも問題ありません。
  • Authentication method
    https://Jira のプロジェクト名.atlassian.net」にアクセスできるユーザーを指定します。
    なお、最初に以下のようなラジオボタンが表示されていますが、今回使用しているのは Jira Cloud なので、Basic を選択します。
    2023-09-17_11h16_39.png
    「Email or username」は上記 URL にアクセスできる任意のユーザーのメールアドレスかユーザー名を入力してください。
    「API token or password」は Jira で取得した API トークンを入力してください。
    ユーザーのパスワードでも一応連携は成功しますが、マージリクエストをマージした時にステータス移動が行われないので、必ず API トークンを入力します。
  • Trigger
    Trigger は画像のように GitLab のコミットやマージリクエストの時に実行するイベントを設定します。
    2023-09-17_11h22_15.png
    まずは「Commit」と「Merge request」のチェックボックスですが、こちらは GitLab へコミットが行われたりマージリクエストが作成・マージされたりした時にイベントを実行するかを選択するためのものです。
    今回はマージリクエストのみイベントを実行させたいので、「Commit」のチェックは外します。
    次に、Comment settings ですが、こちらは Jira のコメントにマージリクエストやコミットイベントを記録する設定となっています。
    Comment detail の Standard は Jira のイシューにコミットのタイトルと対象のブランチ名が表示されます。
    Comment detail の All details は上記に加えて、コミットメッセージなどの詳細が表示されます。
    なお、今回はマージリクエストをマージした時にステータス移動をさせたいだけなので、この Comment settings の下にある「Enable comments」のチェックは外し、Jira にコメントが記載されないようにします。
    「Transition Jira issues to their final state」は Jira イシューの移動先を設定します。
    「Move to Done」は Jira がデフォルトで作成する「完了」ステータスへ移動させます。
    「Use custom transitions」はステータスの Transition ID を指定することで、対象ステータスへの移動するように設定できます。
    今回は「Use custom transitions」を使用します。
    なので、「Use custom transitions」を選択し、先程「https://Jira のプロジェクト名.atlassian.net/rest/api/2/issue/イシューの識別子/transitions」で取得した移動させたいステータスの ID を入力します。
    最後に「Jira issue matching」を設定します。
    これは GitLab が紐づける Jira イシューを見つけるための設定です。
    2023-09-17_11h56_13.png
    「Jira issue regex」は画像のように設定して、マージリクエストやコミットメッセージに「ダッシュボード ID-イシュー番号」を含めれば自動的に紐づけを行ってくれます。
    紐づけせずにコメントをしたい場合が存在するときは、「Jira issue prefix」を設定します。
    例えば JIRA# というプレフィックスを設定した場合、「JIRA#ダッシュボード ID-イシュー番号」とした時のみ GitLab と Jira の連携が行われます。
  • Issues
    こちらは GitLab のプレミアムプラン以上のときに使用できます。
    Jira のイシューを GitLab 上で表示したり、ソートしたりできるようになります。
    今回は使用しません。
    以上設定が完了したら、「Save changes」ボタンをクリックします。
    ここまでで、連携が完了したので実際に動かしてみます。

Jira と連携したマージリクエストを作成する

ここからは実際に動作確認をします。
なお、今回連携する Jira イシューは下記画像のものとなります。
Untitled
また、一致するイシューを見つける方法は「Jira issue regex」を使用しており、「MFMZ-[0-9]*」を記載しています。
では始めます。
まず、Jira と連携した GitLab プロジェクトでマージリクエストを作成します。
次に、マージリクエスト内のコメントに以下のいずれかを記載します。

  • Resolves MFMZ-6
  • Closes MFMZ-6
  • Fixes MFMZ-6
    動作はどれでも一緒なので、好きなものを入力してください。
    そして、マージリクエストを作成したら MFMZ-6 にリンクが設定されているので、リンクから Jira のイシューへ飛んでください。
    すると以下のような Web リンクが設定されていれば、連携は完了です。
    それでは、最後にマージリクエストをマージしてみて「Use custom transitions」で設定したステータスへ移動すること確認すれば完了です。

現状の課題

ここまでで、Jira と GitLab の連携を行い、ステータスの移動ができるようにしました。
設定自体は簡単ですぐに取り入れることができるのですが、以下の課題がまだ残っています。

  • イシューごとにマージされた際に移動するステータスを分けることができない。
  • ブランチが作成されたときに、対象のイシューが進行中ステータスへ移動しない。
    ただ、ドキュメントを確認する限り上記課題は今回紹介した方法では無理そうです。
    GitLab for Jira Cloudという Jira の拡張機能を導入すればできるらしく、実際に導入しましたが GitLab との連携が上手くできず断念しました。
    なぜか対象の GitLab リンクが見つからず、解消方法も不明だったので、ご存知の方がいらっしゃれば是非ともコメントください。
    以上のようにまだ完璧には程遠いですが、とりあえずマージされた時のステータス移動忘れは大分少なくなりそうです。

おわりに

今回は Jira と GitLab の連携を行いました。
設定自体は分かれば単純なものでしたが、分かるまでは情報が少なく連携がとても大変でした。
後、Jira のドキュメントも GitLab のドキュメントも文字しか書いてないのも辛かったです。
とはいえ、一旦連携はできたので良かったかなと思います。
今後は空いてる時間があれば、適宜調査してよりステータス移動を自動化していければと思います。
ここまで読んでいただきありがとうございました。

参考資料

GitLab 提供の Jira 連携方法と使い方
GitLab で行う Jira 連携の設定の説明
GitLab と Jira の連携についての Qiita 記事(この記事のおかげで今回連携できた超貴重な記事)

Discussion