Skip to main content

GitHub ActionsでのDependabotの自動化

GitHub Actionsを使って一般的なDependabot関連のタスクを自動化する例。

この機能を使用できるユーザー

People with write permissions to a repository can configure GitHub Actions to respond to Dependabot-created pull requests.

Dependabot及びGitHub Actionsについて

Dependabotは、依存関係を最新に保つためのPull Requestを作成します。GitHub Actionsを使って、それらのPull Requestが作成されたときに自動化されたタスクを実行できます。 たとえば、追加の成果物のフェッチ、ラベルの追加、テストの実行、あるいはPull Requestの変更ができます。

イベントへの応答

Dependabot は、pull request とコメントで GitHub Actions ワークフローをトリガーできます。ただし、特定のイベントは異なる方法で処理されます。

pull_requestpull_request_reviewpull_request_review_commentpushcreatedeployment、および deployment_status イベントを使い Dependabot によって開始されるワークフロー (github.actor == 'dependabot[bot]') の場合、次の制限が適用されます。

  • GITHUB_TOKEN は、既定で読み取り専用のアクセス許可を持ちます。
  • シークレットは、Dependabot シークレットから設定されます。 GitHub Actions シークレットは使用できません。

pull_request_target イベントを使い Dependabot によって開始されたワークフロー (github.actor == 'dependabot[bot]') については、pull request のベース参照が Dependabot によって作成された場合 (github.actor == 'dependabot[bot]')、GITHUB_TOKEN は読み取り専用であり、シークレットは使用できません。

これらの制限は、ワークフローが別のアクターによって再実行された場合でも適用されます。

詳細については、「GitHub Actions およびワークフローのセキュリティ保護の維持: pwn 要求の阻止」を参照してください。

GITHUB_TOKEN アクセス許可の変更

既定では、Dependabot によってトリガーされる GitHub Actions ワークフローでは、読み取り専用のアクセス許可を持つ GITHUB_TOKEN を取得します。 ワークフローで permissions キーを使用すると、トークンのアクセスを増やすことができます。

name: CI
on: pull_request

# Set the access for individual scopes, or use permissions: write-all
permissions:
  pull-requests: write
  issues: write
  repository-projects: write
  ...

jobs:
  ...

詳しくは、「自動トークン認証」を参照してください。

シークレットへのアクセス

Dependabot イベントでワークフローがトリガーされる場合、ワークフローで使用できるシークレットは Dependabot シークレットのみです。 GitHub Actions シークレットは使用できません。 そのため、Dependabot イベントによってトリガーされるワークフローで使用されるシークレットは、Dependabot シークレットとして格納する必要があります。 詳しくは、「Dependabot のプライベート レジストリへのアクセスの構成」を参照してください。

Dependabot シークレットは secrets コンテキストに追加され、GitHub Actions のシークレットとまったく同じ構文を使用して参照されます。 詳しくは、「GitHub Actions でのシークレットの使用」を参照してください。

Dependabot や他のアクターによってトリガーされるワークフローがある場合、最もシンプルな解決策は、アクションで、および同じ名前を持つ Dependabot シークレットで必要なアクセス許可を持つトークンを格納することです。 その後、ワークフローには、これらのシークレットへの 1 回の呼び出しを含めることができます。 Dependabot のシークレットの名前が異なる場合は、条件を使用して、使用するアクターごとに適切なシークレットを指定します。 条件を使用する例については、以下の一般的な自動化に関するセクションを参照してください。

ユーザー名とパスワードを使用して AWS 上のプライベート コンテナー レジストリにアクセスするには、ワークフローに usernamepassword のシークレットを含める必要があります。 次の例では、Dependabot によってワークフローがトリガーされると、READONLY_AWS_ACCESS_KEY_ID および READONLY_AWS_ACCESS_KEY という名前を持つ Dependabot シークレットが使用されます。 別のアクターでワークフローがトリガーされる場合は、それらの名前を持つアクション シークレットが使用されます。

name: CI
on:
  pull_request:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Login to private container registry for dependencies
        uses: docker/login-action@v2
        with:
          registry: https://1234567890.dkr.ecr.us-east-1.amazonaws.com
          username: ${{ secrets.READONLY_AWS_ACCESS_KEY_ID }}
          password: ${{ secrets.READONLY_AWS_ACCESS_KEY }}

      - name: Build the Docker image
        run: docker build . --file Dockerfile --tag my-image-name:$(date +%s)

手動でのワークフローの再実行

Dependabot ワークフローを手動で再実行すると、再実行を開始したユーザーの権限が異なる場合でも、以前と同じ権限で実行されます。 詳しくは、「ワークフローとジョブの再実行」を参照してください。

一般的なDependabotの自動化

以下は、GitHub Actionsを使って自動化できる一般的ないくつかのシナリオです。

