DependabotとMergifyで依存関係のアップデートからブランチへのマージまで自動化する
目的
- 依存関係を最新の状態に保つことによって、依存関係に起因する脆弱性などが含まれないようにしたい。
- 更新・検証・マージまで自動化することで依存関係の更新に費やす時間を減らしたい。
Dependabotについて
Dependabotはリポジトリが依存しているパッケージなどを最新の状態に保つために役立ちます。
Mergifyについて
Mergifyはリポジトリのコードマージを自動化するためのGitHubアプリケーションです。
やってみる
準備
今回はとりあえず create-react-app
してその依存関係を対象にしていきます。
npx create-react-app my-app
CIでのテスト用にnpm-scriptsも追加しておきましょう。
"scripts": {
"test:ci": "CI=true npm test",
},
Dependabotの設定ファイルを作成
DependabotはGitHubネイティブであるため、 .github
ディレクトリ内に dependabot.yml
を含めることで有効にできます。
また、Merigifyではプルリクエストに対し任意のアクションを実行するため、まずはプロジェクトの依存関係の更新とプルリクエスト作成を自動的に実行するようなDependabotの設定ファイルを作成します。
/.github/dependabot.yml
version: 2
updates:
# npm のバージョン更新を有効にする
- package-ecosystem: "npm"
# 「root」ディレクトリで「package.json」と「lock」ファイルを探す
directory: "/"
# npm レジストリの更新を毎日(平日)チェックする
schedule:
interval: "daily"
npmに限らず様々なパッケージマネージャに対応しているので、他の言語で使いたいよという方は公式の package-ecosystem から確認してみてください。
設定ファイルについての詳細はこちら
実行されることによって次のようにプルリクエストが作成されます。
また、Dependabot alertsが有効であれば脆弱性がある場合に通知を受け取ることも可能です。
このままでも十分便利ですが、プルリクエストのオートマージまでやってしまいましょう。
Mergifyをインストール
Mergifyは機能させるためにGitHubアカウントにMergifyをインストールする必要があります。
対象のリポジトリに対してアクセスを許可した後に、Mergifyのダッシュボードにリダイレクトされるはずです。
Mergifyの設定ファイルを作成
発行されたプルリクエストに対して任意のアクションを実行するためのルールを適用させます。
Dependabotに対応したexampleもありますので、そちらを参考にしていきます。
設定ファイルはルートから次のように配置することで認識されます。
- .mergify.yml
- .mergify/config.yml
- .github/mergify.yml
今回は次のようにルールを設定しておきます。
/.github/mergify.yml
pull_request_rules:
- name: automatic merge for Dependabot pull requests
# プルリクエストが特定のルールに一致しているか
conditions:
- author~=^dependabot(|-preview)\[bot\]$
- check-success=auto-merge-test
# プルリクエストがルールに一致している場合に実行されるアクション
actions:
# ベースのブランチにプルリクエストをマージ
merge:
method: merge
上記のルールではオートマージの対象を
- Dependabotが発行したプルリクエスト
-
auto-merge-test
という名前のジョブが完了している
を満たすものに限定しています。
conditionsの内容によっては関係のないプルリクエストまでマージしてしまう危険があるので、注意してください。
conditionsの詳細はこちら
Dependabotからプルリクエストを発行するまでは設定しましたが、検証のためのワークフローがないため、こちらも作成しておきます。
/.github/workflows/test.yml
name: Dependabot Auto Merge
on:
pull_request:
jobs:
auto-merge-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@master
with:
node-version: 14
- name: install dependencies
run: yarn
- name: test
run: yarn test:ci
- name: build
run: yarn build
動作確認
新しく設定したCIを動作させたいのですが、過去のプルリクエストにそれは適用されていません。
一度プルリクエストを閉じて、再度開きます。
正しくCIが実行され、Mergifyによる再評価とマージがされました。
今後Dependabotが発行したプルリクエストは自動的に検証や評価がされた後にマージされることになります。
まとめ
この記事ではDependabotに依存関係の更新とプルリクエストの発行、Mergifyにプルリクエストの検証とマージを任せることによって、常にリポジトリ内の依存関係を最新の状態に保てるようにしました。
Dependabotを使用し依存関係を最新に保つという記事自体は多くあり、手法も幅広いのですが、GitHubのPersonal Access Tokenが必要であったりとそれなりに手間がかかります。
拡張性もありますので、試しに使ってみるのも良いと思います。
この記事はIPFactory Advent Calendar 2021の12月9日分です。
IPFactoryというサークルについてはこちらをご覧ください.
昨日12月8日はfutabato先輩による「半教師あり学習について学ぶ」でした。
明日12月10日はヤッピーくんによる「AWS初心者がNodejsで作ったLineBotのインフラを構築してみた」です。お楽しみに。
Discussion