👏

GitHub App で Dependabot の自動 Approve & マージを行う

2024/01/11に公開

はじめに

こんにちは、たっつー ( @tatsutakein ) です。

Dependabot を利用した依存ライブラリの自動アップデート、便利ですよね。
2023年8月には グルーピング機能が追加 され、非常に使い勝手が良くなりました。

そんな Dependabot ですが、マイナーやパッチのアップデートを都度 Approve & マージするのは面倒です。
公式ドキュメントには Pull Requestの承認Pull Requestの自動マージを有効化する 方法が記載されていますが、PAT をあまり使用したくないというケースがあると思います。
そこで GitHub Apps を利用したいところですが、そのパターンについては特に明記されていません。
そのため、今回は GitHub Apps を利用して Dependabot の自動 Approve & マージを行う手順について記載してみます。

ゴール

以下の設定の GitHub リポジトリで動作することを目指します。

  • General
    • Allow auto-merge
  • Actions permissions
    • Workflow permissions
      • Read and write permissions
      • Allow GitHub Actions to create and approve pull requests
  • Branch protection rule
    • Require a pull request before merging
      • Require review from Code Owners
    • Require status checks to pass before merging
      • Status checks that are required.
        • check-frontend などの検証用ワークフロー
    • Restrict who can push to matching branches

内容

大きく 2 つの手順があります。

Create GitHub App Token のアクションを利用できる状態にする

Create GitHub App Token のアクションを利用するための手順です。

GitHub App の作成

こちらについては 公式ドキュメント を参照して作成するのが良いと思います。

権限は Pull Requestの承認Pull Requestの自動マージを有効化する で必要な以下の項目を設定します。

  • Contents ... Access: Read and write
  • Pull Requests ... Access: Read and write

作成した GitHub App のインストール

こちらも 公式ドキュメント を参照して進めるのが良いと思います。

リポジトリ ( または Organization ) の variables, secrets を設定する

App ID

作成した GitHub App の設定画面から以下の画像の部分の値を取得します。

App ID

リポジトリの設定画面から Security カテゴリ内の Secrets and variables > Actions から Variables を追加します。

Actions variables

Private key

作成した GitHub App の設定画面から以下の画像の部分の値を取得します。

Private key

リポジトリの設定画面から Security カテゴリ内の Secrets and variables > Dependabot から Secrets を追加します。

Dependabot secrets

Dependabot の自動 Approve & マージ

GitHub App の作成ができたらいよいよ自動 Approve & マージの設定をします。

ワークフローの追加

公式ドキュメント に沿いつつ Create GitHub App Token を利用した形に変更します。
if の条件がマイナー、パッチとなっていますので、適宜変更してお使いください 🙌

dependabot-auto-merge.yml
name: "Dependabot auto-merge"
on: pull_request

jobs:
  dependabot:
    runs-on: ubuntu-22.04
    if: github.actor == 'dependabot[bot]'
    steps:
      # https://github.com/marketplace/actions/create-github-app-token
      - name: Create GitHub App Token
        uses: actions/create-github-app-token@v1.6.2
        id: app-token
        with:
          app-id: ${{ vars.BOT_APP_ID }}
          private-key: ${{ secrets.BOT_PRIVATE_KEY }}

      # https://github.com/marketplace/actions/fetch-metadata-from-dependabot-prs
      - name: Dependabot metadata
        id: metadata
        uses: dependabot/fetch-metadata@v1.6.0
        with:
          github-token: "${{ steps.app-token.outputs.token }}"

      - name: Enable auto-merge for Dependabot PRs
        if: |
          steps.metadata.outputs.update-type == 'version-update:semver-patch' ||
          steps.metadata.outputs.update-type == 'version-update:semver-minor'
        run: |
          gh pr review --approve "$PR_URL"
          gh pr merge --auto --merge "$PR_URL"
        env:
          PR_URL: ${{ github.event.pull_request.html_url }}
          GH_TOKEN: ${{ steps.app-token.outputs.token }}

GitHub リポジトリ側の設定を追加

現状のまま動かすと Pull request User is not authorized for this protected branch (enablePullRequestAutoMerge) と言われてしまい、悲しい思いをします。

Pull request User is not authorized for this protected branch

そのため、追加した GitHub App を Branch protection rule の Restrict who can push to matching branches の対象に追加します。

Dependabot secrets

コードオーナ関連の設定

現状のまま動かすと Approve & 自動マージ状態にはなっているものの、GitHub App がコードオーナではないためマージされない状態になってしまっています。
そのため CODEOWNERS に 作成した GitHub App を追加してあげる必要があります。

.github/CODEOWNERS
* @tatsutakein @nito-bot[bot]

おわりに

以上で GitHub App が Dependabot の自動マージをしてくれるようになりました 🎉

少ないリポジトリであれば少しの手間で済むものの、複数のリポジトリを並行で見ていると地味に時間と手間が取られてしまうため自動化できてよかったです。

もしより良いやり方をご存じの方がいたらぜひ教えていただけると幸いです 🍀

参考リンク

GitHubで編集を提案

Discussion