GitHub App で Dependabot の自動 Approve & マージを行う
はじめに
こんにちは、たっつー ( @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
- Workflow permissions
- 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 などの検証用ワークフロー
- Status checks that are required.
- Restrict who can push to matching branches
-
Require a pull request before merging
内容
大きく 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 の設定画面から以下の画像の部分の値を取得します。
リポジトリの設定画面から Security カテゴリ内の Secrets and variables > Actions から Variables を追加します。
Private key
作成した GitHub App の設定画面から以下の画像の部分の値を取得します。
リポジトリの設定画面から Security カテゴリ内の Secrets and variables > Dependabot から Secrets を追加します。
Dependabot の自動 Approve & マージ
GitHub App の作成ができたらいよいよ自動 Approve & マージの設定をします。
ワークフローの追加
公式ドキュメント に沿いつつ Create GitHub App Token を利用した形に変更します。
if の条件がマイナー、パッチとなっていますので、適宜変更してお使いください 🙌
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)
と言われてしまい、悲しい思いをします。
そのため、追加した GitHub App を Branch protection rule の Restrict who can push to matching branches
の対象に追加します。
コードオーナ関連の設定
現状のまま動かすと Approve & 自動マージ状態にはなっているものの、GitHub App がコードオーナではないためマージされない状態になってしまっています。
そのため CODEOWNERS に 作成した GitHub App を追加してあげる必要があります。
* @tatsutakein @nito-bot[bot]
おわりに
以上で GitHub App が Dependabot の自動マージをしてくれるようになりました 🎉
少ないリポジトリであれば少しの手間で済むものの、複数のリポジトリを並行で見ていると地味に時間と手間が取られてしまうため自動化できてよかったです。
もしより良いやり方をご存じの方がいたらぜひ教えていただけると幸いです 🍀
Discussion