Gitのメッセージフックでブランチに対応するJIRAのチケットタイトルを自動入力する


必要なもの

プロジェクトにインストール

  • husky - devDependencies にインストールしましょう。

最初にやること

当たり前ですが、JIRAにログインしておきます。

$ jira login

フックファイルを作成

プロジェクトの任意の場所に prepare-commig-msg を作成します。場所やファイル名は何でもいいですが、実行時の作業ディレクトリは package.json があるディレクトリになります。

(git root)
 └── app
     └── package.json

今回はこのように、レポジトリのルートディレクトリが package.json でなく、ブランチ名が category/ticket-(チケット番号) のように命名されていると仮定します。

prepare-commit-msg
#!/bin/sh

# husky の作業ディレクトリに注意してください。
# COMMIT_EDITMSG はレポジトリのルートディレクトリが作業ディレクトリである場合を想定しているので、今回は少しいじります。
COMMIT_EDITMSG="../${1}"
TYPE="$2"

[ -n "$TYPE" ] && exit

# .git ディレクトリが作業ディレクトリに存在しないのでオプションで指定します。
ticket_ref="$(git --git-dir=../.git symbolic-ref HEAD | grep -Poe '(?<=/)ticket-\d+$')"
[ -z "$ticket_ref" ] && exit

ticket_summary=''
# jira が PATH に含まれている場合
if command -v jira 1>/dev/null
then
  # go-jira の標準出力からサマリーを抜き出しています。JQLなどでもっと賢くできるかもしれない。
  ticket_summary="$(jira view "$ticket_ref" 2>/dev/null | grep -Poe '(?<=summary: ).*$')"
fi

sed -i "1i${ticket_ref} ${ticket_summary}\n" "$COMMIT_EDITMSG"

フックの設定

package.json にスクリプトを追加します。フックファイルへのパスは適宜読み替えてください。

{
  "scripts": {
    "preparecommitmsg": "path/to/prepare-commit-msg ${GIT_PARAMS}"
  }
}

使ってみる

$ git commit

コミットメッセージの入力がこのようにタイトル付きで始まります。

ticket-01234 チケットのタイトルゴニョゴニョ


# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# ...

困ったこと

  • Node経由なので、フックの起動自体が非常に遅い。JIRAのチケット情報の取得も遅い。しかし自分でブラウザを開いてコピペするよりマシ。
  • コミットしたくない場合には通常はコミットメッセージを編集せずに閉じるのだが、メッセージが空ではないため、そのまま閉じるとコミットされてしまう。(キャンセルが面倒くさい)