お世話になっております。
しゃまとんです。

gitでプロジェクトやコードを管理する場合、commit時にhookをいれて変なcommitが混ざらないようにすることができます。 pre-commit-hookという機能なのですが、phpに関しての設定記事はよく見るのですが、goでもやりたいなーということで考えてみました。

やはりやりたいのはコードのビルドが通るかなので、、コンパイルチェック的なものをしたいのですが、 そういうのはスクリプト言語のチェック機構なので普通にビルドして確認することにしてみます。(phpならphp -l、perlならperl -cでしょうか)

下記がチェックスクリプトです。
通常のビルドをしているのですが、問題なく成功したときに実行ファイルができてしまうので、削除処理をしてから最後の手続きをしています。

{リポジトリトップ}/.git/hooks/pre-commitあたりに記載するとcommit時に実行してくれます。 (今回はtouch pre-commitで作成しました)

#!/bin/sh

HAS_ERROR=0
TMP="___build_check"

# go file num
NUM=`git diff --cached --name-status | cut -f2 | grep '.go$' | wc -l`

# build check
if [ ${NUM} -ne 0 ]; then
    echo "build checking..."
    for f in `git diff --cached --name-status | cut -f2 | grep '.go$'`;
    do
        if ! go build -o ${TMP} ${f}; then
            HAS_ERROR=1
        fi
    done
fi

# delete test build file
if [ -e ${TMP} ]; then
    rm ${TMP}
fi

# has error?
if [ ${HAS_ERROR} -ne 0 ]; then
    echo "build error found!!"
    exit 1
fi

# 正常終了
exit 0

実行するとこんな感じ。(わかりづらいですが…)

 git commit
build checking...

# abortしました
Aborting commit due to empty commit message.

今回の場合はコミット対象のものを単一ファイルでビルドチェックをしていくのですが、 記載をかえれば大きなアプリケーションにもチェックを入れられると思います。

以上です。

■参考