1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Dependabotのマージをできるだけ自動でやってもらう

Last updated at Posted at 2025-12-09

はじめに

GithubでDependabotを使っている人の多くがぶち当たる問題(だと思っている)

Dependabot更新多くね?問題

なるべく更新を自動化しようという気持ちであれこれ挑戦した記録です。

※やってることはGitHub ActionsでのDependabotの自動化とほぼ同じです

前提

  • このプロジェクトはVue.jsとTypeScriptで構成
  • linter、ユニットテスト、ビルドチェックが全てOKの場合マージ可能
  • 1人以上のapproveがマージ可能条件に入っている
  • プロジェクトのAuto merge機能をON
  • Dependabot alertsもON
  • dependabot.ymlでcooldowndefault-daysを設定(サプライチェーン攻撃対策)

オートマージの範囲

  1. パッチバージョンのアップデートであること
  2. マイナーバージョンのアップデートで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に組み込んだらできそうな気がしますが…といったところです。
誰かやってみてほしい。もうやってるかもだけど。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?