brakemanをCI上のdockerで使った場合に、Too long with no outputエラーが出る場合への対処
TL;DR
Too long with no outputのエラーでbuildに失敗している場合は、--no-pager
オプションを付けて実行する。
もしくはCI=trueの環境変数をdocker containerにも渡す。
はじめに
あるプロダクトでbrakemanを導入していて、CI上でも問題なく実行されていました。
別のプロダクトでも導入しようとしたら、コマンドは変えていないつもりなのに、brakemanが終了しなくてbuildに失敗してしまいました。
詳細
導入に成功していたプロダクトのコマンド
- run: name: Run Brakeman command: bundle exec brakeman
buildがコケるコマンド
- run: name: Run Brakeman command: docker run -it --rm ${IMAGE_NAME} bundle exec brakeman
こうして見ると、dockerが何かを悪さしているように見えますが、バージョン違いとかそこらへんを先に疑ってしまい、かなり時間を取られました。
対応方法
調べても情報が得られなかったので、ヘルプを最初から最後まで読んでいくと、--no-pager
オプションを付ければ良さそうと判明。
--no-pager
の存在に気づいてから、改めてそれっぽく調べ直すと、以下のissueが見つかりました。
https://github.com/presidentbeef/brakeman/issues/1100
CI=true
の環境変数が与えられているときには、自動で--no-pager
になるそうですが、確かにdocker containerには渡されていないです。
割と気づきにくいトラップでした。
おまけ
brakeman --help
の結果を全部読んだので(一周目で--no-pagerに気づかなかったので全部読むことになりました)、CIで有用そうなオプションを書き留めておきます。
-A, --run-all-checks Run all default and optional checks -w, --confidence-level LEVEL Set minimal confidence level (1 - 3) -q, --[no-]quiet Suppress informational messages
最終的なconfigは、
- run: name: Run Brakeman command: docker run -it --rm ${IMAGE_NAME} bundle exec brakeman -Aqw1 --no-pager
になりました。