はじめに
GithubでDependabotを使っている人の多くがぶち当たる問題(だと思っている)
Dependabot更新多くね?問題
なるべく更新を自動化しようという気持ちであれこれ挑戦した記録です。
※やってることはGitHub ActionsでのDependabotの自動化とほぼ同じです
前提
- このプロジェクトはVue.jsとTypeScriptで構成
- linter、ユニットテスト、ビルドチェックが全てOKの場合マージ可能
- 1人以上のapproveがマージ可能条件に入っている
- プロジェクトのAuto merge機能をON
- Dependabot alertsもON
- dependabot.ymlで
cooldownのdefault-daysを設定(サプライチェーン攻撃対策)
オートマージの範囲
- パッチバージョンのアップデートであること
- マイナーバージョンのアップデートでdevDependenciesに設定されているライブラリであること
2つ目は本当に大丈夫なのか?という懸念もありますが、
- devDependenciesなので開発で問題が起こっても自分でどうにかできる
- 本番デプロイ前にE2Eテストも実行しているので本番でエラーが発生するなどは防げる
ということでオートマージ範囲に入れています。
CODEOWNERSの設定
元々はdependabot.ymlでreviewesの設定をしていましたが、2025年5月20日に廃止となりました。
そのため、CODEOWNERSでレビュワーの設定をしています。
が!!!!
オートマージの大問題として大前提の1人以上のapproveがマージ可能条件に入っていますが立ちはだかってきます。
CODEOWNERSで設定されたメンバーのみがレビュワーの場合、その人が承認しないといけません。
これではオートマージができない。
対応方法としては
CODEOWNERSにdependabot[bot]を入れちゃう
も考えたのですが、
package.jsonとpackage-lock.jsonのプルリクの場合はレビュワーを設定せず、GitHub Actionsでレビュワー設定をする
という作戦にしました。
ちなみにコード全体のレビュワー設定についても、元々は別のGihubub Actionsで設定していましたが、このタイミングで移行しちゃえ!ということでCODEOWNERSの設定に入れています。
# コード全体のレビュワー設定する
* @a-san @b-san @c-san
# package.jsonとpackage-lock.jsonはレビュワー設定をしない
package.json
package-lock.json
GitHub Actionsの設定
プルリクエストのopen時に動作するGithub Actionsでオートマージをします。
1段目のセクションでパッチバージョンを、2段目のセクションでマイナーバージョンをオートマージしています。
1つのifで実行してもよかったのですが、条件式長くなるので分けました。
見やすさ重視ということで。
3段目のセクションはオートマージしないプルリクエストについてレビュワーの設定をしています。
コメントを詳しめに書いていますが、これはCopilotさんにコード候補を表示してもらうためです。
Copilotさんいつもありがとうございます。
全体像はこんな感じ
name: Dependabot auto-merge
on:
pull_request:
types:
- opened
permissions:
pull-requests: write # approve/merge に必要
contents: write # merge に必要
repository-projects: write # project に必要
jobs:
dependabot-automation:
runs-on: ubuntu-latest
if: github.actor == 'dependabot[bot]'
# dependabotのPRのみ実行
steps:
- name: Dependabot metadata
id: metadata
uses: dependabot/fetch-metadata@v2
with:
github-token: '${{ secrets.GITHUB_TOKEN }}'
- name: Merge pull request patch update
if: steps.metadata.outputs.update-type == 'version-update:semver-patch'
# パッチバージョンのアップデートかつマージ条件に合致する場合はマージ(マージルールに則り実行される)
run: |
gh pr review --approve "$PR_URL"
gh pr edit "$PR_URL" -t "(auto merged) $PR_TITLE"
gh pr merge --auto --merge "$PR_URL"
env:
PR_URL: ${{ github.event.pull_request.html_url }}
PR_TITLE: ${{ github.event.pull_request.title }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Merge pull request minor update by devDependencies
if: steps.metadata.outputs.update-type == 'version-update:semver-minor' && steps.metadata.outputs.dependency-type == 'direct:development'
# マイナーバージョンのアップデートかつdevDependenciesのアップデートの場合はマージ(マージルールに則り実行される)
run: |
gh pr review --approve "$PR_URL"
gh pr edit "$PR_URL" -t "(auto merged) $PR_TITLE"
gh pr merge --auto --merge "$PR_URL"
env:
PR_URL: ${{ github.event.pull_request.html_url }}
PR_TITLE: ${{ github.event.pull_request.title }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Set Reviewer
# メジャーアップデートまたはdependenciesのマイナーアップデートの場合はレビュワー設定
if: ${{ (steps.metadata.outputs.update-type == 'version-update:semver-minor' && steps.metadata.outputs.dependency-type != 'direct:development') || steps.metadata.outputs.update-type == 'version-update:semver-major' }}
uses: actions/github-script@v6
with:
script: |
const reviewers = ["a-san", "b-san", "c-san"];
const { number, user } = context.payload.pull_request;
await github.rest.pulls.requestReviewers({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: number,
reviewers: reviewers.filter(function(target) {
return target != user.login;
})
});
これでパッチバージョン、devDependenciesのマイナーバージョンはオートマージされるようになりました!
やったね!
オートマージでなにか変わった?
プルリクエストの一覧がDependabotのプルリクエストで埋まることがなくなったのですっきりしました。
devDependenciesのマイナーバージョンのアップデートが多かったんだなぁという印象です。
もっとオートマージしてほしい
メジャーアップデートまで自動化させたい気持ちはあります。
AIでアップデートの内容検証と必要なところ修正してもらって、E2EのテストをGithub Actionsに組み込んだらできそうな気がしますが…といったところです。
誰かやってみてほしい。もうやってるかもだけど。