ぶちのブログ

競プロとCTFが趣味なWebエンジニアのアウトプットの場

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

になりました。