Backstage v1.53.0 版本更新解读:代理迁移、多环境配置加载与 OpenAPI 工具链重构
【免费下载链接】backstageBackstage is an open framework for building developer portals项目地址: https://gitcode.com/GitHub_Trending/ba/backstage
本篇技术解读以官方 v1.53.0 变更日志 为核心骨架,结合本仓库源码逐项拆解本次版本的关键变更:Node.js 内置代理支持替换 legacy 代理代理、BACKSTAGE_ENV多环境配置叠加、Optic 依赖移除与oasdiff接入、连接服务(connections)新增title字段、用户设置数据库持久化、Catalog 实体页 BUI 迁移等。读完本文,你将掌握升级到 v1.53.0 时必须处理的行为变更,以及新增能力的正确配置与使用方式。
一、版本总览与升级入口
v1.53.0 是一次功能与清理并重的版本,包含多个Minor级能力变更与若干**BREAKING**破坏性变更。升级时建议先使用官方 Upgrade Helper(https://backstage.github.io/upgrade-helper/?to=1.53.0)评估当前应用涉及的包。本文涉及的包分布在仓库的 packages(基础库与 CLI 工具链)与 plugins(前后端插件)两个目录中,与变更日志中的包名一一对应。
二、代理支持迁移:告别 legacy 代理代理
变更内容
本次版本最重要的破坏性变更之一是代理(proxy)支持的迁移:
@backstage/cli-common@0.3.0(变更号39deda4):移除了已废弃的bootstrapEnvProxyAgents导出,同时移除global-agent与undici依赖。@backstage/cli-module-migrate@0.2.0:versions:bump命令不再引导 legacy 代理代理。@backstage/create-app@0.9.0:新脚手架模板不再引导 legacy 代理代理。
迁移方式
升级后请按以下方式启用代理支持:
# 设置 Node.js 内置代理支持 export NODE_USE_ENV_PROXY=1 # 配合标准代理环境变量 export HTTP_PROXY=http://proxy.example.com:8080 export HTTPS_PROXY=http://proxy.example.com:8080 export NO_PROXY=localhost,127.0.0.1,.example.comNode.js 会依据HTTP_PROXY/HTTPS_PROXY/NO_PROXY环境变量自动为fetch等内置网络能力路由流量,无需再依赖global-agent注入全局代理。应用启动时不再需要任何bootstrapEnvProxyAgents调用,相关依赖可直接从package.json移除。
三、配置加载增强:BACKSTAGE_ENV支持多环境叠加
变更内容
@backstage/config-loader@1.11.0(变更号005458a)为BACKSTAGE_ENV环境变量增加了逗号分隔支持,允许多个环境特定的配置文件在启动时依次加载并叠加。
使用方式与加载顺序
BACKSTAGE_ENV=e2e-test,production yarn start:backend上述命令会在基础app-config.yaml之上,依次加载app-config.e2e-test.yaml与app-config.production.yaml,后加载的环境优先级更高。app-config.local.yaml这类本地覆盖文件始终在所有非本地文件之后加载(包括各环境的.local.yaml变体)。
该逻辑可直接在 ConfigSources.ts 中验证:defaultForTargets会先拆分并清洗BACKSTAGE_ENV(split(',')→trim()→ 过滤空段),随后依次压入基础配置源、各环境配置源,最后追加本地覆盖配置源。仓库测试 ConfigSources.test.ts 还专门覆盖了带空格、空段(如,e2e-test,,production,)的边界情况,说明该解析对用户输入是宽容的。
配置 Schema 的类型校验强化
同版本@backstage/config-loader@1.11.0(变更号4a7240b)还强化了 TypeScript 声明配置 Schema 的加载:现在会解析并校验其中导入的类型,而非将导入视为无约束值;无效的导入会导致 Schema 加载直接失败。因此升级后若config.d.ts中存在失效导入,启动时会立即报错,而非静默通过后在发布包时破坏消费者的 Schema 加载。
四、OpenAPI 工具链重构:Optic 移除与 oasdiff 接入
变更内容
@backstage/backend-openapi-utils@0.7.0与@backstage/repo-tools@0.18.0(变更号84171b3)完成了 OpenAPI 工具链的整体替换:
- 移除
wrapInOpenApiTestServer:该函数此前通过OPTIC_PROXY环境变量将测试流量重定向到 Opticcapture代理;Optic 依赖移除后该函数失去意义,测试中的 OpenAPI 规范校验请改用wrapServer。 @useoptic/optic与@useoptic/openapi-utilities被oasdiff取代:用于 OpenAPI 破坏性变更检测。
迁移步骤
- 从根
package.json中移除@useoptic/optic; - 在系统上安装
oasdiffCLI; package schema openapi diff命令现在底层调用oasdiff,--since、--json、--ignore参数继续可用,但 JSON 与文本输出格式已切换为oasdiff原生格式;repo schema openapi diff会自动检测所有src/schema/openapi.yaml发生变更的包并直接对其运行oasdiff,包不再需要在package.json中声明"diff"脚本即可纳入检查;- 已删除命令:
package schema openapi init与repo schema openapi test(它们依赖 Opticcapture工作流,在oasdiff下没有对应物)。
仓库侧的实现证据位于 packages/repo-tools/src/commands:package/schema/openapi/diff.ts直接执行oasdiff,repo/schema/openapi/diff.ts使用templates/oasdiff-changelog.tmpl渲染变更日志;util.ts 中commandExists('oasdiff')会预先检查 CLI 是否安装并给出安装提示。
运行时校验替代方案
API 运行时校验仍然可用,迁移到wrapServer即可:
import { wrapServer } from '@backstage/backend-openapi-utils/testUtils'; import request from 'supertest'; import { createApp } from './app'; describe('OpenAPI spec validation', () => { it('should validate requests against the spec', async () => { const app = await createApp(); const server = await wrapServer(app); // server.address() 指向内部 OpenAPI 代理地址 const response = await request(server).get('/api/...'); expect(response.status).toBe(200); }); });从 testUtils.ts 源码可见,wrapServer会启动一个捕获代理,将应用监听在代理转发端口上,并让address()返回代理地址,从而在 supertest 场景中校验所有请求/响应是否符合 OpenAPI 规范。
五、连接服务(connections)新增title字段
@backstage/connections@0.2.0(变更号58c53b1)为连接认证方法引入了人类可读的title字段:
- 连接类型作者必须为每个认证方法定义提供
title; - 连接配置可以按认证条目可选地覆盖
title; - 未显式配置时,认证条目的
title默认取连接类型定义的方法title。
仓库中 ConnectionType.ts 将title列为框架管理的保留字段(ReservedConnectionFields与ReservedAuthMethodFields均含title),buildConnectionsFromConfig.ts则实现了默认标题回填逻辑——当连接或认证方法未提供标题时,使用连接类型的title兜底,多个同类型连接共享默认标题时会并入身份信息以区分。
典型配置示例(继承自仓库 buildConnectionsFromConfig.test.ts 的断言形态):
# app-config.yaml connections: github: title: Enterprise GitHub auth: - method: token token: ${GITHUB_TOKEN} title: Token此外@backstage/connections@0.2.0(变更号ec96761)还为连接服务提供了默认实现,后端模块可以直接依赖它而无需应用显式安装连接服务工厂。
六、用户设置数据库持久化落地
@backstage/create-app@0.9.0(变更号fc4cae1)与新增包@backstage/plugin-app-module-user-settings@0.1.0(变更号c8a06d5)共同完成了用户设置的数据库持久化:
- create-app 模板默认加入 user settings 后端插件,新创建应用开箱即用地获得基于数据库的用户设置持久化;
- 前端存储 API 通过新的
@backstage/plugin-app-module-user-settings模块改由后端持久化存储,取代浏览器 local storage,设置可跨设备、跨会话同步。
从 plugins/user-settings-backend/src/plugin.ts 可见其实现链路:插件通过DatabaseUserSettingsStore.create(...)(见 DatabaseUserSettingsStore.ts)构建存储,再交由createRouter({ userSettingsStore, httpAuth, signals })暴露 REST 接口,并结合 signals 实现跨设备实时同步。
七、Catalog 实体页迁移至 BUI 与数据驱动上下文菜单
@backstage/plugin-catalog-react@3.2.0与@backstage/plugin-catalog@2.0.7(变更号ba49e37、15719cc)推动了新前端系统 Catalog 实体页的 UI 现代化:
- BREAKING ALPHA:
EntityContextMenuItemBlueprint现在输出菜单项数据而非渲染后的 MUI 元素;Catalog 实体页消费这些数据并渲染 BUI 菜单项。icon类型改为IconElement,官方建议使用 Remix 图标并确保自定义图标符合标准尺寸要求。菜单项被选中后会立即关闭,即使异步操作仍在进行。 - BREAKING ALPHA:Catalog 实体页迁移到自动化的 Catalog 插件页头与 BUI 页头(含实体标签、标题、元数据、收藏与上下文菜单操作、Catalog 组合导航)。旧的不透明实体页头扩展点被弃用,但通过临时 legacy 布局回退继续工作,便于渐进迁移;当新旧两种自定义同时匹配同一实体时,新扩展点优先。
- 新增翻译键
entityLabels.systemLabel、entityLabels.domainLabel、entityLabels.partOfLabel,提供 Catalog 本地化的应用需补齐这些文案;entityContextMenu.moreButtonAriaLabel默认英文值从more变为More actions。 - 同时修复了实体导出在过滤器为
undefined时的崩溃问题(a00547f、1217673),以及EntityTypePicker的initialFilter在EntityListProvider中被意外清空的回归(8a500d5)。
八、MCP Actions 移除 SSE 传输,统一 Streamable HTTP
@backstage/plugin-mcp-actions-backend@0.2.0(变更号567bc4c)移除了已废弃的 Server-Sent Events(SSE)MCP 传输。MCP 客户端必须改用 Streamable HTTP 端点:
- 主端点:
/api/mcp-actions/v1 - 命名服务器端点:如
/api/mcp-actions/v1/catalog、/api/mcp-actions/v1/scaffolder
从 plugin.ts 可见路由注册与 OAuth 保护资源描述符(/.well-known/oauth-protected-resource/api/mcp-actions/v1),底层由 createStreamableRouter.ts 基于StreamableHTTPServerTransport实现。测试 plugin.test.ts 使用StreamableHTTPClientTransport验证了各命名端点的工具列表。客户端升级时只需将原先的 SSE transport 替换为StreamableHTTPClientTransport并指向对应端点即可。
九、前端系统:面包屑(Breadcrumbs)体系补齐
@backstage/frontend-plugin-api@0.17.3、@backstage/plugin-app@0.5.1、@backstage/plugin-scaffolder@1.38.1(变更号a5b2811)为使用新前端系统的插件补齐了面包屑基础设施:
- 新增
useBreadcrumbEntriesHook、BreadcrumbEntry组件与BreadcrumbsRegistryProvider; - app 插件的
PageLayout为每个插件页面注册根面包屑并传递给PluginHeader; PageBlueprint自动用BreadcrumbEntry包裹每个子页面路由元素,子页面无需额外接线即可进入面包屑链路;- 子页面内部路由需要面包屑时,可手动用
BreadcrumbEntry包裹路由内容(plugin-scaffolder内部路由已作为示例接入)。
配套的@backstage/ui@0.17.0为PluginHeader增加了breadcrumbsprop:传入后渲染带面包屑的nav并视觉隐藏插件标题;面包屑在分段达到 5 个及以上时折叠中间段,文本被截断时显示 tooltip。该版本还从react-aria-components重新导出了Selection、SortDirection、Key(type-only)与Focusable(运行时导出),插件作者可直接从@backstage/ui导入,避免版本不一致问题。
十、后端与 CLI 工具链的其他值得注意的修复
本次 Patch 级别的变更同样包含若干生产环境关键修复,升级收益明显:
- Scaffolder 任务总数类型修复(
@backstage/plugin-scaffolder-backend@4.0.2,55902bb):DatabaseTaskStore.list在 PostgreSQL 上返回的totalTasks是字符串(knex 对COUNT(*)聚合返回 bigint 字符串),而 better-sqlite3 返回数字。修复后用Number(...)强转并用Number.isSafeInteger(...)校验,解决了list-scaffolder-tasksaction 输出 Schema 校验失败(Expected number, received string)的问题。 - Redis 缓存连接对象化(
@backstage/backend-defaults@0.17.5,a624fa3):backend.cache.store: redis时,connection配置项既可传字符串 URL,也可传对象以透传底层连接选项(如pingInterval),集群模式下对象属性会合并进集群默认值;非 redis 存储仍要求纯字符串。 - 定时任务注册修复(
d62c384):先以手动触发注册、后又以 duration/cron 节奏重新注册的定时任务,此前永远不会被调度,现已修复。 - AWS S3 支持 PrivateLink(
8419f51、aaa7d65):支持 AWS PrivateLink 访问 S3,并将原先的单体大正则拆分为标准 S3 与 VPC PrivateLink 两个具名捕获组,强制 VPC 端点 region 必填,修复 region 段缺失时的误解析。 - MySQL 测试数据库稳定性(
@backstage/backend-test-utils@1.11.5,41c56b3):Docker 镜像从浮动的mysql:8固定到mysql:8.4(移除 8.4 中已删除的启动参数),每个测试库连接池从 50 降到 5、空闲连接 5 秒回收,MySQL/Postgres 容器连接上限统一提到 1000,以支撑高核机器上的并行 Jest worker。 - Azure DevOps webhook 入口(
@backstage/plugin-events-backend-module-azure@0.2.33,9d23b9e):新增 HTTP POST webhook 入口,仅在配置events.modules.azureDevOps.webhookSecret时注册路由,并用时序安全比较校验x-ado-webhook-secret头。 - Yeoman 模块 ESM 兼容(
@backstage/plugin-scaffolder-backend-module-yeoman@0.4.24,5e92512):yeoman-environment v4+ 为 ESM-only,原require()会抛ERR_REQUIRE_ESM,已改为动态import()并适配 v4+ 注册 API。 - Auth0 登录引导(
@backstage/plugin-auth-backend-module-auth0-provider@0.4.3):新增prompt配置(auto让 Auth0 自行决定,现有配置默认仍为consent),并支持screen_hint/login_hint参数转发,便于邀请流中引导用户到注册页或预填邮箱。 - Auth 配置稳定化(
@backstage/plugin-auth-backend@0.29.2,e2b3472、2aeb246):Client ID Metadata Documents(CIMD)晋升为稳定配置auth.clientIdMetadataDocuments,旧的auth.experimentalClientIdMetadataDocuments保留为弃用别名;启用 CIMD 或动态客户端注册后,/v1/revoke令牌撤销端点可用,并通过 OpenID provider 配置的revocation_endpoint通告。动态客户端注册现在会打印弃用警告,建议迁移到 CIMD(见 OidcRouter.ts 中的警告文案)。 @backstage/ui与核心组件:新增多行文本输入组件TextAreaField(遵循TextField约定,支持 label、secondary label 与 description);CopyTextButton内部从 MUI 迁移到 BUI(API 不变);表格筛选侧栏不再渲染多余的0。
十一、升级清单速查
按以下顺序完成 v1.53.0 的升级,可将破坏性变更的影响降到最低:
- 使用 Upgrade Helper 核对目标版本,按本文第二、四节处理代理与 OpenAPI 变更;
- 移除
@useoptic/optic、global-agent、undici依赖,安装oasdiffCLI; - 测试代码中
wrapInOpenApiTestServer全部替换为wrapServer(导入路径@backstage/backend-openapi-utils/testUtils); - 删除已废弃的
package schema openapi init/repo schema openapi test调用,改用oasdiff输出格式解析 diff 结果; - 若连接类型作者,为每个认证方法补充
title定义; - 检查 Catalog 本地化文案是否需补充
entityLabels.*新翻译键,并核对moreButtonAriaLabel取值; - MCP 客户端切换为 Streamable HTTP transport(
/api/mcp-actions/v1); - 审视自定义实体页头:优先迁移到新的 BUI-ready 实体页头扩展点,再移除 legacy 回退依赖。
结语
v1.53.0 是 Backstage 在"去重与现代化"方向上的一次集中推进:代理层收敛到 Node.js 内置能力、OpenAPI 工具链切换到oasdiff、用户设置与认证配置走向稳定持久化、Catalog 实体页与上下文菜单全面 BUI 化。这些变更虽然包含多个 BREAKING 项,但迁移路径清晰、回退机制保留完整,结合本文给出的源码定位与配置示例,可以平稳完成升级并立即用上新能力。
【免费下载链接】backstageBackstage is an open framework for building developer portals项目地址: https://gitcode.com/GitHub_Trending/ba/backstage
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考