Pull Reqeustに関するメタデータのフェッチ

大量の自動化には、依存関係の名前が何か、それは実働環境の依存関係か、メジャー、マイナー、パッチアップデートのいずれなのかといった、Pull Requestの内容に関する情報を知ることが必要です。

dependabot/fetch-metadata アクションによって、次の情報のすべてが提供されます。

name: Dependabot fetch metadata
on: pull_request

permissions:
  pull-requests: write
  issues: write
  repository-projects: write

jobs:
  dependabot:
    runs-on: ubuntu-latest
    if: ${{ github.actor == 'dependabot[bot]' }}
    steps:
      - name: Dependabot metadata
        id: metadata
        uses: dependabot/fetch-metadata@v1
        with:
          github-token: "${{ secrets.GITHUB_TOKEN }}"
      # The following properties are now available:
      #  - steps.metadata.outputs.dependency-names
      #  - steps.metadata.outputs.dependency-type
      #  - steps.metadata.outputs.update-type

詳細については、dependabot/fetch-metadata リポジトリを参照してください。

Pull Requestのラベル付け

GitHubラベルに基づく他の自動化やトリアージワークフローがあるなら、提供されたメタデータに基づいてラベルを割り当てるアクションを設定できます。

たとえば、すべての実働環境の依存関係の更新にラベルでフラグを設定したいなら:

name: Dependabot auto-label
on: pull_request

permissions:
  pull-requests: write
  issues: write
  repository-projects: write

jobs:
  dependabot:
    runs-on: ubuntu-latest
    if: ${{ github.actor == 'dependabot[bot]' }}
    steps:
      - name: Dependabot metadata
        id: metadata
        uses: dependabot/fetch-metadata@v1
        with:
          github-token: "${{ secrets.GITHUB_TOKEN }}"
      - name: Add a label for all production dependencies
        if: ${{ steps.metadata.outputs.dependency-type == 'direct:production' }}
        run: gh pr edit "$PR_URL" --add-label "production"
        env:
          PR_URL: ${{github.event.pull_request.html_url}}

Pull Requestの承認

自動的にDependabotのPull Requestを承認したいなら、ワークフロー中でGitHub CLIを利用できます。

name: Dependabot auto-approve
on: pull_request

permissions:
  pull-requests: write

jobs:
  dependabot:
    runs-on: ubuntu-latest
    if: ${{ github.actor == 'dependabot[bot]' }}
    steps:
      - name: Dependabot metadata
        id: metadata
        uses: dependabot/fetch-metadata@v1
        with:
          github-token: "${{ secrets.GITHUB_TOKEN }}"
      - name: Approve a PR
        run: gh pr review --approve "$PR_URL"
        env:
          PR_URL: ${{github.event.pull_request.html_url}}
          GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}

Pull Requestの自動マージを有効化する

メンテナーが自動マージの特定の pull request をマークできるようにする場合は、GitHub の自動マージ機能を使用できます。 これにより、ブランチ保護ルールで必要なすべての必須テストと承認が正常に満たされた場合に、pull request がマージされます。 詳細については、「プルリクエストを自動的にマージする」および「ブランチ保護ルールを管理する」を参照してください。

メモ: pull request のテストにステータス チェックを使用する場合、Dependabot pull request のためにターゲット ブランチで [マージ前にステータス チェックの合格を必須にする] をオンにする必要があります。 このブランチ保護ルールにより、必須のステータス チェックに合格しないと、pull request はマージされません。 詳しくは、「ブランチ保護ルールを管理する」を参照してください。

代わりに、GitHub Actions と GitHub CLI を使用できます。 すべてのパッチ更新プログラムを my-dependency に自動マージする例を次に示します。

name: Dependabot auto-merge
on: pull_request

permissions:
  contents: write
  pull-requests: write

jobs:
  dependabot:
    runs-on: ubuntu-latest
    if: ${{ github.actor == 'dependabot[bot]' }}
    steps:
      - name: Dependabot metadata
        id: metadata
        uses: dependabot/fetch-metadata@v1
        with:
          github-token: "${{ secrets.GITHUB_TOKEN }}"
      - name: Enable auto-merge for Dependabot PRs
        if: ${{contains(steps.metadata.outputs.dependency-names, 'my-dependency') && 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}}

失敗したワークフローの実行のトラブルシューティング

ワークフローの実行が失敗した場合は、以下をチェックしてください。

  • 適切なアクターがトリガーした場合にのみワークフローを実行しているか。
  • pull_request に対する正しい ref をチェックアウトしています。
  • シークレットは、GitHub Actions シークレットとしてではなく、Dependabot シークレットで使用できます。
  • 適切なアクセス許可を持つ GITHUB_TOKEN があります。

GitHub Actions の作成とデバッグに関する情報については、「GitHub Actions について」を参照してください。