TravisとCoverity ScanでJavaScriptコードの静的解析


まとめ

ポイントは2つ.

  • .travis.ymlのbuild_command"--no-command --fs-capture-search $TRAVIS_BUILD_DIR"を指定
  • Coverity ScanのAnalysis Settingsからnode_modulesフォルダー以下を解析対象外に設定1

Coverity Scan

オープンソースプロジェクトなら無料で静的解析サービスを利用することができます.

アカウントの作り方やプロジェクトの登録方法などは以下のページに記載されています.

試しにmasnagam/wd-runjsで使ってみようと思い,以下のように.travis.ymlを記述しました.

addons:
  coverity_scan:
    project:
      name: "masnagam/wd-runjs"
      description: "Build submitted via Travis CI"
    notification_email: [email protected]
    build_command_prepend: ""
    build_command: ""
    branch_pattern: "*"

JavaScriptコードでコンパイル不要なのでbuild_commandを空にしました.

しかし,Travisのログを見ると動作していないようでした.

ERROR: COVERITY_SCAN_BUILD_COMMAND must be set

build_commandは空ではいけないみたいです.

ツールの使い方を確認すると

cov-build --dir cov-int --no-command --fs-capture-search <path/to/source/code>

となっており,どうやら--no-command以降のオプションを指定する必要があるようです.

成功すると,以下のようなログが表示されます.

Running Coverity Scan Analysis Tool...
Coverity Build Capture (64-bit) version 2017.07 on Linux 4.4.0-93-generic x86_64
Internal version numbers: c7e331b562 p-milo-push-30112.651
[STATUS] Running filesystem capture search...
[WARNING] Path '/home/travis/build/masnagam/wd-runjs/cov-int' looks like an idir. Skipping filesystem capture on it.
[STATUS] Emitting non-source files from filesystem capture
[STATUS] Emitting 4037 source files from filesystem capture
|0----------25-----------50----------75---------100|
****************************************************
Emitted 3935 JavaScript compilation units (99%) successfully
...

後はCoverity Scanで解析順番待ち...

Last Build Status: In-queue. Your build is in the queue to be analyzed. There are 76 builds ahead of it.

Travisでの実行時間が長い..(未解決)

実行してみるとわかりますが,この2つのオプションだけだとすごく時間がかかります.恐らく,node_modulesもスキャン対象になっているものと思われます.

node_modulesを除外するための方法を探したのですが,コマンドのヘルプは使い物になりませんし,役に立つドキュメントもツールには含まれていなかったので,これ以上どうすることもできませんでした.

対象ファイルをnode_modulesを含まない特定フォルダー内に集めることができるなら,--fs-capture-search $TRAVIS_BUILD_DIR/path/to/folderとすることで実行時間を短縮できるかもしれません(試してはいません).ただし,binなどが含まれるプロジェクトでは,すべてのファイルを静的解析の対象にはできないかもしれません.

対象ファイルをどこかのフォルダーに一時的にコピーしてコマンド終了時に削除できればいいのですが,build_command_prependbuild_commandしかないので,一時フォルダー削除するのは無理,もしくは少しトリッキーなことをする必要があるかもしれません(試していません).

Coverity Scanでの解析時間が長い..(解決済?)

解析順番がまわってくるまで数時間.その後,解析が始まって一日経っても終わらない..

設定の問題かと考え,一度解析を中断し,Analysis Settingsを変更してみました.

Travisで"Restart build"を実行し,待つこと一晩.無事解析完了しました(たまたま早く解析が完了したのかもしれませんが,因果関係を検証する予定はありません).

"View Defects"を見るには,更に1,2営業日待てとのこと.プロジェクト一覧への反映も解析完了時ではないみたいです.



  1. 因果関係は検証していません.設定変更後に再実行すると,早く解析が終わったというだけです.