Dependabot で依存パッケージをアップデートする


はじめに

昨今のアプリケーション開発では、依存するライブラリの機能追加やセキュリティのアップデートに追従することが求められます。
また、しばしば導入したライブラリは導入時点のバージョンのまま利用され、アップデートされないことがありますがそれは後々の負債になりがちです。
しかし、日々アップデートを検知して更新していくのは辛いものがあります。
そこで Dependabot の登場です。

Dependabot とは

Dependabot は Gemfile や package.json など、言語が持つパッケージ管理のマニフェストファイルを見て古かったり、安全ではないライブラリを発見してくれます。発見した依存関係を元に Pull Request を作成して通知してくれるツールです。設定によっては CI を通過したら自動でマージすることもできます。
Dependabot は、GitHub に買収されたことでプライベートリポジトリでも無料で利用できます。

現在は以下の言語に対応しています。Ruby や JavaScript といった言語を始め、Docker や Terraform などにも対応しています。

Dependabot の導入

早速インストールしていきます。
GitHub の Marketplace から Dependabot Preview を開きます。

画面下に遷移して Install it for free からインストールします。

Complete order and begin installation から続行します。ここでアカウントのパスワードが求められた場合はパスワードを入力して続行します。

全リポジトリ、または特定のリポジトリに権限を付与するかを選び、Install を押して続行します。

次に Dependabot に GitHub アカウントでログインします。

Dependabot から GitHub へのアクセスを許可します。

これで Dependabot のダッシュボードまで接続が完了しました。

Dependabot の設定

続いて設定するリポジトリを追加します。Select repos to add または Add repos から追加します。
ここでは GitHub から権限を付与したリポジトリが表示されます。
追加したいリポジトリにチェックを入れ、Add selected で追加します。

追加するとダッシュボードに追加されていることが分かります。

歯車のアイコンから設定を開くといくつかの設定が可能です。この画面からでも設定可能ですが、ここでは別リポジトリを作成した際にも使いまわせるように、設定ファイルを用いて設定していきます。

リポジトリの .dependabot/config.yml のパスに以下のような設定ファイルを作成します。
今回は設定ファイルとして必要そうなものを設定していきますが、他にもいくつかの設定があるため詳細はドキュメントを参照してください。

.dependabot/config.yml
version: 1
update_configs:
  - package_manager: "javascript"
    directory: "/"
    update_schedule: "live"
    default_reviewers:
      - "takasp"
    default_labels:
      - "dependencies"
    allowed_updates:
      - match:
          update_type: "all"
    automerged_updates:
      - match:
          dependency_type: "development"
          update_type: "all"
      - match:
          dependency_type: "production"
          update_type: "semver:patch"
    version_requirement_updates: "increase_versions"

いくつか設定に使った項目について触れていきます。

  • package_manager
    使用している言語を選択します。
    ここでは JavaScript のプロジェクトのため、JavaScript を選択します。

  • directory
    マニフェストファイル(ここでは package.json)があるディレクトリを指定します。

  • update_schedule
    更新頻度と Pull Request を作成するタイミングを指定します。
    dailyweekly を指定する場合は実行日や時間を指定できます。

  • default_reviewers
    作成した Pull Request をレビューする GitHub アカウントを指定します。

  • default_labels
    作成した Pull Request に付けるラベルを指定します。

  • allowed_updates
    更新するアップデートを制限します。セキュリティ更新のみに制限したり、名前の一致するものや依存関係の種類(development や production)によって制限できます。

  • automerged_updates
    自動的にマージする Pull Request の条件を指定します。
    ここでは development と production で分割し、development は全て、production はパッチバージョンのみを自動マージする設定を記載しています。development や production は言語ごとのパッケージ管理に依存しています。JavaScript の場合は、devDependencies が development、dependencies が production に相当します。

  • version_requirement_updates
    マニフェストファイルをどのように更新するか指定します。これによって常に更新するか、ロックファイルのみ、必要な場合だけマニフェストファイルを更新したりと柔軟にアップデート戦略が選べます。

今回は自動マージを有効にするため、Account - Settings から Allow auto-merging to be enabled on projects にチェックを入れ、Update settings から保存します。
また、CI がセットアップされていない場合は自動マージが有効にならないため設定が必要です。

ダッシュボードに戻って Bump now を押してしばらく待つと Pull Request が作成されていることが分かります。

さいごに

パッケージ管理というものは古くからありながら日々バージョンを更新していくというのは計画していても継続的に行っていくのは難しいものがあり、疎かにしていると後々の負債になりがちでした。
Dependabot を導入することで日々のアップデートに気づけるので随分と更新が楽になります。
GitHub では無料で使えるので是非導入してみてください。

参考

Dependabot
Dependabot を導入してみた | DevelopersIO
Dependabot の設定ファイルを置くようにした - くりにっき