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

# はじめに

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

# Dependabot とは

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

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

![Dependabot のサポート言語](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129299/8bb41650-06db-da8a-aa46-dddf128309af.png)

# Dependabot の導入

早速インストールしていきます。
GitHub の Marketplace から [Dependabot Preview](https://github.com/marketplace/dependabot-preview) を開きます。

![Dependabot のページ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129299/0480192f-7bcf-4b19-50e3-8f5831d3e45a.png)

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

![Dependabot のインストール](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129299/4528689e-950e-e850-b515-95ecdd342112.png)

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

![Dependabot のインストールを始める](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129299/4dd214e1-0aff-4749-19f9-b45700f473ed.png)

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

![Dependabot の権限](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129299/504f1928-8b4c-e431-9971-6b0e189b63bd.png)

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

![Dependabot へのログイン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129299/c8b199ae-9f33-8582-1693-4cb2370efbdf.png)

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

![Dependabot と GitHub の認可](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129299/4eac8d53-16ba-4500-5b4d-314c25153b96.png)

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

![Dependabot のダッシュボード](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129299/be4c5469-67fb-7341-a6c8-ce8675d40e36.png)

# Dependabot の設定

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

![リポジトリ追加](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129299/0a8aba6d-1274-2246-25eb-69227bb7e6a5.png)

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

![リポジトリを追加したダッシュボード](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129299/de5b6993-fdb3-a7ef-888f-f9c30fce9d99.png)

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

![リポジトリの設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129299/46c519a7-0e07-8c5b-0978-db1166d2202f.png)

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

```yaml:.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 を作成するタイミングを指定します。
  `daily` や `weekly` を指定する場合は実行日や時間を指定できます。

- 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 がセットアップされていない場合は自動マージが有効にならないため設定が必要です。

![Dependabot のアカウント設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129299/a2e806b1-4779-41fe-5d80-6defddb57c7b.png)

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

![Pull Request 画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129299/3024855d-ecd7-d443-b27a-9c2935a6b833.png)

# さいごに

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

# 参考

[Dependabot](https://dependabot.com/)
[Dependabot を導入してみた ｜ DevelopersIO](https://dev.classmethod.jp/etc/dependabot-101/)
[Dependabot の設定ファイルを置くようにした - くりにっき](https://sue445.hatenablog.com/entry/2019/03/10/151948)