[注意] Dependabot v2 は再帰的に見ません
まず、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