こんにちは、2022年4月にフォースタートアップスにジョインしたエンジニアの八巻(@hachimaki37)です。主にタレントエージェンシー支援システム(SFA/CRM)のシステム開発を担当しております。
コードレビュー自動化サービス Siderがサービス終了となった背景から、移行先となるサービスを調査し導入をしました。今回のテックブログでは、調査過程で出てきた疑問、そして調査結果、導入方法などを合わせて執筆していきたいと思います。
背景
タレントエージェンシー支援システム(SFA/CRM)では、コードレビュー自動化サービスとしてSiderを利用しておりました。そんなSiderですが、sider.reviewサービス終了のお知らせとして、2022年12月31日に全てのサービスと技術サポートの提供が終了となりました。
このサービス終了を受け、Siderの移行先となる代替案を検討する運びとなりました。なお所属のチームでは、CI/CDはGithub Actionsを使っております。
目的
普段当たり前に行っているコードレビューですが、導入調査を機にコードレビューの目的ってなんだ?とふと疑問に思い、改めて調べてみました。
コードレビューの目的とは
レビューを通して、欠陥の早期発見による手戻りコストの低減を行い、ソフトウェアの品質を高めることです。
つまり、ソフトウェアの品質を高めるためにコードレビューを行っているのです。とは言え、どのような観点でコードレビューを行なえば、ソフトウェアの品質を高めることができるのだろうか。手動でやる場合、これらを一から明確にし定義しなければなりません。なかなかの手間と時間ですね。
コードレビュー自動化の目的とは
目的にいく前に、まず2つの疑問を持ちました。一つ目は、コードレビュー自体を、そもそも自動化するメリットがあるのだろうか?という点です。この疑問は、目的を理解することで、調査早々に解消されることとなりました。
コードレビュー自動化サービスを導入することで、問題点や気をつけるべき点などを自動的に検知し、開発者に報告してくれます。つまり、コードレビューにかかる時間や人的な見落としを削減することができるのです。とは言え、導入・運用コストに見合うのだろうか?という点が二つ目の疑問でした。
コードレビュー自動化には、以下のような目的も兼ね備えております。
- コードレビューにかかる時間を削減
- エンジニア個人や開発チームの成長
- ソフトウェアの品質向上
- など
つまり、コードレビュー自動化サービスを導入することで、コスト面以外にも様々なメリットがあることを今回の調査を通じて理解することができました。導入しない選択肢はありませんね。
Siderの概要について
引用元:コードレビュー自動化サービスSiderのご紹介 Sider代表取締役社長 浅原明広氏
タレントエージェンシー支援システム(SFA/CRM)の設定解析ツール
解析ツールの概要
- RuboCop
- Rubyの静的コード解析ツール。規約を守れていないコードに警告をだすだけではなく、インデントや改行位置の修正、使用NGなメソッドの置換なども自動で行う
- Brakeman
- SQLインジェクションなどの脆弱性がないかを解析してくれるライブラリ
- Reek
※Reek と RuboCop では、検出する問題の種類に違いがあります。
- Reek:コードの臭いを検出する
RuboCop:バグである可能性が高いコードを検出
stylelint
Secret Scan
- GitHub上のリポジトリへのシークレットのコミットを検知し、アラート通知を行うセキュリティ機能
- https://dev.classmethod.jp/articles/github-security-features-secret-scanning/
代替案の調査
そこで代替案の観点として、以下を定義しました。
- 導入コストが低い
- ドキュメントが豊富
- 解析結果をPull Requestのレビューコメントに表示できる
- 既存の解析ツールのサポートがある
1. reviewdog
概要
- 公式ドキュメント: https://github.com/reviewdog/reviewdog
- 各種CIで実行可能なコードレビューを補助してくれるコマンドラインツール
代替観点としての評価(※あくまで個人的な意見です)
- 導入コストが低い △
- 各種linterを設定ファイルに記載する必要があるため
- ドキュメントが豊富 ○
- 概要や導入方法などをGoogle検索した結果、多数ヒットするため
- 解析結果をPull Requestのレビューコメントに表示できる ○
- 各種linterの実行結果を渡すことで、Pull Requestなどの差分に関して、警告された行をレビューコメントに表示できるため
- 既存の解析ツールのサポートがある ○
料金
Free(OSS)
2. HoundCI
概要
- 公式ドキュメント: https://houndci.com/?ref=ktkm_net
- Thoughtbot社が開発・運用しており、リポジトリ監視がコンセプトで、GitHub Pull Requestの自動コードレビューサービス 引用元:GitHub Code Review Tool for JS, Ruby, Swift, and more - Hound
代替観点としての評価(※あくまで個人的な意見です)
- 導入コストが低い ○
- ドキュメントが豊富 △
- 概要や導入方法などをGoogle検索した結果、数件しかヒットしないため
- 解析結果をPull Requestのレビューコメントに表示できる ○
- コーディング規約違反のコードだった場合、警告された行をレビューコメントに表示できるため
- 既存の解析ツールのサポートがある △寄りの○
料金
- Chihuahua:Up to 50 private reviews $29 month
- Terrier:Up to 300 private reviews $49 month
- Labrador:Up to 1,000 private reviews $99 month
- Husky:Up to 3,000 private reviews $199 month
その他 候補
- Codacy
- Scrutinizer
- https://progsoft.net/ja/software/houndci
調査結果
コードレビュー自動化サービスは、これに決めた!
上記観点を鑑みてSiderの代替案は、reviewdogを採用する形にしました。以下、静的解析ツールをreviewdog(Github Actions)を通して、Pull Requestに表示するよう設定を加えました。
- Rubocop
- Brakeman
- Reek
- Stylelint
最終的なコード
.github/workflows/reviewdog.yml
name: run Review Dog on: pull_request jobs: rubocop: name: RuboCop runs-on: ubuntu-latest steps: - name: Check out code uses: actions/checkout@v3 - uses: ruby/setup-ruby@v1 with: ruby-version: 3.1.1 - name: RuboCop uses: reviewdog/action-rubocop@v1 with: rubocop_version: gemfile rubocop_extensions: rubocop-rails:gemfile rubocop-rspec:gemfile github_token: ${{ secrets.github_token }} reporter: github-pr-review fail_on_error: true brakeman: name: Brakeman runs-on: ubuntu-latest steps: - name: Check out code uses: actions/checkout@v3 - name: Set up Ruby uses: ruby/setup-ruby@v1 with: ruby-version: 3.1.1 - name: Brakeman uses: reviewdog/action-brakeman@v2 with: brakeman_version: 5.2.0 reporter: github-pr-review fail_on_error: true reek: name: Reek runs-on: ubuntu-latest steps: - name: Check out code uses: actions/checkout@v3 - uses: ruby/setup-ruby@v1 with: ruby-version: 3.1.1 - name: Reek uses: reviewdog/action-reek@v1 with: reek_version: gemfile reporter: github-pr-review fail_on_error: true stylelint: name: StyleLint runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: node-version: 16 - run: yarn install - name: StyleLint uses: reviewdog/action-stylelint@v1 with: reporter: github-pr-review stylelint_input: '**/*.scss' fail_on_error: true
設定がうまく行けば、下記のようにGitHub Actionsから各種解析ツールが実行されるようになります。
Successfulの場合
Failingの場合
調査過程の紹介
RuboCop
調査対象として第一に行った解析ツールは、RuboCopです。自動コードレビューの結果をGitHubのコメントに出力するよう設定を加えました。
公式ドキュメント:https://github.com/reviewdog/action-rubocop
公式ドキュメントを参考に、.github/workflows/rubocop.ymlに定義します。あるメソッドを’return if -> if else’に修正したところ、GitHub Actionsから自動レビューコメントが付くようになりました。
その後、残りの解析ツールを公式ドキュメントを参考に設定しました。
Brakeman
ドキュメント:https://github.com/reviewdog/action-brakeman
Reek
ドキュメント:https://github.com/reviewdog/action-reek
Stylelint
ドキュメント:https://github.com/reviewdog/action-stylelint
まとめ
Siderの代替案として、reviewdogを採用しました。reviewdog導入前の印象は、他のツールに比べて、GUIでの設定ができないため、心理的に「大変そう...」でした。ただ、実際にドキュメントを読みながら設定してみると、思いのほか簡単に設定することができます。
実際一番の悩みどころは、Siderの代わりとなる静的解析ツールは何がベターなのかという点です。今回、reviewdog以外のツールを導入しておらずですが、reviewdogは気軽に試せるので、一旦導入してみて運用しながら改善していく方針でも良いのではないかと思いました。
あとがき
最後に採用情報です。
当社では、まだまだ採用募集中です。ぜひ一緒に成長していきませんか。ご興味ありましたらぜひ一度カジュアルにお話できたらと思います。
採用ページはこちら。(冒頭のTwitterにDM頂いてもOKです!)
参考資料
- https://ts-fort.com/column/web_codereview/
- https://github.com/reviewdog/reviewdog
- https://dev.classmethod.jp/articles/shuntaka-github-actions-reviewdog/
- https://blog.toshimaru.net/reviewdog-rubocop-github-actions/
- https://zenn.dev/miya789/articles/github-actions-rubocop
- https://h3poteto.hatenablog.com/entry/2022/08/01/180000
- https://zenn.dev/peraichi_blog/articles/01fy360dgteynbfv5tj3q6smv5
- https://blog.toshimaru.net/reviewdog-rubocop/