什么是多生态系统更新?
多生态系统更新允许 Dependabot 将不同包生态系统(例如 npm、Docker、Python 和 Terraform)的依赖项更新分组到每个组的单个拉取请求中。
你会收到一个包含该组中生态系统的所有更新的合并拉取请求,而不是为每个生态系统接收单独的拉取请求。
多生态系统更新的工作原理
配置多生态系统组时:
- 在
dependabot.yml文件的multi-ecosystem-groups部分中,通过计划来定义组。 - 使用
multi-ecosystem-group密钥将单个包生态系统分配给组。 - 可以使用
patterns键指定每个生态系统要包括的依赖项。 - Dependabot 根据组的计划检查更新。
- 创建单个拉取请求,其中包含组中所有生态系统的更新。
- 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。
**仅组选项** (只能在组级别设置):
milestonecommit-messagetarget-branchpull-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)创建单独的组,每个组都有不同的计划和分配者。
示例:复杂的多组配置
此示例演示复杂项目如何使用具有不同更新策略的多个组:
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"
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)