# 多生态系统更新

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

## 什么是多生态系统更新？

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

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

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

配置多生态系统组时：

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

## 何时使用多生态系统更新

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

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

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

Dependabot 支持两种类型的分组：

**多生态系统组：**

* 在你的 `package-ecosystem` 文件中跨多个 `dependabot.yml` 条目
* 需要密钥 `patterns` 来指定要包含的依赖项
* 在 `multi-ecosystem-groups` 部分定义各自的计划
* 使用 `multi-ecosystem-group` 密钥将生态系统分配到组

**单生态系统组：**

* 在一个包生态系统中工作
* 在 `groups` 项中使用 `updates` 键
* 从父 `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 选项参考](/zh/enterprise-server@3.20/code-security/reference/supply-chain-security/dependabot-options-reference#multi-ecosystem-groups)。

## 用例

### 基础结构项目

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

**为什么将这些组合在一起：** 基础结构更改通常需要一起部署。 为每项技术创建单独的拉取请求会增加协调开销，并使得跟踪需要作为整体部署的内容更困难

**示例方案：** 为服务提供 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 copy
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"
```

## 后续步骤

* [为 Dependabot 配置多生态系统更新](/zh/enterprise-server@3.20/code-security/how-tos/secure-your-supply-chain/secure-your-dependencies/configuring-multi-ecosystem-updates)