Skip to main content

Dependabot バージョン更新プログラムに合わせて pull request の作成を最適化する

Dependabot の pull request を合理化し、効率的に管理する方法について説明します。

この機能を使用できるユーザーについて

Users with write access

Dependabot の既定では、新しい pull request が開かれ、各依存関係が更新されます。 セキュリティ更新プログラムを有効にすると、脆弱な依存関係が見つかったときに新しい pull request が開かれます。 1 つ以上のエコシステムのバージョン更新プログラムを構成すると、依存関係の新しいバージョンがリリースされたときに、dependabot.yml ファイルに定義されている頻度で新しい pull request が開かれます。

プロジェクトに多くの依存関係がある場合、レビューとマージが必要な Dependabot の pull request が非常に多くなり、すぐに管理が困難になる可能性があります。

Dependabot の更新 pull request をプロセスに合わせて最適化するには、実装できるカスタマイズ オプションがいくつかあります。次に例を示します。

  • Dependabot で schedule を使って依存関係の新しいバージョンをチェックする頻度を制御します
  • groups を使って、重要なプログラムを優先します

依存関係の更新の頻度とタイミングを制御する

構成ファイルに設定した頻度で、Dependabot によってバージョン更新プログラムのチェックが実行されます (必須フィールド schedule.interval は、dailyweekly、または monthly に設定する必要があります)。

Dependabot の既定では、依存関係の更新をチェックして pull request を生成するランダムな時間を割り当てることで、ワークロードが分散されます。

ただし、気が散らないようにするため、またはバージョン更新プログラムを確認して対処するために時間とリソースをより適切に整理するには、頻度とタイミングを変更すると便利な場合があります。 たとえば、Dependabot で、更新プログラムのチェックを毎日ではなく毎週実行し、チームのトリアージ セッションの前に pull request が確実に生成されるようにすることもできます。

schedule をオプションと組み合わせて使うと、Dependabot によるバージョン更新プログラムのチェック頻度とタイミングを変更できます

次の dependabot.yml ファイル例では、npm 構成を変更して、Dependabot が毎日日本標準時間 02:00 (UTC +09:00) に npm 依存関係のバージョン更新プログラムをチェックするように指定しています。

YAML
# `dependabot.yml` file with
# customized schedule for version updates

version: 2
updates:
  # Keep npm dependencies up to date
  - package-ecosystem: "npm"
    directory: "/"
    # Check the npm registry every week on Tuesday at 02:00 Japan Standard Time (UTC +09:00)
    schedule:
      interval: "weekly"
      day: "tuesday"
      time: "02:00"
      timezone: "Asia/Tokyo"

schedule」も参照してください。

重要な更新プログラムを優先する

groups を使うと、複数の依存関係の更新を 1 つの pull request に統合できます。 こうすることで、リスクの高い更新プログラムにレビュー時間を集中させ、マイナー バージョン更新プログラムのレビューに費やす時間を最小限に抑えることができます。 たとえば、開発の依存関係に対するマイナーまたはパッチ更新プログラムの更新プログラムを 1 つの pull request に結合し、コードベースの主要領域に影響を与えるセキュリティまたはバージョン更新プログラムを担当する専用グループを用意することができます。

個々のパッケージ エコシステムごとにグループを構成する必要があります。その後、次の条件の組み合わせを使って、パッケージ エコシステムごとに複数のグループを作成できます。

  • 依存関係の種類: dependency-type
  • 依存関係の名前: patternsexclude-patterns
  • セマンティック バージョニング レベル: update-types

各条件でサポートされているすべての値を確認するには、「groups」を参照してください。

条件を使って依存関係のグループを作成する複数の方法の例を次に示します。

例 1: 3 つのバージョン更新プログラム グループ

この例では、dependabot.yml ファイルは次のようになります。

  • "production-dependencies"、"development-dependencies"、"rubocop" という 3 つのグループを作成します。
  • patternsdependency-type を使って、グループに依存関係を含めます。
  • exclude-patterns を使って、グループから 1 つの依存関係 (または複数の依存関係) を除外します。
version: 2
updates:
  # Keep bundler dependencies up to date
  - package-ecosystem: "bundler"
    directory: "/"
    schedule:
      interval: "weekly"
    groups:
      production-dependencies:
        dependency-type: "production"
      development-dependencies:
        dependency-type: "development"
        exclude-patterns:
          - "rubocop*"
      rubocop:
        patterns:
          - "rubocop*"

