Technofara

Golangエンジニア!仕事で必要になって勉強した事とか、新しい事とか色々まとめたりを緩くやります。技術系と思考系だけにしておきます、

Golangのテスト結果をJUnit Report形式で書き出してCircleCIに読み込ませた話

ふと、以前作成した、GolangのCircleciをみてみたら、

junit report形式のxmlもつくれや!(本当は出したらよしなしにしますよ。)って書いてあるのを見つけたので 対応してみた

対応後のcircle.ymlがこれ github.com

go test にはreport機能が無いので、今回は

jstemmer/go-junit-report を使うことにしました。

どう使うかというと

go test -v ./... | go-junit-report > junit.xml

といった感じ

ただこれの問題点が

テストがエラーの場合exit code が1になるはずなのですが、junit.xmlの生成に成功しているから exit code が0になってしまう。
正常だけど正常じゃない。。。

このままだと、https://circleci.com/gh/shinofara/circle-go/31:エラーだけど成功 の様にテスト失敗してるけどCI的にはOKってなっちゃうので

{ go test -v ./...; echo $? > /tmp/status;} | go-junit-report > junit.xml;
exit `cat /tmp/status`

という感じで、一度ファイルに書き出して、それをexitで返すという方法を取ることにしました。
素直に exit $? とすればいいやん?でもできないやん?
ということでこうなりました。

あとは、テスト失敗時、成功時の確認をして問題なければこれにて終了

テスト失敗!そしてRED Continuous Integration and Deployment

テスト成功!そしてGREEEEEEEN Continuous Integration and Deployment

はい、今回は以上

訂正

go-junit-reportには、set-exit-code というオプションがあって、デフォルトではfalseとなっているため、
テスト結果が何であろうともexit 0 となってしまっていたようです。

go-junit-report -set-exit-code=true とすることで、失敗時は失敗となりました。

訂正後のcircle.yml の内容は以下

test:
  override:
    - mkdir -p $CIRCLE_TEST_REPORTS/golang
    - go test -v $(go list ./...|grep -v vendor) | go-junit-report -set-exit-code=true > $CIRCLE_TEST_REPORTS/golang/junit.xml;