Skip to main content

通过 GitHub Actions 自动化 Dependabot

如何使用 GitHub Actions 来自动执行常见 Dependabot 相关任务的示例。

谁可以使用此功能?

具有写入访问权限的用户

Note

本文解释了如何使用 GitHub Actions 自动执行与 Dependabot 相关的任务。 有关使用 GitHub Actions 运行 Dependabot updates的详细信息,请参阅“关于 GitHub Actions 运行器上的 Dependabot”。

当 Dependabot 创建拉取请求以更新依赖项时,你可以使用 GitHub Actions 执行自动化任务。 如果你想执行以下操作,可能会发现这很有用:

  • 确保使用正确的数据为你的工作流程创建 Dependabot 拉取请求(版本更新和安全更新),包括标签、名称和审阅者。

  • 触发工作流以将 Dependabot 拉取请求(版本更新和安全更新)发送到你的评审过程或自动合并。

关于 Dependabot 与 GitHub Actions

Dependabot 会创建拉取请求以使你的依赖项保持最新状态。 当这些拉取请求创建时,你可以使用 GitHub Actions 来执行自动化任务。 例如,提取其他构件、添加标签、运行测试或修改拉取请求。

Dependabot 能够在其拉取请求和评论上触发 GitHub Actions 工作流程;但是,某些事件的处理方式不同。 有关详细信息,请参阅“对 GitHub Actions 上的 Dependabot 进行故障排除”。

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

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

大部分自动化都要求你了解拉取请求内容的信息:依赖项名称是什么,是否为生产依赖项,以及是主要、次要还是补丁更新。 可以使用操作来检索由 Dependabot 生成的拉取请求更新的依赖项的信息。

示例:

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

对拉取请求进行标记

如果你有基于 GitHub 标签的其他自动化或会审工作流,则可以配置操作以根据提供的元数据分配标签。

使用标签标记所有生产依赖项更新的示例:

YAML
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}}

自动批准拉取请求

你可以在工作流中使用 GitHub CLI 来自动批准 Dependabot 拉取请求。

示例:

YAML
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}}

对拉取请求启用自动合并

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

有关详细信息,请参阅 自动合并拉取请求管理分支保护规则

可以改为使用 GitHub Actions 和 GitHub CLI。 以下示例会将所有补丁更新自动合并为 my-dependency

YAML
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}}

Note

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

调查失败的工作流运行

如果您的工作流程运行失败,请检查以下情况:

  • 只有当正确的角色触发工作流程时,才运行工作流程。
  • 你正在检查 pull_request 的正确 ref 值。
  • 您的机密在 Dependabot 机密中可用,而不是作为 GitHub Actions 机密。
  • 你有一个具有适当权限的 GITHUB_TOKEN

有关编写和调试 GitHub Actions 的详细信息,请参阅 写入工作流

有关帮助解决工作流问题的更多提示,请参阅“对 GitHub Actions 上的 Dependabot 进行故障排除”。