その結果、次のような影響が出ています。

  • バージョン更新プログラムは依存関係の種類ごとにグループ化されます。
  • パターン rubocop* と一致する開発依存関係は、development-dependencies グループから除外されます。
  • 代わりに、rubocop* と一致する開発依存関係が rubocop グループに含まれます。 順序付けにより、rubocop* と一致する運用依存関係は production-dependencies グループに含まれます。

例 2: 依存関係が除外された、グループ化された更新プログラム

この例では、dependabot.yml ファイルは次のようになります。

  • カスタマイズされた Bundler 構成の一部として、"support-dependencies" というグループを作成します。
  • 1 つの依存関係 (または複数の依存関係) の名前と一致する patterns を使って、グループに依存関係を含めます。
  • 1 つの依存関係 (または複数の依存関係) の名前と一致する exclude-patterns を使って、グループから依存関係を除外します。
version: 2
updates:
  # Keep bundler dependencies up to date
  - package-ecosystem: "bundler"
    directory: "/"
    schedule:
      interval: "weekly"
    # Create a group of dependencies to be updated together in one pull request
    groups:
      # Specify a name for the group, which will be used in pull request titles
      # and branch names
      support-dependencies:
        # Define patterns to include dependencies in the group (based on
        # dependency name)
        patterns:
          - "rubocop" # A single dependency name
          - "rspec*"  # A wildcard string that matches multiple dependency names
          - "*"       # A wildcard that matches all dependencies in the package
                      # ecosystem. Note: using "*" may open a large pull request
        # Define patterns to exclude dependencies from the group (based on
        # dependency name)
        exclude-patterns:
          - "gc_ruboconfig"
          - "gocardless-*"

その結果、次のような影響が出ています。

  • Bundler の依存関係の大部分は、ワイルドカード ("*") パターンにより、support-dependencies グループに統合されます
  • gc_ruboconfiggocardless-* と一致する依存関係はグループから除外され、Dependabot により、これらの依存関係に対して 1 つの pull request が引き続き生成されます。 これが役立つのは、これらの依存関係の更新プログラムを詳細に確認する必要がある場合です。
  • support-dependencies の場合、バージョン更新プログラムに対してのみ、Dependabot によって pull request が生成されます。

例 3: メジャー更新プログラムの個別の pull request と、マイナーまたはパッチ更新プログラムのグループ化

この例では、dependabot.yml ファイルは次のようになります。

  • "angular" というグループを作成します。
  • 依存関係の名前と一致する patterns を使って、グループに依存関係を含めます。
  • update-type を使って、グループに minor または patch の更新プログラムのみを含めます。
version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"
    groups:
      # Specify a name for the group, which will be used in pull request titles
      # and branch names
      angular:
        patterns:
          - "@angular*"
        update-types:
          - "minor"
          - "patch"

その結果、次のような影響が出ています。

  • マイナーまたはパッチ更新プログラムがあるすべての Angular 依存関係に対して、Dependabot によってグループ化された pull request が作成されます。
  • すべてのメジャー更新プログラムは引き続き個別の pull request として生成されます。

例 4: マイナーまたはパッチ更新プログラムのグループ化された pull request と、メジャー更新プログラムの pull request なし

この例では、dependabot.yml ファイルは次のようになります。

  • "angular" と "minor-and-patch" という 2 つのグループを作成します。
  • 両方のグループの minor または patch の更新プログラムのみを含めるには、update-type を使います。
  • @angular* パッケージの major バージョンへの更新プログラムを除外するには、ignore 条件を使います。
version: 2
updates:
  # Keep npm dependencies up to date
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"
    groups:
      angular:
        patterns:
          - "@angular*"
        update-types:
          - "minor"
          - "patch"
    ignore:
      - dependency-name: "@angular*"
        update-types: ["version-update:semver-major"]

その結果、次のような影響が出ています。

  • Angular 依存関係のマイナーおよびパッチ バージョン更新プログラムは、1 つの pull request にグループ化されます。
  • Angular 依存関係のマイナーおよびパッチのセキュリティ更新プログラムも、1 つの pull request にグループ化されます。
  • Angular のメジャー更新プログラムに対しては、Dependabot によって自動的に pull request は開かれません。