Skip to main content

GitHub AE 目前处于受限版。

通过 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 创建拉动请求以保持依赖项的最新状态,并且当创建这些拉取请求时,您可以使用 GitHub Actions 执行自动任务。 例如,获取其他构件、添加标签、运行测试或修改拉取请求。

响应事件

Dependabot 能够在其拉取请求和评论上触发 GitHub Actions 工作流程;但是,某些事件的处理方式不同。

对于 Dependabot (github.actor == 'dependabot[bot]') 使用 pull_requestpull_request_reviewpull_request_review_commentpushcreatedeploymentdeployment_status 事件发起的工作流,具有以下限制:

  • GITHUB_TOKEN 默认拥有只读权限。
  • 机密是从 Dependabot 机密填充的。 GitHub Actions 机密不可用。

对于 Dependabot (github.actor == 'dependabot[bot]') 使用 pull_request_target 事件发起的工作流,如果拉取请求的基本引用是由 Dependabot (github.actor == 'dependabot[bot]') 创建的,GITHUB_TOKEN 将是只读的,并且机密不可用。

有关详细信息,请参阅“确保 GitHub Actions 和工作流安全:阻止 pwn 请求”。

手动重新运行工作流程

您还可以手动重新运行失败的 Dependabot 工作流程,它将以读写令牌运行并访问密码。 在手动重新运行失败的工作流程之前,您应始终检查更新的依赖项,以确保更改不会引入任何恶意或意外行为。

常用 Dependabot 自动化

以下是可以使用 GitHub Actions 自动化的几个常见场景。

获取有关拉取请求的元数据

大量自动化需要了解拉取请求内容的信息:依赖项名称是什么,是否为生产依赖项,以及是否为主要、次要或补丁更新。

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 存储库。

标记拉取请求

如果您有基于 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}}

批准拉取请求

如果您想要自动批准 Dependabot 拉取请求,您可以在工作流程中使用 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}}

在拉取请求上启用自动合并

如果要允许维护者标记某些拉取请求以进行自动合并,可以使用 GitHub 的自动合并功能。 这样,如果分支保护规则所需的任何测试和批准都成功满足,拉取请求就可合并。 有关详细信息,请参阅“自动合并拉取请求”和“管理分支保护规则”。

注意:如果使用状态检查来测试拉取请求,则应为 Dependabot 拉取请求的目标分支启用“合并前需要通过状态检查” 。 此分支保护规则可确保除非所有必需的状态检查都通过,否则不合并拉取请求。 有关详细信息,请参阅“管理分支保护规则”。

可以改为使用 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 值。
  • 您的机密在 Dependabot 机密中可用,而不是作为 GitHub Actions 机密。
  • 你有一个具有适当权限的 GITHUB_TOKEN

有关编写和调试 GitHub Actions 的详细信息,请参阅“了解 GitHub Actions”。