FoodcriticとJenkinsでcookbookの静的解析を行う

Jenkins logo

はじめに

Foodcriticはcookbookのlintツールです。
インストールにはRuby 1.9.2+が必要です。
gemをインストールします。

gem install foodcritic

インストール後、foodcritic [cookbook_path]で実行でき、解析結果が表示されますが、今回はこれをJenkinsから実行するようにします。


Jenkinsの設定

Git pluginのインストール

今回cookbookはGithubから取ってこようと思いますので、Git pluginを使います。

Jenkinsの管理 > プラグインの管理 > 利用可能タブ > Jenkins GIT plugin

からインストールできます。

ジョブを作成

新規ジョブ作成を選択し、ジョブ名に適当な名前を入力し、フリースタイル・プロジェクトのビルドを選択してOKを押します。

ソースコード管理システムにGitを選択し、Repository URLにGithubの読み取り専用のURLを入力します。


ビルド手順の追加でシェルの実行を選択します。
foodcriticを実行するようにします。-f anyを指定すると、構文解析の警告時にビルドが失敗するようになります。

/usr/local/bin/foodcritic -f any .


Warnings pluginの追加

このままだとコンソール出力で結果が確認できるだけですので、警告を追跡できるようにします。
Warnings pluginを使います。

プラグインをインストールしたら、
Jenkinsの管理 > システムの設定 > コンパイラの警告
で、追加ボタンを押して次のように入力します。

名前、リンク名、推移レポート名

Foodcritic

正規表現

^(FC[0-9]+): (.*): ([^:]+):([0-9]+)$

マッピングスクリプト

import hudson.plugins.warnings.parser.Warning

String fileName = matcher.group(3)
String lineNumber = matcher.group(4)
String category = matcher.group(1)
String message = matcher.group(2)

return new Warning(fileName, Integer.parseInt(lineNumber), "Chef Lint Warning", category, message);

これらはつまり、Foodcriticの警告文字列をWarnings pluginのどの項目に割り当てるかの設定です。


ジョブの設定で、ビルド後の処理にコンパイラの警告の集計を追加します。
コンソールログをスキャンするのパーサーに、先ほど作成したFoodcriticを選択します。

さらに、高度な設定をクリックして、常に実行をチェックします。

これでビルドを実行すると、次のように警告が表示されます。

result


あとはビルド失敗時に通知するようにすればよいと思います。


おわりに

今回なぜFoodcriticを使おうと思ったかというと、cookbookは本来、環境の差異を抽象化して吸収できるように作るべきかと思いますが、今自分が作っているものはあまりにも個人的な作りなので、そういった点を指摘してくれるかと考えたからです。

追加のルールがいくつか公開されているので、それらも使っていこうと思っています。

(参考 http://acrmp.github.com/foodcritic/