GitHub Dependabotのtarget-branchオプション指定時の動作を確認してみた

想定していた動作を確認することはできませんでした
2022.12.22

こんにちは、CX事業本部 IoT事業部の若槻です。

GitHub Dependabotのドキュメントを見ているとtarget-branchというオプションを見つけました。

By default, Dependabot checks for manifest files on the default branch and raises pull requests for version updates against this branch. Use target-branch to specify a different branch for manifest files and for pull requests. When you use this option, the settings for this package manager will no longer affect any pull requests raised for security updates.

(日本語訳)
デフォルトでは、Dependabot はデフォルト ブランチのマニフェスト ファイルをチェックし、このブランチに対してバージョン更新のプル リクエストを発行します。マニフェスト ファイルとプル リクエストに別のブランチを指定するには、target-branch を使用します。このオプションを使用すると、このパッケージ マネージャーの設定は、セキュリティ アップデートのために発生したプル リクエストに影響しなくなります。

この記述だけだと私はtarget-branchの指定により何ができるのか分かりそうで分かりませんでした。

そこで次の観点を確認するために実際に動作を確認してみました。

  • デフォルト以外のブランチ上のマニフェストファイルをアップデートの検出対象に指定できる?
  • 自動作成されるPull Requestのマージ先に任意のブランチを指定できる?
  • alertおよびsecurity updatesの動作はどうなる?

確認してみた

デフォルトブランチのみがスキャン対象となる

まず前提として、Dependabotではデフォルトブランチのみがスキャン対象となる仕様を確認してみます。

GitHubででRepositoryを新規作成してローカルにCloneします。

脆弱性を含んだバージョンのnpmライブラリをインストールします。

# 重要性criticalの脆弱性が検出されている
$ npm url-parse@0.0.0

added 1 package, and audited 2 packages in 885ms

1 critical severity vulnerability

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.

# gitignore
touch .gitignore
echo /node_modules > .gitignore

Dependabotのコンフィグを作成します。この時点ではtarget-branchは未指定とします。

mkdir .github
touch .github/dependabot.yml

.github/dependabot.yml

version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "daily"
    open-pull-requests-limit: 1

mainブランチをコミットしてプッシュします。

git add . && git commit -m "init" && git push origin HEAD

次にmainからチェックアウトしたdevelopブランチを操作します。

git checkout -b develop

脆弱性を含まないバージョンのnpmライブラリをインストールします。

$ npm i url-parse@latest

developブランチをコミットしてプッシュします。

git add . && git commit -m "init develop" && git push origin HEAD

デフォルトブランチをmainからdevelopに変更します。

Security Updatesを有効化します。

この時点でalertsは発生していません。

これで、Dependabotではデフォルトブランチのみがスキャン対象となる仕様を確認できました。

デフォルト以外のブランチでalertsが発生するか確認してみた(発生しなかった)

続いて、target-branchにデフォルト以外のブランチを指定時にalertsが発生するか確認してみます。

mainおよびdevelopブランチの両方で、コンフィグファイルでtarget-branchにデフォルトでないブランチmainを指定します。

.github/dependabot.yml

version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "daily"
    open-pull-requests-limit: 1
    target-branch: "main"

上記変更をプッシュしましたが、alertsは発生しませんでした。

どうやらtarget-branchを指定してもデフォルト以外のブランチ上のマニフェストファイルをアップデートの検出対象に指定できるわけではないようです。

自動作成されたPRのマージ先を指定できるのか確認してみた(指定できなかった)

続いて、自動作成されたPRのマージ先をtarget-branchで指定できるのか確認してみます。

デフォルトブランチをmainに変更します。

するとalertsが発生し、メール通知も来ました。

自動で作成されたPull Requestを見てみると、この時点ではマージ先がmainとなっています。

ここで、mainブランチのコンフィグファイルでtarget-branchdevelopを指定します。

.github/dependabot.yml

version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "daily"
    open-pull-requests-limit: 1
    target-branch: "develop"

脆弱性を含んだバージョンのnpmライブラリをインストールします。

$ npm i axios@0.21.1

added 2 packages, removed 2 packages, changed 1 package, and audited 4 packages in 1s

1 package is looking for funding
  run `npm fund` for details

2 vulnerabilities (1 high, 1 critical)

変更をプッシュすると、alertsが発生しました。

自動作成されたPRを見るとマージ先はmainとなっています。

target-branchを指定しても自動作成されるPull Requestのマージ先に任意のブランチを指定できる動作とはなりませんでした。

おわりに

GitHub Dependabotのtarget-branchオプション指定時の動作を確認してみました。

target-branchオプションを指定すれば、デフォルトとしている開発ブランチではなく、リリースブランチでもsecurity updatesによる脆弱性検出ができることを期待していたのですが、残念ながらそのような動作は確認できませんでした。

target-branchの正しい使い方や仕様をご存知の方がいたら教えて頂ければと思います。

参考

以上