🤖

RailsのプロジェクトでマジメにDependabotを飼い始める方法

2022/06/15に公開

この記事を書こうと思った背景:

  • Railsのプロジェクトを20こくらい経験したのに、ちゃんとDependabotを設定して運用できているところがなかった
  • Dependabotを使い始めるのに意外とハマりポイントがあったので、とりあえず運用始めるための基本的な設定がわかったら有用そう
  • DependabotがGitHub Nativeになって、設定方法が変わった。

というところで記事を書いてみることにしました。

Dependabotの詳細についてはこちらを参照ください。
https://docs.github.com/ja/code-security/dependabot/dependabot-version-updates/about-dependabot-version-updates

対象となる読者

  • Railsやっているけど、Dependabotいれてない人
  • Dependabotいれたいと思ってるけど、何からやっていいかわからない人

TL;DR

とりあえず要約すると、依存関係を定期的にアップデートするためには、以下の設定をすればいい感じにDependabotを運用開始できるようになります。

  1. リポジトリの設定で、Dependabotを有効にする
  2. 以下の設定ファイルをリポジトリに追加する。
.github/dependabot.yml
version: 2
updates:
  - package-ecosystem: "bundler"
    directory: "/"
    schedule:
      interval: "weekly"
      day: "monday"
      time: "06:00"
      timezone: "Asia/Tokyo"
    reviewers:
      - "rails-reviewers"
    ignore:
      - dependency-name: "*"
        update-types: ["version-update:semver-patch"]
      # parser shall be same version as Ruby
      - dependency-name: "parser"

ここまでで、毎週月曜日の6時に依存関係を更新するPRを作成してくれるようになります。
PRを確認してマージすれば依存関係を最新に保つことができ、プロジェクトを健全な状態で維持できるようになります。

解説

schedule

    schedule:
      interval: "weekly"
      day: "monday"
      time: "06:00"
      timezone: "Asia/Tokyo"

毎週月曜日の6時に依存関係をチェックし、最新版があればPRが作成されます。
毎日のチェックにすると、確認作業を毎日するようになり他の作業の邪魔になることがあったので、週に一度チェックするのがちょうど良いなーという運用に落ち着きました。

reviewers

    reviewers:
      - "rails-reviewers"

Dependabotが作成したPRにレビューを自動で設定できます。
今回は、rails-reviewersというチームをGitHubで作成し、具体的なメンバーはそちらで管理しました。
レビューワー設定をきちんとすることで、誰がいつやるかが明確になるので、地味にオススメの設定です。
Pull Requestのリマインダーとも相性がいいです。

ignore

    ignore:
      - dependency-name: "*"
        update-types: ["version-update:semver-patch"]
      - dependency-name: "parser"

- dependency-name: "*" update-types: ["version-update:semver-patch"]
この部分で、全てのgemに対してセマンティックバージョンのパッチバージョンの更新を無視するとしています。(例: 2.0.1 => 2.0.2 は無視)
最初はパッチバージョンも取り込んでいたのですが、頻度が多すぎるのとあまりインパクトのある変更内容はなかったため、マイナーバージョンのアップデートだけ追従すれば十分と判断しました。
パッチバージョンでセキュリティアップデートが発生することもありますが、こちらは securityアラートの方で対応しています。

- dependency-name: "parser"
parserは、Rubyのバージョンと合わせる必要があるため、対象から除外しています。

その他の設定

さらにカスタマイズしたい場合は、公式の情報をみてください。

https://docs.github.com/ja/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file

補足、あとがき

導入直後は、依存のアップデートがとても多くなってしまい、変更点の確認作業に時間をとられてしまいますが、一度アップデートが完了すれば、次回以降は差分が小さくなるため、毎週の確認・マージは5分~30分程度になります。
最初は、気合で頑張りましょう!

この運用をするようになり約1年ほどが経過しましたが、開発環境としてはとても健全になったように感じています。
依存関係を最新に保つためには、

  • 自動テストの整備
  • Ruby・Railsのアップグレード
    が必要になり、Railsの開発環境としてはよりよい状態に保つモチベーションにもなりました。

また、頻繁にアップデートがくるので、変更点を理解し、gemの開発状況に関心をもち、開発者としてのスキルもアップしたように思います。

不要なgemを入れていると、余計な更新をしなくてはいけないため、gemを吟味し最小に保つ動機も働きます。

ぜひ、Dependabotとの開発を楽しんでいきましょう!

Discussion