くりにっき

フルスタックキュアエンジニアです

GitHub-native DependabotでもAuto mergeをやりたかった

tl;dr;

いくつかやり方はあるんだけどどれも一長一短で決定打はなかった

前置き

Dependabot Previewの終了がアナウンスされました。

github.blog

Auto-merge: We always recommend verifying your dependencies before merging them; therefore, auto-merge will not be supported for the foreseeable future. For those of you who have vetted your dependencies, or are only using internal dependencies, we recommend adding third-party auto-merge apps, or setting up GitHub Actions to merge.

と書いてるようにGitHub-native Dependabot(新しい方)ではAuto mergeがサポートされないようです。

Dependabot Preview(古い方)では automerged_updates を使ってたので本腰入れて調べてみました。

ちなみに自動マージをやりたいモチベーションは個人的な理由なので大抵の人には当てはまらないと思います。(20個以上の個人アプリでdependabotを入れてると大量にPRきた時にマージするだけでも大変だし一気にマージするとデプロイのqueueが詰まる(CircleCIのjobの同時実行数はアカウント単位)ので、開発系のライブラリや本番系のライブラリでもパッチバージョンのバージョンアップ時は自動マージを許したい)

GitHub Actionsでやる方法

https://github.com/marketplace?type=actions&query=dependabot+merge で調べてStar数の多いものや定期的に更新されてるものをピックアップしました

Dependabot Auto Merge

github.com

pull_requestイベントかpull_request_targetイベントで実行される。執筆時点での最新版は2.4.0

メリット

  • Dependabot Previewautomerged_updates 相当の設定がある
  • APIから @dependabot merge みたいなコメントをして実現してるのでGitHub-native Dependabotと100%の互換性がある

デメリット

  • 前述の仕様のためPersonal Access Token(PAT)が必要
    • publicリポジトリだけなら public_repo スコープだけでいいのでギリギリ許容できなくはないが、トークン漏洩時のリスクを考えるとなるべくスコープを狭くしたい
    • ためしにApp Tokenを使ってみたらコメント自体は成功したけどDependabot側でエラーになったので、おそらくPATのユーザにリポジトリのWrite権限があるかをチェックしてるように見える

f:id:sue445:20210504181545p:plain

備考

GitHub-native Dependabotの仕様としてpublicリポジトリのpull_requestイベントだとsecretsが取れないのでPATの受け渡しができずにエラーになるのでpull_request_targetイベントを使う必要があるのですが、pull_request_targetイベントだと今度はセキュリティリスクがあるので注意する必要があります。

github.com

https://github.com/ahmadnassri/action-dependabot-auto-merge/issues/60#issuecomment-806170152 みたいに github.actor でチェックするしかなさそう。

Merge me!

github.com

workflow_runイベントによって別のジョブの終了時に実行される。執筆時点での最新版は1.2.62

メリット

  • secrets.GITHUB_TOKEN が使える

デメリット

  • presetで DEPENDABOT_MINORDEPENDABOT_PATCH はあるものの現時点ではDependabot Previewほどの柔軟さはない
  • workflow_runの仕様上リポジトリ上はGitHub Actionsで統一していないと使えない
    • CircleCIのジョブ終了時にGitHub Actionsを発火させるのはできなくはないが大変そう

Dependabot Pull Request Action

github.com

scheduleイベントで定期実行する。執筆時点での最新版は1.0.0

メリット

  • secrets.GITHUB_TOKEN が使える

デメリット

  • 設定は豊富だが現時点ではDependabot Previewautomerged_updates を完全に置き換えるのは難しそう
  • dependabotを実行する時間にあわせてscheduleの時間も調整する必要がある
    • 寝てる間にいい感じにマージされていればいいのであれば雑に30分後とか1時間後にセットすればいいけど、そのラグが許容できないとストレスかも

番外編

Renovateを使う

github.com

Renovateであればauto merge対応してるのでDependabotから移行するのも1つの手なのだが、DependabotはGitHub公式という強みがあるので移行するかどうかはかなり悩ましい

docs.renovatebot.com

近況

手持ちのリポジトリ全部移行する前にDependabot Auto MergeとMerge me!を1リポジトリずつ入れて試験運用してみた結果、下記の理由でDependabot Auto Mergeを採用しました

  • PATを各リポジトリにコピペしてまわる手間はあるものの automerged_updates 対応してるのは強い
  • 手持ちのリポジトリだとCircleCIも使っているのでMerge me!が使えない