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ワークフローをトリガーできます。ただし、GitHub Actions: DependabotのPull Requestがトリガーしたワークフローは読み取りのみの権限で実行されるので、特定のイベントは異なった扱いを受けます。

pull_requestpull_request_reviewpull_request_review_commentpushイベントを使って Dependabotによって開始されたワークフロー(github.actor == "dependabot[bot]")については、以下の制限が適用されます。

  • GITHUB_TOKENは読み取りのみの権限を持ちます。
  • シークレットにはアクセスできません。

詳しい情報についてはGitHub Actionsとワークフローをセキュアに保つ: pwnリクエストの防止を参照してください。

pull_requestイベントの処理

ワークフローでシークレットへのアクセスや書き込み権限を持つGITHUB_TOKENが必要なら、2つの選択肢があります。pull_request_targetの使用、もしくは2つの別々のワークフローの使用です。 このセクションではpull_request_targetの使用を詳しく説明し、2つのワークフローの使用は下の「pushイベントの処理」で詳しく説明します。

以下は、失敗する可能性があるpull_requestワークフローのシンプルな例です。

### このワークフローはシークレットを持たず、読み取りのみのトークンを持つ
name: Dependabot Workflow
on:
  pull_request

jobs:
  dependabot:
    runs-on: ubuntu-latest
    # ワークフローがDependabot PR以外で失敗しないよう、アクターがDependabotか常にチェック
    if: ${{ github.actor == 'dependabot[bot]' }}
    steps:
      - uses: actions/checkout@v2

pull_requestpull_request_targetで置き換えることができます。これはフォークからのPull Requestのために使われるもので、厳密にPull RequestのHEADをチェックアウトします。

警告 pull_requestの代わりとしてpull_request_targetを使うと、安全でない動作にさらされることになります。 下の「pushイベントの処理」で説明する2つのワークフローの方法を使うことをおすすめします。

### このワークフローはシークレットへのアクセスと読み書きできるトークンを持ちます
name: Dependabot Workflow
on:
  pull_request_target

permissions:
  # 今度は読み書きできるトークンを持っているので、必要に応じてスコープを下げる

jobs:
  dependabot:
    runs-on: ubuntu-latest
    if: ${{ github.actor == 'dependabot[bot]' }}
    steps:
      - uses: actions/checkout@v2
        with:
          # pull requestのHEADをチェックアウト
          ref: ${{ github.event.pull_request.head.sha }}
          github-token: ${{ secrets.GITHUB_TOKEN }}

必要以上の権限を持つトークンの漏洩を避けるために、GITHUB_TOKENに付与する権限のスコープを絞ることも強くおすすめします。 詳しい情報については「GITHUB_TOKENの権限」を参照してください。

pushイベントの処理

pushイベントにはpull_request_targetに相当するものがないので、2つのワークフローを使うことになります。1つは信頼されないワークフローで、成果物のアップロードで終わります。そしてこれは、成果物をダウンロードして処理を続ける、2番目の信頼されるワークフローをトリガーします。

最初のワークフローは、信頼されない作業をすべて行います。

### このワークフローはシークレットにアクセスできず、読み取りのみのトークンを持つ
name: Dependabot Untrusted Workflow
on:
  push

jobs:
  check-dependabot:
    runs-on: ubuntu-latest
    if: ${{ github.actor == 'dependabot[bot]' }}
    steps:
      - uses: ...

2番目のワークフローは、最初のワークフローが正常に終了した後に、信頼された処理を行います。

### このワークフローはシークレットにアクセスでき、読み書きのトークンを持つ
name: Dependabot Trusted Workflow
on:
  workflow_run:
    workflows: ["Dependabot Untrusted Workflow"]
    types: 
      - completed

permissions:
  # 今度は読み書きできるトークンを持っているので、必要に応じてスコープを下げる

jobs:
  dependabot:
    runs-on: ubuntu-latest
    if: ${{ github.event.workflow_run.conclusion == 'success' }}
    steps:
      - uses: ...

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

失敗したDependabotワークフローを手動で再実行することもできます。これは、読み書きできるトークンを持ち、シークレットにアクセスできる状態で実行されます。 失敗したワークフローを手動で再実行する前には、更新される依存関係を常にチェックし、その変更によって悪意ある、あるいは意図しない動作が入り込むことがないようにすべきです。

一般的なDependabotの自動化

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

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

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

dependabot/fetch-metadataアクションは、これらの情報をすべて提供します。

name: Dependabot auto-label
on: pull_request_target

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.1.1
        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_target

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.1.1
        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_target

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.1.1
        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の自動的なマージ」を参照してください。

以下は、my-dependencyに対するすべてのパッチアップデートの自動マージを有効化する例です。

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@v1.1.1
        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をチェックアウトしているか。
  • Dependabotがトリガーしたpull_requestpull_request_reviewpull_request_review_commentpushイベントからシークレットにアクセスしようとしているか。
  • Dependabotがトリガーしたpull_requestpull_request_reviewpull_request_review_commentpushイベントからなんらかのwriteアクションを実行しようとしていないか。

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

このドキュメントは役立ちましたか?

プライバシーポリシー

これらのドキュメントを素晴らしいものにするのを手伝ってください!

GitHubのすべてのドキュメントはオープンソースです。間違っていたり、はっきりしないところがありましたか?Pull Requestをお送りください。

コントリビューションを行う

OR, コントリビューションの方法を学んでください。

問題がまだ解決していませんか?