Backstage v1.5.0 版本解读:GitHub Entity Provider、插件重配置实验 API 与后端系统演进
【免费下载链接】backstageBackstage is an open framework for building developer portals项目地址: https://gitcode.com/GitHub_Trending/ba/backstage
导读
本文基于 Backstage 仓库中的官方发布说明 docs/releases/v1.5.0.md,对 v1.5.0 版本的核心变更进行逐项解读与源码级印证。你将了解到:GitHub Entity Provider 如何取代旧式GithubDiscoveryProcessor成为目录实体自动发现的首选方案、插件级重配置实验 API 与全新@backstage/backend-defaults包所预示的后端系统演进方向,以及该版本引入的三个新插件(AWS Proton、GitHub Issues、Sonarqube 后端)与 Bitbucket Server 目录模块的安装与使用方式。
版本概览
v1.5.0 是 Backstage 在软件目录(Software Catalog)、插件生态与后端架构三条主线上的一个重要里程碑。整体来看,本版本的核心信号可以概括为三点:
- 发现能力从 Processor 走向 Entity Provider:
GitHubEntityProvider被正式引入并推荐用于 GitHub 项目的目录实体发现,这是对既有GithubDiscoveryProcessor的升级替代。 - 插件定制化开始"实验化"落地:新增允许插件作者声明插件级选项(plugin-wide options)的实验 API,让采用者可以针对自身应用重新配置插件。
- 后端系统演进迈出关键一步:发布高度实验性的
@backstage/backend-defaults包,为后续新后端系统(New Backend System)铺路。
此外,本版本没有任何安全修复("This release does not contain any security fixes"),升级路径上官方建议保持项目与最新版本同步。完整变更细节可查阅仓库内的 v1.5.0-changelog.md。
GitHub Entity Provider:目录发现的新首选
从 Processor 到 Entity Provider 的演进
v1.5.0 新增了GitHubEntityProvider,它可以从 GitHub 项目中自动发现 catalog 实体定义文件(如catalog-info.yaml),并注册为 Location 实体,再经后续处理步骤将所有实体加入软件目录。该能力是对此前GithubDiscoveryProcessor的改进,发布说明中明确建议:
"we recommend using entity providers rather than processors for discovery and ingestion when possible"
(尽可能使用 Entity Provider 而非 Processor 进行发现与摄取。)
有趣的是,在当前仓库源码中仍能同时看到新旧两种命名的痕迹:plugins/catalog-backend-module-github/src/deprecated.ts 中保留了旧式驼峰命名的GitHubEntityProvider类,但其内部实现已经退化为对GithubEntityProvider的薄委托(delegate),并输出[Deprecated] Please use GithubEntityProvider instead of GitHubEntityProvider.的告警日志——这从源码层面印证了 v1.5.0 之后"Entity Provider 取代 Processor"的演进被完整落实。当前推荐的实现位于 GithubEntityProvider.ts,它同时实现了EntityProvider与EventSubscriber两个接口:
EntityProvider:作为目录实体提供者接入 catalog,getProviderName()返回形如github-provider:<id>的实例名;EventSubscriber:订阅github.push与github.repository两个事件主题(见源码中的EVENT_TOPICS常量),实现基于事件的增量刷新。
fromConfig静态工厂会为catalog.providers.github配置中的每个 provider ID 创建独立实例;若未配置schedule或scheduler,会直接抛出Either schedule or scheduler must be provided.错误,这一点在接入时必须注意。
安装与接入
GitHub Entity Provider 默认并未安装在 backend 中,需要显式添加依赖(命令在仓库根目录执行):
yarn --cwd packages/backend add @backstage/plugin-catalog-backend-module-github然后在 backend 入口(新后端系统写法)中注册模块:
// packages/backend/src/index.ts backend.add(import('@backstage/plugin-catalog-backend')); backend.add(import('@backstage/plugin-catalog-backend-module-github'));配置详解
使用发现 Provider 前,需要先配置好 GitHub 集成(docs/integrations/github/locations.md),认证方式可以是 Personal Access Token(至少需要repo权限)或 GitHub App(至少需要Contents: Read-only权限)。完整说明见 docs/integrations/github/discovery.md。
核心配置结构如下(配置项注释来自仓库文档原文):
catalog: providers: github: # provider ID 可以是任意 camelCase 字符串 providerId: organization: 'backstage' # string,必填(除非设置 app) catalogPath: '/catalog-info.yaml' # string,默认 /catalog-info.yaml filters: branch: 'main' # string,可选 repository: '.*' # Regex,可选 schedule: # 与 SchedulerServiceTaskScheduleDefinition 一致 frequency: { minutes: 30 } # 支持 cron、ISO duration、human duration timeout: { minutes: 3 } # 支持 ISO duration、human duration各关键配置项的作用与约束:
catalogPath(可选,默认/catalog-info.yaml):指定查找 catalog 文件的位置,支持*、**等 minimatch glob 通配符;但通配符与validateLocationsExist: true互斥,源码中对此有显式校验(GithubEntityProviderConfig.ts)。filters.branch(可选):按分支名过滤,分支名中不允许包含斜杠(/),默认使用仓库默认分支;源码中同样有对应的非法字符校验。filters.repository(可选):按仓库名的正则表达式过滤。filters.topic.include/filters.topic.exclude(可选):按 GitHub topic 过滤,两者可同时使用,但exclude 优先级最高——一个同时带backstage-include和experiments两个 topic 的仓库仍会被排除。filters.visibility(可选):按可见性过滤,可选值private、internal、public。filters.allowArchived(可选):是否纳入已归档仓库,默认false。filters.allowForks(可选):是否纳入 fork 仓库,默认true(该默认值在 GithubEntityProviderConfig.ts 中可确认)。host(可选):GitHub Enterprise 实例主机名,必须与integrations.github中配置的主机一致。organization/app:二选一必填;organization为组织名,app为 GitHub App ID,一个 provider 配置只能对应其一,多组织需配置多个 provider ID。validateLocationsExist(可选,默认false):在发射位置前校验 catalog 文件是否真实存在,避免为不存在的文件生成 Location。schedule:frequency(执行频率)、timeout(单次执行超时)、initialDelay(首次执行延迟)、scope(global或local,并发控制范围)。pageSizes.repositories(可选,默认25):控制 GitHub GraphQL 每页拉取的仓库数,遇到RESOURCE_LIMITS_EXCEEDED错误时可调小。
Provider 支持通过唯一 provider ID 配置多个组织/应用;官方文档也提示:可以跳过 provider ID 层(此时默认使用default作为 ID),但不推荐。
速率限制注意事项
GitHub API 对普通账户的限制为每小时 5,000 次请求(Enterprise 账户更高)。文档给出的示例是每 35 分钟刷新一次目录数据,每次刷新会对每个发现的位置发起一次 API 请求;请求过于频繁会被限流。若采用自动发现方式,务必通过schedule控制刷新频率:
schedule: frequency: { minutes: 35 } timeout: { minutes: 3 }此外,使用 GitHub App 认证可以享受远高于 Personal Access Token 的速率限制,是规避限流的重要补充手段(详见 docs/integrations/github/github-apps.md)。
内置事件支持
该 catalog 模块自带事件支持:它会订阅github.push与github.repository主题,并期望这些事件由EventsService发布。使用内置事件支持有两个前置条件:
- 在 GitHub 上创建 Webhook,将其配置为响应
push与repository事件; - 安装并配置
@backstage/plugin-events-backend-module-github。
Webhook 的 Payload URL 形如https://<your-instance-name>/api/events/http/github,Content Type 为application/json。事件模块的路由逻辑是将通用主题github按事件类型分发为更细粒度的事件(如github.push)。
事件接入存在多种传输方式,均在 docs/integrations/github/discovery.md 中详细说明:
- HTTP 端点方式:仅需在
app-config.yaml中开启内置 HTTP 端点:
events: http: topics: - github- AWS SQS 方式:安装
@backstage/plugins-events-backend-module-aws-sqs(注意包名中无backend,与 GitHub 事件模块不同),并通过events.modules.awsSqs配置队列 URL 与区域。 - Google Pub/Sub 方式:安装
@backstage/plugin-events-backend-module-google-pubsub,通过events.modules.googlePubSub配置订阅名与目标主题,例如github.{{ event.attributes.x-github-event }}。 - Kafka 方式:安装
@backstage/plugin-events-backend-module-kafka,通过events.modules.kafka配置 brokers、topic 与 groupId。
无论采用哪种传输方式,都建议为 GitHub 事件模块配置webhookSecret(如${GITHUB_WEBHOOK_SECRET}),以确保收到的请求确实来自 GitHub 而非外部恶意方。
实验性插件重配置 API
v1.5.0 新增了一个实验性 API,允许插件作者为插件定义插件级选项(plugin-wide options),进而让插件的采用者能够基于自身应用场景对插件进行重新配置。该功能面向两类人群:
- 插件作者:通过实验 API 声明插件级配置项;
- 插件采用者:在集成插件时按需覆盖这些选项,使其适配自己的应用。
发布说明中特别提到欢迎对该特性提供反馈("Feedback is welcome on this new feature!"),表明其仍处于快速迭代阶段,生产环境采用时需谨慎评估。插件定制化的入门指南见 docs/plugins/customization.md(该文档路径在发布说明中以"plugin customization"指向,读者可从 docs/plugins/ 目录获取最新版定制化指引)。
从架构视角看,这一实验 API 的意义在于:它把"插件的可配置性"从传统的 app-config 配置项扩展到了代码层面的构造参数,为后续插件生态的标准化定制打下了基础。
实验性后端系统演进:@backstage/backend-defaults
本版本引入了全新的@backstage/backend-defaults包,它是 后端系统演进(backend system evolution) 的一部分。发布说明对该包的态度非常明确:
"This package is highly experimental and we do not recommend using it for any purpose, yet."
(该包高度实验性,暂不建议用于任何用途。)
在演进过程中,标准 Backstage 后端应用所需服务的默认实现被逐步收敛到该包中。从当前仓库的 packages/backend-defaults/README.md 可以看到其定位:"This package provides the default implementations and setup for a standard Backstage backend app."(为标准的 Backstage 后端应用提供默认实现与装配)。仓库内该包的 API 报告按服务维度拆分(如report-auth.api.md、report-cache.api.md、report-database.api.md、report-discovery.api.md、report-httpRouter.api.md、report-logger.api.md等,见 packages/backend-defaults),直观展示了新后端系统中"服务(Service)"如何被组织为可插拔、可替换的默认实现。
安装方式(在仓库根目录执行):
yarn --cwd packages/backend add @backstage/backend-defaults需要强调的是:v1.5.0 发布时该包尚不可用于生产,后续演进细节可参考 docs/backend-system/building-backends/01-index.md 与 docs/backend-system/architecture/02-backends.md,了解新后端系统最终如何将核心服务(如配置、日志、数据库、缓存、URL 读取等)统一纳入backend-defaults的默认实现体系。
新插件与新模块
@aws/aws-proton-plugin-for-backstage
v1.5.0 将 AWS Proton 集成引入 Backstage,使用户可以在 Backstage 中直接与 AWS Proton 交互。该插件面向使用 AWS Proton 进行基础设施与模板管理的团队,作为第三方贡献插件(贡献者 [@clareliguori],PR #12193)进入官方插件列表。AWS Proton 插件在仓库的插件目录数据中可查(microsite/data/plugins)。
@backstage/plugin-github-issues
该前端插件用于在实体页面展示 GitHub issues,例如在某个组件(Component)实体下集中展示其关联仓库的 issue 列表。它通常与github集成配合使用,插件元数据同样记录在 microsite/data/plugins/ 目录。安装后,插件会利用实体上配置的 GitHub 仓库信息拉取并渲染对应 issue。
@backstage/plugin-sonarqube-backend
该后端插件用于替代 Sonarqube 的代理(proxy)配置。升级路径非常明确:
"once it is installed, you can remove the
/sonarqubeproxy entry."
即安装此后端插件后,需要同步删除app-config.yaml中proxy.endpoints['/sonarqube']的代理条目,避免请求被代理层拦截。这一变更的价值在于:Sonarqube 的访问从"前端代理转发"收敛为"后端插件直连",更符合 Backstage 后端统一鉴权与服务调用的演进方向。插件在仓库中的入口数据可见于 microsite/data/plugins/sonarqube.yaml。
@backstage/plugin-catalog-backend-module-bitbucket-server
该新模块为 catalog 后端新增了BitbucketServerEntityProvider,支持从 Bitbucket Server 安装中自动发现实体,与 GitHub Entity Provider 的定位一致——都是"以 Provider 替代 Processor"的发现方案。
从源码 BitbucketServerEntityProvider.ts 可以看到该 Provider 的关键实现约束:
fromConfig会根据配置中的每个 provider 生成一个实例,并通过ScmIntegrations.fromConfig(config)按host匹配 Bitbucket Server 集成,若找不到匹配会抛出No BitbucketServer integration found that matches host <host>;schedule或scheduler必须提供其一,否则直接抛错(Either schedule or scheduler must be provided.);若代码与配置都未提供调度,还会针对具体 provider ID 抛出更明确的错误;- 支持可选注入
events(订阅bitbucketServer.repo:refs_changed事件,见源码顶部TOPIC_REPO_REFS_CHANGED常量)、parser(自定义 Location 解析器)、catalogApi与auth服务,从而具备事件驱动的增量发现能力。
该模块为 Bitbucket Server 用户提供了与 GitHub 对等的自动发现体验,是 v1.5.0 在"多 SCM 平台目录发现"能力上的重要补全。
升级路径与注意事项
v1.5.0 发布说明给出的升级建议是:保持 Backstage 项目与最新版本同步。完整升级指引见 docs/getting-started/keeping-backstage-updated.md。针对本版本,升级时需特别关注:
- Sonarqube 用户:若安装
@backstage/plugin-sonarqube-backend,务必同步删除/sonarqube代理配置; - GitHub 发现用户:若此前使用
GithubDiscoveryProcessor,应规划迁移到GithubEntityProvider(Entity Provider 方案);当前仓库中旧式GitHubEntityProvider已标记为 deprecated 并仅作委托转发; - 实验特性谨慎使用:插件重配置 API 与
@backstage/backend-defaults均为实验性能力,v1.5.0 发布说明明确不建议将其用于生产。
小结
Backstage v1.5.0 是一次承上启下的版本:在目录发现层面确立了"Entity Provider 优先"的实践规范(GitHub 与 Bitbucket Server 双线落地);在插件生态层面引入了插件级重配置的实验 API 与三个新插件(AWS Proton、GitHub Issues、Sonarqube Backend);在后端架构层面发布了@backstage/backend-defaults,标志着后端系统演进从设计走向代码交付。对于正在规划目录自动化与插件定制的团队而言,理解本版本的变更脉络,有助于把握 Backstage 后续数个版本的能力演进主线。
【免费下载链接】backstageBackstage is an open framework for building developer portals项目地址: https://gitcode.com/GitHub_Trending/ba/backstage
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考