JenkinsでCoverityを回す
本記事はアドベントカレンダー ほぼ厚木の民 8日目の記事です。 今回はJenkinsにCoverityプラグインを導入する話を書いていきたいと思います。
はじめに
プロジェクトでJenkinsでCoverityを回すジョブ作成を頼まれて、取り組んでみたものの初めてさわったのもあり、躓いた箇所がありました。調べても躓いたところの情報が出てこなかったので少しでも誰かの助けになれば、と思い書きます。
※本記事はJenkinsでCoverityを動かすことを本テーマとしてJenkins、Coverity導入に関する話は書かないので悪しからず。。
基本的なやり方は公式で出ているので要所を抑えて書きます。 この記事を読んでなんとなく分かること
Jenkinsって何?
Coverityって何?
JenkinsでCoverityが回せると何が良いの?
JenkinsでCoverityを回す方法
Jenkinsって何?
まず説明に入る前に簡単に知っておきましょう。このおじさん見たことありませんか?
https://gyazo.com/b3576984439ce8cee49d9d568f665ffd
この紳士なおじさまがJenkinsの目印です。
CI(Continuous Integration)/CD(Continuous Delivery)実現のためのツールです。外部のジョブ(例えばgitのコミット)を監視してそれをトリガーにJenkinsで設定したジョブを実行させることが可能です。
JenkinsはOSSで基本的にJavaが動く環境であればLinuxでもWindowsでも動作させることができます。
詳しく知りたい方はこちらへ。詳細は公式に任せます。またJenkinsを拡張したものとしてCloudBees CIなるものも出ているので興味がある人はこちらへ。 Coverityって何?
Synopsysが出している静的解析ソフトです。
誤検出率が15%以下で、他製品(約50%)と比べたらだいぶ低い数値となってます。
オンプレでもクラウドでも運用しており、21言語、70以上のプログラミング言語に対応してます。
解析結果はCoverityConnectというWeb上で見ることが出来ます。下図のように、検出されたコードにはCIDが振られていきます。ソースコード上に色文字で該当箇所や検出理由を記載してくれます。右ペインで担当の割り振りやコメントも残すことができます。公式でチュートリアルもあるので興味がある方はこちら https://gyazo.com/0dfb6d4000fd4bcec57df758c07e3563
以下説明で使う言葉もここで記しておきます。
Coverity Analysis:ソースコードを実際に解析するソフトウェア。これがないと解析できない
Coverity Connect:コード解析結果をWeb上で確認できる。Connectサーバーはクラウド、オンプレミスで運用可能。詳しくは こちら JenkinsでCoverity回せると何が良いの?
テストを自動で回せる。
ソフトウェア開発現場を想定すると一番役立つのはこれかと思います。
Jenkinsでやらず、Coverity wizardを使うやり方もありますが、これだとキャプチャビルドが終わるのを待って、それが終わったら解析を回して、、、と短いコードなら対して時間がかかりませんが、大規模プロジェクトだと5時間以上かかることもあります。
JenkinsではGitのプラグインも入れられるので、それを使えば次のような場面で使えます。
ソースコードをコミット(Git)
コミットをトリガーにCoverity Analysisを実行(Jenkins)
解析結果をCoverity Connectにコミット
いつも通りコミットするだけで後は勝手にJenkinsで回してセキュアでないコードを検出してくれます。
JenkinsとGitとの連携などはこちらの記事に詳しく載っているので興味があればこちら Jenkins Jobの設定バッチコマンドが短い
プラグインを使わない方法もありますが、これだと鬼のようにバッチコマンドが長くなってしまいます。実際にそういうプロジェクトを見ました。
JenkinsでCoverityを回す
想定環境
Jenkins ver. 2.204.1:
Windows 10のPCを2台使用
1台がmasterサーバー(以下masterPCとする)。こちらでJenkinsサーバーを立てている。
もう1台slaveサーバー(以下slavePCとする)
※masterとslave:
Jenkinsではmasterでのプロジェクト管理負荷を下げるためにslaveノードを切ることが可能です。
例えばプロジェクトのビルドが重いときには、slaveノードでそのプロジェクトを実行するようにして、ジョブ管理だけをmasterの役割にするなどして、負荷分散してジョブを並行して処理可能です。詳しくはこちら.slave作成を詳しく知りたければこちら Coverity ver.2019.3:
slavePCでCoverity Analysis、Coverity Connectへコミットする。
Coverity Connectはクラウドサーバーを利用(コミット時はSSL)
ターゲット:既にJenkinsとCoverityを実行する環境が出来ている。あとは繋げるだけ。
やっとここまできた、、長くなりましたがここからが本題です。
公式で詳細は載っているので、抜粋して書きます。
1.Synopsys Coverity Pluginをインストールする
まずJenkinsにログインするとホーム画面で以下のように見えます。
https://gyazo.com/beca3847f36779f887f5fb9a7b7bca6b
https://gyazo.com/ffc264a59abff8ab655caca5c99ded9c
Jenkinsの管理>プラグインの管理を選択
”利用可能”タブ>”Synopsys Coverity”を探してインストール
ややこしいことに”Coverity Plugin”もあるので注意。
インストールされているとインストール済みタブに入ります。
既にインストールされている場合は、利用可能に表示されません。
インストールできたら、Jenkinsを再起動
JenkinsでのSynopsys Coverity Pluginの設定
Coverity Connect Instanceの追加
Jenkinsの管理>システムの設定。この中にSynopsys Coverityの項目がある
https://gyazo.com/c266689d685a0c359256d399bc94992e
URL:Coverity ConnectのURLを記入。
Credentialsの追加:
既にJenkinsに登録済みならタブをプルダウンすれば選択できる。
登録していない場合は鍵マークをクリックして追加
https://gyazo.com/e0c6b7fcfeeb944e9a66d1e4ff93b795
ユーザー名とパスワードはCoverity Connectにログインするときのモノを使用
IDは記入しなければuniqueなモノが勝手に設定されます。
Coverity ConnectがhttpであればTestConnectionが成功する。しかし、httpsである場合、SSL/TLS認証をJava keystoreに追加する必要がある。追加する証明書はCoverity ConnectサイトからChromeであれば鍵ボタン押して操作すれば取得可能。こちらを参照
Jenkinsのmasterが使用しているJavaのkeystoreにインポートする必要がある。
Jenkinsが使用しているJavaのpathはjenkins.xmlに書かれている.
jenkins.xmlの位置はC:\Program Files (x86)\Jenkins\jenkins.xmlとか。
※今回の環境のようにJenkinsのSlaveノードなどを作成していると、Jenkins設定ファイルが別にあり、異なるパスを設定している場合があるので注意。
恥ずかしながらその時masterとslaveを見落としており、slavePCのjenkins.xmlの設定ファイルにkeystoreのパスを書いていた。当然TestConnectionが成功せず、あれやこれやと時間を無駄に使ってしまった。。
Coverity Connect instanceはあくまでGlobal設定なのでJenkinsサーバーのmasterPCのJava keystoreに証明書を追加する。ここのTestConnectionができていないとジョブ設定でCoverity Connectを選択できません。あの紳士的なおじさんにこんな顔で怒られます。
https://gyazo.com/a1121e5b52a6256ea294d7a4f21fd6d5
Jobの設定
Coverity Connect instanceが生成出来ればあとはJobでビルド設定をしていけばOKです。
ダッシュボードからジョブの作成をして設定を選択
ここから先は各プロジェクトによって異なりますが、自プロジェクトの設定を書いていきます。
General:このJobの保存日数や最大数、実行ノードなど指定します。
https://gyazo.com/ae73b9624ed4b796ae729dfbf4da4ed9
ビルド環境:ここで使用するCoverityの設定をする。この時にはCoverity Connectでプロジェクトおよびストリーム名などを設定しておく。
https://gyazo.com/859135eba26e03cef760466cf7fdb0f3
ビルド(Coverity Analysisの解析)
ビルド項目ではwindowsバッチコマンドの実行を指定する。Coverity Analysisで使用するものを指定。これは各プロジェクトで変わってくるので割愛する。やることとしては、
C:\Program Files\Coverity\Coverity Static Analysis\bin\cov-build --dir [中間ディレクトリのパス] [プロジェクトのビルドコマンド]
"C:\Program Files\Coverity\Coverity Static Analysis\bin\cov-analyze" --dir [中間ディレクトリのパス] --enable [かけたいチェッカー]
チェッカーについては、詳しく載っているサイトがあるがすぐに見つからなかったので後で追記します。
ビルド後の処理では成果物を保存したり、その後の処理をしてしたりできる。
自プロジェクトではCoverity解析と結果コミットのJobを分けている。これはたまにコミットが失敗することがあるためである。
コミットJobでは、ビルド環境までは上述した内容と同じでビルド項目のコマンド欄に以下を指定している。
cov-commit-defects --dir [中間ディレクトリパス] --host [CoverityConnectのURL] -https-port [ポート番号] -stream [ストリーム名] --certs [証明書ファイルのパス] --user [Coverityログイン名] --passward [Coverityのパスワード]
[]は各自異なる。
https://gyazo.com/b7192ef3251c6b9f151f5e132d860161
ここまでで大体の設定は終わりです。
Jobを走らせてCoveirty Connectサイトにコミット出来ていることを確認して完了。
参考文献
終わりに
だいぶ長くなってしまった。長いわりに内容の薄いものな気が、、
途中雑になったので後で追記するかもです。Jenkinsジョブのバッチコマンドについては結構端折りましたが、調べるとすぐ出てきます。中間ディレクトリとかCoverity解析の基本的な話は希望があれば、また別記事か追記するのでコメントしてください。