Skip to main content

多生态系统更新

多生态系统更新将多个包生态系统中的依赖项更新合并为单个拉取请求,减少评审开销并简化更新工作流。

什么是多生态系统更新?

多生态系统更新允许 Dependabot 将不同包生态系统(例如 npm、Docker、Python 和 Terraform)的依赖项更新分组到每个组的单个拉取请求中。

你会收到一个包含该组中生态系统的所有更新的合并拉取请求,而不是为每个生态系统接收单独的拉取请求。

多生态系统更新的工作原理

配置多生态系统组时:

  1. dependabot.yml文件的multi-ecosystem-groups部分中,通过计划来定义组。
  2. 使用 multi-ecosystem-group 密钥将单个包生态系统分配给组。
  3. 可以使用 patterns 键指定每个生态系统要包括的依赖项。
  4. Dependabot 根据组的计划检查更新。
  5. 创建单个拉取请求,其中包含组中所有生态系统的更新。
  6. PR 在分支名称和标题中使用组标识符。

何时使用多生态系统更新

多生态系统更新尤其适用于:

  • 使用多种技术的基础结构项目(Docker、Terraform、Python 脚本)
  • 具有应一起更新的前端和后端依赖项的全堆栈应用程序
  • 需要跨语言同步协议版本的跨平台库
  • 使用共享版本控制的不同语言的服务的 Monorepos

多生态系统与单生态系统组

Dependabot 支持两种类型的分组:

          **多生态系统组:**
  • 跨文件中的多个package-ecosystem条目dependabot.yml

  • 需要密钥 patterns 来指定要包含的依赖项

  • multi-ecosystem-groups 节中定义自己的计划

  • 使用 multi-ecosystem-group 密钥将生态系统分配到组

            **单生态系统组:**
    
  • 在一个包生态系统中工作

  • updates 项中使用 groups

  • 从父 updates 条目继承日程

  • 更好地组织单个包管理器中的依赖项

如果要跨不同的包管理器合并更新,请使用多生态系统组。 如果要在单个包管理器中组织依赖项(例如,将所有 AWS 相关的 npm 包组合在一起),请使用单生态系统组。

配置合并行为

可以在组级别和生态系统级别设置某些配置选项。 Dependabot 会根据选项以不同方式合并这些值:

          **累加选项** (值已合并):

* assignees - 这两个级别的所有被分配者都分配给拉取请求 * labels - 这两个级别的所有标签都应用于拉取请求

例如,如果在组级别分配@platform-team并在 Docker 生态系统级别分配@docker-admin,则生成的拉取请求将同时分配给@platform-team@docker-admin

          **仅组选项** (只能在组级别设置):
  • milestone
  • commit-message
  • target-branch
  • pull-request-branch-name

尝试在生态系统级别设置这些选项将导致配置错误。

有关所有可用配置选项及其行为的完整参考,请参阅 Dependabot 选项参考

用例

基础结构项目

基础结构代码通常使用多种技术:Docker 容器、用于云资源的 Terraform,以及用于自动化的 Python 脚本。 将这些更新组合在一起可简化评审和部署协调。

          **为什么将这些组合在一起:** 基础结构更改通常需要一起部署。 为每个技术创建单独的 PR 会产生协调成本,并使得跟踪需要部署为一个单元的事项变得更加困难。

          **示例方案:** 为服务提供 Docker 映像、用于 AWS 资源的 Terraform 模块,以及用于自动化任务的 Python 脚本。 一个每周的“基础结构”拉取请求包含所有三项的更新,以便更轻松地一起查看和部署基础结构更改。

全栈应用程序

具有前端和后端组件的 Web 应用程序受益于将依赖项更新在一起,以确保兼容性并简化测试。

          **为什么将这些组合在一起:** 前端和后端通常相互依赖。 一起更新它们可确保一次性测试完整的应用程序堆栈,而不是合并前端更改,然后在以后发现后端不兼容。

          **示例方案:** React 前端和 Rails 后端每天在单个“应用依赖项”拉取请求中更新,允许在合并之前一起测试完整的应用程序。

跨平台库

跨不同语言(如 gRPC 和协议缓冲区)使用相同的协议的库或服务需要使库版本在所有实现之间保持同步。

          **为什么将这些组合在一起:** 协议库需要在不同的语言实现中保持兼容。 一起更新它们可防止版本不匹配,这可能会导致服务之间的通信失败。

          **示例方案:** Node.js 和 Ruby 服务都使用 gRPC。 单个 pull 请求同时更新 `@grpc/grpc-js`(npm)和 `grpc`(bundler),确保协议兼容性。

Monorepos 包含多个服务

包含用不同语言编写的多个服务的大型存储库,通过按团队责任或部署节奏分组更新来获益。

          **为什么将这些归为一组:** 不同的团队负责 monorepo 的不同部分,更新应路由到相应的审阅者。 或服务部署在一起,需要协调更新。

          **示例方案:** monorepo 具有 Python API 服务、Go 辅助角色服务和 Node.js 前端。 为“后端服务”(Python + Go)和“前端”(Node.js)创建单独的组,每个组都有不同的计划和分配者。

示例:复杂的多组配置

此示例演示复杂项目如何使用具有不同更新策略的多个组:

YAML
version: 2

multi-ecosystem-groups:
  # Infrastructure updates - weekly, tracked in milestone
  infrastructure:
    schedule:
      interval: "weekly"
    assignees: ["@platform-team"]
    labels: ["infrastructure", "dependencies"]
    milestone: 10

  # Application code updates - daily, with development team
  full-stack:
    schedule:
      interval: "daily"
    assignees: ["@full-stack-team"]
    labels: ["full-stack"]

updates:
  # Docker images - infrastructure group with additional docker expertise
  - package-ecosystem: "docker"
    directory: "/"
    patterns: ["nginx", "redis", "postgres"]
    assignees: ["@docker-admin"]      # Adds to @platform-team
    labels: ["docker"]                 # Adds to infrastructure, dependencies
    multi-ecosystem-group: "infrastructure"

  # Terraform - infrastructure group
  - package-ecosystem: "terraform"
    directory: "/"
    patterns: ["aws", "terraform-*"]
    multi-ecosystem-group: "infrastructure"

  # Frontend - full-stack group with frontend focus
  - package-ecosystem: "npm"
    directory: "/frontend"
    patterns: ["react", "lodash", "@types/*"]
    labels: ["frontend"]               # Adds to full-stack
    multi-ecosystem-group: "full-stack"

  # Backend - full-stack group with backend specialist
  - package-ecosystem: "bundler"
    directory: "/backend"
    patterns: ["rails", "pg", "sidekiq"]
    assignees: ["@backend-dev"]        # Adds to @full-stack-team
    multi-ecosystem-group: "full-stack"

后续步骤

  •         [AUTOTITLE](/code-security/how-tos/secure-your-supply-chain/secure-your-dependencies/configuring-multi-ecosystem-updates)