🤖

[注意] Dependabot v2 は再帰的に見ません

2022/02/26に公開

まず、Dependabotが何なのかを軽く説明します。

パッケージマネージメントツールやDockerなどの依存関係の更新管理を行うGitHubが提供するツールです。
主に脆弱性対応のセキュリティアップデートを行うためのDevSecOpsツールとなります。
脆弱性のある依存関係の管理について(GitHub公式日本語ページ)

本記事は、そのDependabotで見落とされがちなことを注意喚起の意味を含めて書くことを目的としています。

それでは本題に移ります。
タイトルがすべてを物語っているのですが、Dependabot v2は再帰的に見てくれません。

どういうことかというと、Dependabotはpackage-ecosystem でパッケージ管理ツール名を指定し、directory で場所を指定します。
その時、"/" と書くことが多いと思います。そして期待するのはそこから下すべてのgo.modを管理していくれることですが、実際には指定したパスのディレクトリ以外は無視されます。
次のとおりです。

例: 複数階層のディレクトリにgo.modがある場合にどうなるか

 % find . -name go.mod
./go.mod
./tools/go.mod

上記のように別のディレクトリにgo.modがあるとします。
そして.github/dependabot.ymlが次のようになっていたとします。

version: 2
updates:
  - package-ecosystem: "gomod"
    directory: "/"
    schedule:
      interval: "weekly"
      day: "monday"
      time: "09:00"
      timezone: Asia/Tokyo
    commit-message:
      prefix: "change"
      include: "scope"
    labels:
      - "dependabot"
    target-branch: "dependabot/release"

directory: "/" で再帰的に見てくれることを期待しますが、見てくれません。
tools/go.mod は対象にならないということです。

確認

それでは数ヶ月以上運用した複数のリポジトリでgit logを使って、それぞれのディレクトリにあるgo.modとgo.sumはDependabotからのPRがあるかを確認します。

 % git log --pretty="%an" --author='dependabot' go.(mod|sum) | sort | uniq
dependabot-preview[bot]
dependabot[bot]

/ に該当するgo.mod, go.sumはDependabotがauthorのgit commitが見つかります。
ということは正常にDependabot PRが来ていることになります。

続いてtools/go.mod はどうでしょうか。

 % git log --pretty="%an" --author='dependabot' tools/go.(mod|sum) | sort | uniq

結果は0件です。
よって、Dependabotは再帰的に見ておらず、依存関係のパッケージが更新されていないことになります。

解決方法

directory: "tools/" の分を丸ごと追記することで解決します。

version: 2
updates:
  - package-ecosystem: "gomod"
    directory: "/"
    schedule:
      interval: "weekly"
      day: "monday"
      time: "09:00"
      timezone: Asia/Tokyo
    commit-message:
      prefix: "change"
      include: "scope"
    labels:
      - "dependencies"
      - "dependabot"
    target-branch: "dependabot/release"
  - package-ecosystem: "gomod"
    directory: "tools/"
    schedule:
      interval: "weekly"
      day: "monday"
      time: "09:00"
      timezone: Asia/Tokyo
    commit-message:
      prefix: "change"
      include: "scope"
    labels:
      - "dependabot"
    target-branch: "dependabot/release"

その後、これをmergeしたあとに指定したscheduleに合わせて次回のDependabot PRが来ます。
その際に対象が増えていることを確認してください。先程のgit logコマンドを使っても確認が出来ると思います。


補足

以下の書き方はできません。
ご注意ください。

  directory:
    - "/"
    - "tools/"

Discussion