Dependabotのライブラリアップデートのプルリクをまとめてみる

Dependabotが自動で作成してくれるライブラリアップデートのプルリクをグループとして複数のライブラリをまとめて作成してくれないかを調べたり試してみたので備忘録として記事にしておきます。

# 複数のライブラリのプルリクをまとめられないと何が不便なのか

複数のライブラリのプルリクをまとめられないと何が困るのか？という点ですが、それらのライブラリ同士が依存関係として密接に関係している場合に個別に1つずつプルリクをマージしていくとマージの途中で他のライブラリのマージが出来なくなったりすることがあります。

例えばAWSのPython SDKのboto3、boto3の型アノテーション用のboto3-stubs、及びCLI用のawscliなどはお互いに割と依存していたり、アップデートも大体同じタイミングで公開されたり、バージョンの数値がパッチバージョンが一致していたりと基本的にどれかのライブラリバージョンを上げる時には他のライブラリバージョンも合わせて上げた方が無難な形になっています。

一方でDependabotのプルリクは普通に使っていると1つのライブラリに付きアップデート用に1件のプルリクが作られます。そのため個々のプルリクが作られた後に1つ1つマージしていこうとすると一時的な相互のバージョンの依存関係の問題でCIが引っかかったりしてしまうことが割とあります。

また、ものによっては個々のプルリクを1つ1つマージしていると途中でコンフリクトするケースもあります。

複数のライブラリのプルリクをグループとしてまとめることでこれらが解決できないか試します。

# 事前に情報を軽く調べてみる

Dependabotのリポジトリで以下のissueで色々と議論されています。

https://github.com/dependabot/dependabot-core/issues/2265

issueが追加されたのは2018年ですが、やりとりを追っていってみるとサポートされたのは2023年10月のようで割と最近サポートされた形となっているようです。

公式のドキュメントとしては以下のものになっています。

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

軽く目を通してみると、どうやらセキュリティ的に問題になっているものに関してはグループではなく単一の形でもプルリクが作成されるケースがあるようです。

設定例としては以下のものが挙げられていました。どうやら`groups`というセクションを設けて、グループ化の条件を`patterns`などのセクションで設定していく形になるようです。

https://github.com/eve-val/eve-roster/pull/1815/files

また、以下の記事も読んでいたところ、どうやらこの方は`package-ecosystem`ごとに`patterns`をアスタリスクにして全てをグループ化する形にしているようです。

https://zenn.dev/yuki0920/articles/9af3a7581193bf

確かに考えてみると全部プルリクがまとめられていても私の場合は問題なさそうですしマージの手間も減りそう・・・なので合わせて1つにまとめていってみます。

# 実際に設定を調整してみる

趣味で書いていっている以下のPythonライブラリで試していってみます。

https://github.com/simon-ritchie/apysc

対象のリポジトリでは`pip`と`github-sctions`、`npm`の3つの`package-ecosystem`に対してDependabotの設定が以下のようにしてあります。

```yaml:dependabot.yml
version: 2
updates:
  - package-ecosystem: "pip"
    directory: "/"
    schedule:
      interval: "weekly"
    ignore:
      - dependency-name: "python"
        versions: ["<=3.7", ">=3.9"]
  - package-ecosystem: 'github-actions'
    directory: '/'
    schedule:
      interval: 'weekly'
  - package-ecosystem: 'npm'
    directory: '/'
    schedule:
      interval: 'weekly'
```

これに`groups`のセクションを以下のように加えてみます（`package-ecosystem`単位で全部まとめるようにアスタリスクで条件を設定しています）。

```yaml
version: 2
updates:
  - package-ecosystem: "pip"
    directory: "/"
    schedule:
      interval: "weekly"
    ignore:
      - dependency-name: "python"
        versions: ["<=3.7", ">=3.9"]
    groups:
      dependencies:
        patterns:
          - '*'
  - package-ecosystem: 'github-actions'
    directory: '/'
    schedule:
      interval: 'weekly'
    groups:
      dependencies:
        patterns:
          - '*'
  - package-ecosystem: 'npm'
    directory: '/'
    schedule:
      interval: 'weekly'
    groups:
      dependencies:
        patterns:
          - '*'
```

変更をpushしてしばらくまっていたところ、以下のようなプルリクが作成されていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/2840dbcc-51e4-be4a-786d-ca44e9633a5b.png)

`Bump the dependencies group with 9 updates`というプルリクのタイトルになっていることから分かる通りグループ化の設定が効いており、9個のアップデートが一括で含まれていることが分かります。

プルリクの中身を見てみると以下のように対象となっている各ライブラリのバージョンがいくつからいくつへと変更されるのかであったり各ライブラリごとのRelease notesなども表示できるようになっているようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/814a6ccd-9d7e-a0e8-60d9-3607de183cce.png)

シンプルな設定で割と効果が高そう（週次とかでのライブラリアップデートのプルリクマージが一層楽に終わりそう）で中々良さそうです。お仕事でも使っていってみようと思います。

# 参考文献・参考サイトまとめ

https://github.com/dependabot/dependabot-core/issues/2265

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

https://github.com/eve-val/eve-roster/pull/1815/files

https://zenn.dev/yuki0920/articles/9af3a7581193bf