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;