はじめに

Dependabot とは、GitHubが提供するセキュリティツールです。リポジトリの依存関係を監視し、脆弱性のあるパッケージや古いバージョンを検知して自動でプルリクエストを作成してくれます。

実際に Dependabot を使って、脆弱性のあるパッケージを自動アップデートしてみましょう。 まずは、dependabot の設定ファイルを以下のように作ってみます。

version: 2
updates:
  # Enable version updates for npm
  - package-ecosystem: "npm"
    directory: "/"
    # Check the npm registry for updates at 09:00 JTC 00:00 UTC on Monday
    schedule:
      interval: "weekly"
      day: "monday"
      time: "00:00"
    open-pull-requests-limit: 5

    # Add labels to pull requests
    labels:
      - "dependencies"
      - "npm"

  # Enable version updates for GitHub Actions
  - package-ecosystem: "github-actions"
    directory: "/"
    # Check for updates at 09:00 JTC (00:00 UTC) on Monday
    schedule:
      interval: "weekly"
      day: "monday"
      time: "00:00"
    open-pull-requests-limit: 3

    # Add labels to pull requests
    labels:
      - "dependencies"
      - "github-actions"

# Assign Dependabot as a reviewer for consistency
assignees:
  - "dependabot[bot]"

reviewers:
  - "dependabot[bot]"

これで、Dependabot によって PR が自動で作成されるようになります。 この段階だと PR が作成されるだけなので、手動でPRをマージする必要があります。 これを自動化するため、GitHub Actions で自動マージされるように設定します。

name: Dependabot auto-merge
on: pull_request_target

permissions:
  pull-requests: write
  contents: write

jobs:
  dependabot:
    runs-on: ubuntu-latest
    if: ${{ github.actor == 'dependabot[bot]' }}
    steps:
      - name: Dependabot metadata
        id: metadata
        uses: dependabot/fetch-metadata@v2
      - name: Enable auto-merge for Dependabot PRs
        if: ${{steps.metadata.outputs.update-type == 'version-update:semver-patch'}}
        run: gh pr merge --auto --merge "$PR_URL"
        env:
          PR_URL: ${{github.event.pull_request.html_url}}
          GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}

ポイントは、

  • dependabot が作成した PR のみ対象とする
    • if: ${{ github.actor == 'dependabot[bot]' }}
  • アップデート対象が patch の場合のみ自動マージする
    • if: ${{steps.metadata.outputs.update-type == 'version-update:semver-patch'}}

です。アップデート対象について、他には version-update:semver-minor, version-update:semver-major が指定可能です。

なお、pull_request_target は、pull_requst イベントが PR ブランチのワークフローを実行するのに対し、こちらはベースブランチのワークフローを実行するイベントになります。PRで悪意のあるCIワークフローが実行されないよう、public リポジトリではこちらのイベントを利用するべきでしょう。

このままだとバージョンアップによってビルドやテストがコケても自動マージしてしまいます。

対象のリポジトリのページから、 Settings > Rules > Rulesets > New ruleset から新規のルールを作成します。 以下の Require status checks to pass にチェックをつけましょう。

  • Require branches to be up to date before merging
    • マージする前にブランチを最新化します。
    • このチェックがない場合、「PRが作成された時点のコードではテストが通るが、デフォルトブランチの最新コードではテストが通らない」ケースを検知できません。チェックしておくべきでしょう。
  • Do not require status checks on creation
    • ブランチ(や PR)が作られた時点では、ステータスチェックを必須にしない、というものです。
    • push 後にしか CI が動かないケースなど、ステータスチェックの制限によってPRがマージができないことを防ぐためのオプションです。

おわりに

Dependabot は、非常に便利なツールです。脆弱性の早期発見とパッケージの定期的なアップデートを自動化することで、セキュリティと保守性を大幅に向上させることができます。

無料で簡単に使えるツールなので、ぜひ積極的にご利用ください。