読者です 読者をやめる 読者になる 読者になる

SideCI Blog

自動コードレビューサービスSideCIを提供している株式会社アクトキャットのコーポレートブログです。



HoundCIはPull Request 毎に超吠える(Rubyのコーディング規約CIツール)

こんにちは。最近HoundCIが話題になってきたので、私たちの開発にも取り込んでみました。 HoundCIはRubyのコーディング規約を守らせるために吠えるCIサービスです。

houndci指摘イメージ_1

上記のように、Pull Requestに対し、コーディング規約に違反している部分があれば、ガンガン吠えてきます。上記の例の場合、「シングルクォーテーション」をバックスラッシュをスケープしたいシーンじゃないのに使ってるのが規約違反として怒られてます。。。

規約って結構メンバーの気分によって会社毎に少しずつ違ったりしますので、仕方がないです。私たちは今のところクォーテーションについては、テキストの代入や改行コードなどを利用しない場合は必要がないのでシングルを使う、事が多い、です。

私たちのSideCIにはコーディング規約のために吠える機能は現在のところないので、HoundCIも遠慮なくご紹介させて頂きます。

SideCIにコーディング規約のために吠える機能が備わりました!HoundCIとほぼ同様の使い方が出来ますので、本記事はSideCIでも使えるんだと思ってお読み頂ければ幸いです。(2015年3月追記)

https://www.sideci.com/

HoundCI

https://houndci.com/

30秒あれば設定完了(だいたいは)

HoundCI にアクセスして、監視したレポジトリをオンにして、Pull Requestを送ると、Houndが名前の通り、吠えてきます。

こんな感じに

houndci指摘イメージ_2

ちなみに私的には、「え?コントローラの最後に空白行入れるなって?そんなのわざわざ指摘してくるなよただのミスっていうか、いや今度からは気をつけるけどさ、別にどうだっていいじゃないか」と思ったりもします(※あくまで私感です)

まぁつまり、人が指摘するとその人に対してちょっとフラストレーションがたまってしまいますが、ボットが言ってくるならしかたがないというか、フラストレーションの向け先がないというか。

こっそりとコーディング規約を浸透・守らせていきたい場合に非常におすすめのサービスです。

料金はOSS無料、プライベート有料

HoundCIはPublicなレポジトリであれば無料で使えます。本記事初稿時点ではPrivateレポジトリでも無料でお使いになれましたが、現在は有料になっております。課金は1レポジトリあたり$12 /monthとのことです。
なお、HoundCIと同等以上の機能を備えたSideCIはPrivateレポジトリも無料となっております。(2015年3月30日現在)

HoundCIのバックエンド

HoundCIの裏側はRUBOCOP V0.22.0(July 6th, 2014)です。RubocopはRuby向けのOSSで、GitHubからのPullRequestをWebHook(payload)で受取、差分のあるファイルのみrubocopで静的解析し、GitHubに対してコメントしてくれます。

ちなみにHoundCIの提供元はthoughtbot, inc.さんで、非常に有名なOSSを何個も、いや何十個も提供しています。(コントリビュートじゃないですよ、レポジトリ・オーナーです)

HoundCIではデフォルトのRubocop用のコーディング規約はthoughtbotさんのRuby用コーディング規約に順しています。OSSを非常に沢山提供されている企業のコーディング規約ですので、ガッチガチです。

カスタマイズやymlで

サインアップした後は設定画面で、カスタマイズ出来るよってことが表示されます。 カスタマイズには.hound.ymlをレポジトリに追加することで対応します。 これはrubocop.ymlと互換性があります。

下記はHoundCI Configration画面からの引用です。

AllCops:
  Exclude:
    - config/initializers/third_party.rb

LineLength:
  Description: 'Limit lines to 130 characters.'
  Max: 130

StringLiterals:
  EnforcedStyle: single_quotes

HashSyntax:
  EnforcedStyle: hash_rockets

RedundantBegin:
  Enabled: false

Rubocopと何が違うの?メリット・デメリット

下記のようなメリットがHoundCIにあるかと思われます。

  1. コーディング規約をコードレビュー毎にだけ行う緩い運用が可能
  2. セットアップが1人が数十秒でOK。保守も簡単
  3. GitHub上で規約違反を簡単に見られる

HoundCIはRubocopをホスティングしているだけなんですが、提供している価値は大きく違うと感じました。HoundCIは「Pull Request(コードレビューの依頼)」に対して、コーディング規約のチェックを行います。

