びくんびくんしながらコードを書く。

いしきひくい系エンジニアのらくがき帳

CodeBuildなどのCI/CDツールを利用してgofmtのエラーキャッチを行う場合の設定

CodeBuildなどでGoのUnitTestを回すときに一緒にgofmtも見ようぜ!ということで設定して詰まりかけたお話です。

基本的にローカルできちんとテスト及びgofmtした上でpushすることが前提なのですが、人間どうしても忘れてしまいうっかりpushしてしまうことがあると思います。

そういったうっかりミスを防ぐため、pushを軸にCIでテストを回す設定などが標準になってきているのではないでしょうか?

Go言語はテストの他に強力なフォーマッタが標準で提供されており、このフォーマッタを通せばいい感じにソースコードをフォーマットしてくれます。

GolandなどのIDEを利用している場合、ファイル保存時に自動でgofmtをかけてくれるような設定をしやすいのですが、そうではない場合もあるかと思います。

そこで、CI上でgofmtがかけられているかをチェックし、gofmtでファイルの変更が必要な場合はfailを返すような仕組みを作っておくと安心度が高まります。

はじめはgofmt だけすればいいんじゃね?と思いやってみたらうまくいかずに(全部成功してしまう。)ウンウン唸っていました。 ググった結果、下記解決方法が出てきたので自分でも忘れないようにまとめました。

設定自体はそんなに難しくないのですが、gofmtの返り値は0しか無いらしく、fmtが必要な場合にFail(Exit code 1)を返したい場合は下記のようなコマンドにする必要があります。

# gofmt の差分を出力する。 
# grep の結果返り値を逆転させる。
#    →表示されたら1 表示されなかったら0
(! gofmt -s -d . | grep '^') 

# 返り値が1だった場合、exit code 1を返却しCIを終了する。
if [ $1 -eq 1 ]; then exit 1; fi

他にも

# gofmt の差分をがあるファイル名を出力する。 
# grep の結果返り値を逆転させる。
#    →表示されたら1 表示されなかったら0
(! gofmt -s -l . | grep '^') 

# 返り値が1だった場合、exit code 1を返却しCIを終了する。
if [ $1 -eq 1 ]; then exit 1; fi

などいくつかCIの出力を工夫することができると思いますので、各自やりやすい方法を探してみるといいと思います。

以上