Dependabot及びGitHub Actionsについて
Dependabotは、依存関係を最新に保つためのPull Requestを作成します。GitHub Actionsを使って、それらのPull Requestが作成されたときに自動化されたタスクを実行できます。 たとえば、追加の成果物のフェッチ、ラベルの追加、テストの実行、あるいはPull Requestの変更ができます。
Note
この記事では、GitHub Actionsを使ってDependabot 関連のタスクを自動化する方法についてを説明します。 GitHub Actions での Dependabot updates の実行について詳しくは、「GitHub Actions ランナーの Dependabot について」をご覧ください。
イベントへの応答
Dependabot は、pull request とコメントで GitHub Actions ワークフローをトリガーできます。ただし、特定のイベントは異なる方法で処理されます。
pull_request
、pull_request_review
、pull_request_review_comment
、push
、create
、deployment
、および deployment_status
イベントを使い Dependabot によって開始されるワークフロー (github.actor == 'dependabot[bot]'
) の場合、次の制限が適用されます。
GITHUB_TOKEN
は、既定で読み取り専用のアクセス許可を持ちます。- シークレットは、Dependabot シークレットから設定されます。 GitHub Actions シークレットは使用できません。
pull_request_target
イベントを使い Dependabot によって開始されたワークフロー (github.actor == 'dependabot[bot]'
) については、pull request のベース参照が Dependabot によって作成された場合 (github.event.pull_request.user.login == '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 上のプライベート コンテナー レジストリにアクセスするには、ワークフローに username
と password
のシークレットを含める必要があります。 次の例では、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@3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c
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.event.pull_request.user.login == 'dependabot[bot]' && github.repository == 'owner/my_repo'
steps:
- name: Dependabot metadata
id: metadata
uses: dependabot/fetch-metadata@4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d
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.event.pull_request.user.login == 'dependabot[bot]' && github.repository == 'owner/my_repo'
steps:
- name: Dependabot metadata
id: metadata
uses: dependabot/fetch-metadata@4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d
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.event.pull_request.user.login == 'dependabot[bot]' && github.repository == 'owner/my_repo'
steps:
- name: Dependabot metadata
id: metadata
uses: dependabot/fetch-metadata@4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d
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}}
GH_TOKEN: ${{secrets.GITHUB_TOKEN}}
Pull Requestの自動マージを有効化する
メンテナーが自動マージの特定の pull request をマークできるようにする場合は、GitHub の自動マージ機能を使用できます。 これにより、ブランチ保護ルールで必要なすべての必須テストと承認が正常に満たされた場合に、pull request がマージされます。 詳細については、「プルリクエストを自動的にマージする」および「ブランチ保護ルールを管理する」を参照してください。
ブランチ保護ルールの代わりに、ルールセットを作成できます。 詳しくは、「ルールセットについて」をご覧ください。
Note
pull request のテストにステータス チェックを使用する場合、Dependabot pull request のターゲット ブランチで [Require status checks to pass before merging] を有効にする必要があります。 このブランチ保護ルールにより、必須のステータス チェックに合格しないと、pull request はマージされません。 詳しくは、「ブランチ保護ルールを管理する」を参照してください。
代わりに、GitHub Actions と GitHub CLI を使用できます。 my-dependency
(という名前の依存パッケージ)に対する全てのpatchレベルの更新を自動マージする例を次に示します。
name: Dependabot auto-merge
on: pull_request
permissions:
contents: write
pull-requests: write
jobs:
dependabot:
runs-on: ubuntu-latest
if: github.event.pull_request.user.login == 'dependabot[bot]' && github.repository == 'owner/my_repo'
steps:
- name: Dependabot metadata
id: metadata
uses: dependabot/fetch-metadata@4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d
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}}
GH_TOKEN: ${{secrets.GITHUB_TOKEN}}
失敗したワークフローの実行のトラブルシューティング
ワークフローの実行が失敗した場合は、以下をチェックしてください。
- 適切なアクターがトリガーした場合にのみワークフローを実行しているか。
pull_request
に対する正しいref
をチェックアウトしています。- シークレットは、GitHub Actions シークレットとしてではなく、Dependabot シークレットで使用できます。
- 適切なアクセス許可を持つ
GITHUB_TOKEN
があります。
GitHub Actions の作成とデバッグに関する情報については、「ワークフローの書き込み」を参照してください。