純粋に、Pull Requestのレビュー画面にコメントされるとすごく簡単(見やすい・分かりやすい)のが良いですね。

VimやSublime等々エディタと連動し、エディタでsaveしたタイミングでsaveしたファイルのみRubocop走査をかける方も多いです。これも早いし分かりやすいんですが、全員でRubocopの設定を行い、コーディング規約は変更がある度に全員に共有して、となると少々運用が面倒です。 また、これだとRubocopに100%従わないといけない雰囲気を感じる(だって画面上で指摘されるんだもん)ので、少々HoundCIよりもきつすぎます。

余談ですが

Rubocopって全ファイルを走査すると非常に時間がかかるんです。HoundCIはそれ以上の速度でコメントをしてきます。それをどうやってやってるか、ちょっと解説してみます。

ちなみにソースコードを読んだわけではなく、振る舞いから推測しているだけなので、間違っていたら教えて下さい。

Pull Request(payload)の中身を少しだけぺたっとすると

   head": {
      "label": "baxterthehacker:changes",
      "ref": "changes",
      "sha": "05c588ba8cd510ecbe112d020f215facb17817a6",
中略
    "base": {
      "label": "baxterthehacker:master",
      "ref": "master"
      "sha": "69a8b72e2d3d955075d47f03d902929dcaf74033",

という感じに、Pull Requestの元となったブランチ・コミットとPull RequestのHEADのブランチ・コミットが出るので、baseのsha〜headのshaの間に更新されたファイルの一覧をGitのhistoryから作成し、それのファイルに対してのみRubocopで走査をかけている物と思われます。

Rubocopはファイル単体に対して走査をかけることが出来ます。

HoundCIを使う前に

使う前にと書きましたが、使うのに必要な時間は数十秒なので、ぜひ直ぐ使ってみる事をおすすめします。

次に、一度コーディング規約を作ってみると良いと思います。HoundCIからのコピーでも構わないでしょう。

最後に、Rubocopはauto fix機能がありますので、一度ガッとコーディング規約違反をauto fixしてしまうと良いです。

Rubocopは以前ご紹介させていただいたので、そちらをご覧頂ければ幸いです。 コーディング規約をチェックするRubocopとPHP_CodeSniffer

コードが外部に出せない人は自分でホストしてみよう

HoundCIはOSSですので、自分でホストすることも出来ます。私も自分でホストしてみました。コメントするボットも自分で選択できます。

ソースコードはこちら。 https://github.com/thoughtbot/hound

setupに必要な情報も大体書いてありますのでその通りに。一応必要な環境を補足します。

  • Ruby(VersionはGemfileにて指定あり)
  • Redis
  • Postgresql

foremanコマンドで動きます。動作ポートを変えたい場合などはProcfileを変更しちゃってもOKだと思います。

foremanはこちらから。これを常時起動させたい場合には、upstartを使うと楽です。

foremanにはupstartフォーマットのファイルをexportする機能がついていますので、下記のようなコマンドでexportするとよいでしょう。

sudo foreman export --app hound --user hound upstart /etc/init

.envファイル等の修正はupstartフォーマットへのexportの前に実施しましょう。いろんな設定が/etc/initに置くファイルの方に直書きされてしまうので。

SideCIもちゃっかり宣伝

私たちが開発しているSideCIもちゃっかり宣伝します。SideCIもHoundCIの如くコードレビュー、コメントを行います。設定も20秒あれば十分です。

ただし、レビューする内容はコーディング規約ではありません。HoundCIはバックエンドにRubocopを使ってますが、SideCIではBrakemanやrails_best_practices、bundlerなどを利用しています。コーディング規約のチェックは行わず、セキュリティホールやバグを含んだライブラリの検出、バグの温床になりそうなコードの書き方を発見してレビュー(コメント)します。

HoundCIはRubocopがバックエンドなので、単一ファイルに対して走査出来るのですが、SideCIはコードのプロジェクト全体に対して静的走査をしているので、結構重たいです。。。それをプルリクエスト毎ではなくPush毎にしているので、更に重たいです。近日中にコードレビュー関連機能はプルリクエストに対しのみ行えるようにも設定出来るようにもする予定です。

コメントはこんなふうに来ます。

SideCIの指摘イメージ

管理画面でも一覧して見られます。

SideCIの管理画面での指摘イメージ

というわけで、HoundCIとSideCIをどうぞ!

HoundCI

f:id:sideci:20140712162958p:plain