dependabotを導入してバージョン更新を自動化してみた
今まで、バージョン更新を手動でしていましたが、忙しくて放置しても問題ないように自動化してみました
目次
dependabotとは

- dependabotはGitHubが公式に提供するサービス
- リポジトリ内の依存関係の修正を容易にするサービス
- 依存関係内の脆弱性を検知してアラートする
- 既知の脆弱性を持つ依存関係を修正版へ更新するプルリクエストを自動作成する
- 依存関係を最新の状態に保つためのプルリクエストを自動作成する
今回は、この3つ目の機能とgithub actionsを組み合わせて、バージョン更新の自動化を目指します。
dependabotを導入する
バージョン更新を行うプルリクエストを作成する場合はWeb上で操作は不要で、
プロジェクトのルートに.github/dependabot.ymlを置くだけでよいです。
version: 2
updates:
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "weekly" #毎週実行
open-pull-requests-limit: 10 # 同時に作成できるプルリクは10個までプルリクエストを自動承認するgithub actionsを作成する
github actionsはgithub上の特定の条件(pushなど)を満たした際に、処理を自動実行する仕組みです。 dependabot自身がマージまで行うわけではないので、マージの自動化を行うにはgithub actionsと併用します。
個人開発なので、メジャーバージョンアップ以外は全自動でマージを行い、メジャーバージョンアップは自動マージをしない方針で ymlを作りました。
name: Dependabot auto-merge
on: pull_request
permissions:
contents: write
pull-requests: write
jobs:
auto-merge:
if: github.actor == 'dependabot[bot]'
runs-on: ubuntu-latest
steps:
- name: Dependabotのメタデータを取得
id: metadata
uses: dependabot/fetch-metadata@v2
with:
github-token: "${{ secrets.GITHUB_TOKEN }}"
- name: patch/minor更新のみ自動マージを有効化
if: |
steps.metadata.outputs.update-type == 'version-update:semver-patch' ||
steps.metadata.outputs.update-type == 'version-update:semver-minor'
run: gh pr merge --auto --squash "$PR_URL"
env:
PR_URL: ${{ github.event.pull_request.html_url }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}if: github.actor == 'dependabot[bot]'
上記で、プルリクエストの作成者がbotの場合はマージしてよいかを判定します。 githubはこの利用方法について、詳しく解説しています。
テストを通過したらマージを許可するルールの追加
このブログは、型チェックなどをしてからデプロイするようにしています。 この型チェックを通過した場合にdependabotのマージを許可するルールを追加します。
ここで使用している型チェックやテストのjob名はbuildと宣言しています。
Rulesetsを追加する
リポジトリの設定画面より、Rulesetsを追加します。

Require status checks to passを設定する
Require status checks to passは指定したステータスチェック(CIなど)が成功していないと、そのブランチへのマージを禁止するという意味です。

ここで私が使用している、github actionsのjobであるbuildを指定します。
バージョン更新で型エラーやnpm run buildに失敗したら、マージを停止してくれるようになります。
buildと入力するとjob完了のステータスを正しく検知できず、全てのプルリクが止まってしまいました。
検索欄に出てくる候補を押下する必要があるようです。なんとなく、環境変数や参照する値って手打ちすることが多い印象があって、ちょっとハマりかけました。
dependabot.ymlをリモートにプッシュ
リモートリポジトリにymlを上げると自動で依存関係を調査してくれます。 そして古くなった依存関係を更新するプルリクエストの作成&マージまで完了してくれます!
これはとても便利ですね、もう少し早くやっておけばよかったです。

肝心のメジャーバージョンアップは...

しっかり止まってますね。 メジャーバージョンアップは適宜調べて自分でマージするか判断するようにしていく運用ができそうです。
まとめ
今回は、dependabotを利用してブログで利用しているライブラリや依存関係の更新を自動化しました。 ステータスチェックのjob名は手打ちせず、検索候補から選択するようにしましょう。
書きたい記事溜まっているので、どんどん書いていきたいですね。ではまた。