🛠️

[Flutter] flutterプロジェクトにDependabotを導入したときのメモ

2025/01/22に公開

GitHubの設定から有効にして、dependabot.yml置いたら終わりかと思ったら予想外にPRが全然作られなかったりしたので発生した問題と対策を覚書しておきます。
ちなみにまだ1回もPR届いてません。

基本構成

dependabot.yml
version: 2
registries:
  private-registry:
    type: git
    url: https://github.com
    username: yourname
    password: ${{secrets.PERSONAL_TOKEN}}
updates:
  - package-ecosystem: "pub"
    directory: "/"
    # 毎日、日本時間の10時に更新をチェックする
    schedule:
      interval: "daily"
      timezone: Asia/Tokyo
      time: "10:00"
    open-pull-requests-limit: 10
    versioning-strategy: increase
    reviewers:
      - "YourName"
    registries:
      - private-registry

Dependabotを有効にする

Settings > Code security からDependabotを有効にする

  • Dependency graph
    • 有効にすることで、Insights > Dependency graphが確認できるようになる
  • Dependabot alerts
    • 依存関係に影響する脆弱性に関するアラートを受信できるようになる
  • Dependabot security updates
    • アラートを受信したあとに、それを解決するpull requestを自動で作成することを許可する
  • Dependabot version updates
    • 新しいバージョンが利用可能になったとき、依存関係を最新にするPRを自動で作成することを許可する
    • dependabot.ymlファイルで指定する
  • Dependabot on Actions runners
    • GitHub Actions上でDependabotを実行する。今後はこれがデフォルトになるから設定項目自体が消えるかも。

プライベートレジストリを参照する

pubspec.yamlで読み込んでいるライブラリの中にプライベートレジストリの内容が含まれていた場合、registriesの設定が必要です。

dependabot.yml
registries:
  private-registry:
    type: git
    url: https://github.com
    username: yourname
    password: ${{secrets.PERSONAL_TOKEN}}
:
updates:
  - package-ecosystem: "pub"
:
    registries:
      - private-registry

例えばこのうち、private-registrypubspec.yamlで指定しているレジストリの名前です。
(例えばcupertino_iconsをプライベートレジストリでforkしていたら、cupertino_icons

githubの場合、passwordの代わりにpersonal access tokenが利用できます。
生パスワードを使うより、ちゃんと適用範囲を制限したpersonal access tokenを発行して設定するのが良いです。

versioning-strategy

本気でわかりにくい

パラメータ 説明
auto 未指定の場合もこれ。pubの場合はwiden。
increase 新しいバージョンと一致するように、最低バージョン要件を追加します。 範囲が既に存在する場合は通常、下限を増やすだけです。
increase-if-necessary 必要な場合のみバージョンを上げます(例:セキュリティアップデートや互換性の問題がある場合)
widen 可能であれば、許可されるバージョンの要件を広げて、新旧両方のバージョンを含めます。
lockfile-only ロックファイルを更新する pull request のみを作成します

ライブラリの場合はwiden、アプリの場合はincreaseが推奨されてるぽい。
例えば以下のようになるとは公式ドキュメントに書かれているんだけど、全くPRが作成されないのでまだ試行錯誤中。

現在のバージョンが1.0.0であり、現在の制約が^1.0.0の場合

新しいバージョン 1.2.0

パラメータ 新しい制約
increase ^1.2.0
increase-if-necessary ^1.0.0
widen ^1.0.0

新しいバージョン 2.0.0

パラメータ 新しい制約
increase ^2.0.0
increase-if-necessary ^2.0.0
widen >=1.0.0 <3.0.0

version updatesによるPRが作成されない

依存関係がany指定されている

  • anyはバージョン指定がないため、Dependabotが更新対象として正常に認識できないことがある
  • そもそもanyは非推奨
  • 1回flutter pub upgradeを実行して、pubspec.lockからバージョン番号を取得して再設定
pubspec.yaml
-  firebase_core: any
+  firebase_core: ^3.10.0
-  firebase_messaging: any
+  firebase_messaging: ^15.2.0
-  firebase_analytics: any
+  firebase_analytics: ^11.4.0

dependency_overridesの影響

Discussion