👷

DependabotとMergifyで依存関係のアップデートからブランチへのマージまで自動化する

2021/12/06に公開

目的

  • 依存関係を最新の状態に保つことによって、依存関係に起因する脆弱性などが含まれないようにしたい。
  • 更新・検証・マージまで自動化することで依存関係の更新に費やす時間を減らしたい。

Dependabotについて

https://docs.github.com/en/code-security/supply-chain-security/managing-vulnerabilities-in-your-projects-dependencies/about-dependabot-security-updates

https://github.blog/2020-06-01-keep-all-your-packages-up-to-date-with-dependabot/

Dependabotはリポジトリが依存しているパッケージなどを最新の状態に保つために役立ちます。

Mergifyについて

https://mergify.com/

Mergifyはリポジトリのコードマージを自動化するためのGitHubアプリケーションです。

やってみる

準備

今回はとりあえず create-react-app してその依存関係を対象にしていきます。

npx create-react-app my-app

CIでのテスト用にnpm-scriptsも追加しておきましょう。

"scripts": {
    "test:ci": "CI=true npm test",
  },

Dependabotの設定ファイルを作成

https://docs.github.com/ja/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/enabling-and-disabling-version-updates?learn=dependency_version_updates

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もありますので、そちらを参考にしていきます。

https://docs.mergify.com/examples/#bots

設定ファイルはルートから次のように配置することで認識されます。

  • .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先輩による「半教師あり学習について学ぶ」でした。
https://01futabato10.hateblo.jp/entry/2021/12/08/234305

明日12月10日はヤッピーくんによる「AWS初心者がNodejsで作ったLineBotのインフラを構築してみた」です。お楽しみに。

Discussion