Skip to main content

通过 GitHub Actions 自动化 Dependabot

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

谁可以使用此功能?

具有写入访问权限的用户

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

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

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

Note

站点管理员必须先为 你的 GitHub Enterprise Server 实例设置 Dependabot updates,然后你才能使用此功能。 有关详细信息,请参阅“为企业启用 Dependabot”。

如果企业所有者在企业级别设置了策略,你可能无法启用或禁用 Dependabot updates。 有关详细信息,请参阅“强制实施企业的代码安全性和分析策略”。

关于 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 进行故障排除”。