目录实体描述符格式
本节介绍目录实体的默认数据形状和语义。
这既适用于向软件编目 API 提供和从 API 返回的对象,也适用于软件编目可以本地摄取的描述符文件。 在 API 的请求/响应循环中,使用的是 JSON 表示法,而描述符文件则采用 YAML 格式,以便于人工维护。 不过,这两种情况下的结构和语义是相同的。
虽然目录实体描述符文件可以随意命名,但我们建议命名为catalog-info.yaml
.
内容
- Overall Shape Of An Entity * Common to All Kinds: The Envelope * Common to All Kinds: The Metadata * Common to All Kinds: Relations * Common to All Kinds: Status * Kind: Component * Kind: Template * Kind: API * Kind: Group * Kind: User * Kind: Resource * Kind: System * Kind: Domain * Kind: Location
实体的整体形状
下面是组件实体描述符文件的示例:
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
name: artist-web
description: The place to be, for great artists
labels:
example.com/custom: custom_label_value
annotations:
example.com/service-discovery: artistweb
circleci.com/project-slug: github/example-org/artist-website
tags:
- java
links:
- url: https://admin.example-org.com
title: Admin Dashboard
icon: dashboard
type: admin-dashboard
spec:
type: website
lifecycle: production
owner: artist-relations-team
system: public-websites
这与软件目录 API 返回的 JSON 格式实体相同:
{
"apiVersion": "backstage.io/v1alpha1",
"kind": "Component",
"metadata": {
"annotations": {
"backstage.io/managed-by-location": "file:/tmp/catalog-info.yaml",
"example.com/service-discovery": "artistweb",
"circleci.com/project-slug": "github/example-org/artist-website"
},
"description": "The place to be, for great artists",
"etag": "ZjU2MWRkZWUtMmMxZS00YTZiLWFmMWMtOTE1NGNiZDdlYzNk",
"labels": {
"example.com/custom": "custom_label_value"
},
"links": [
{
"url": "https://admin.example-org.com",
"title": "Admin Dashboard",
"icon": "dashboard",
"type": "admin-dashboard"
}
],
"tags": ["java"],
"name": "artist-web",
"uid": "2152f463-549d-4d8d-a94d-ce2b7676c6e2"
},
"spec": {
"lifecycle": "production",
"owner": "artist-relations-team",
"type": "website",
"system": "public-websites"
}
}
根字段apiVersion
,kind
,metadata
和spec
是_信封同样,一些元数据字段,如name
,labels
和annotations
它们具有特殊的意义,并有特定的用途和独特的形状。
有关这些字段的详细信息,请参阅下文。
描述符格式中的替换
描述符格式支持使用以下方法进行替换$text
,$json
和$yaml
.
占位符,如$json: https://example.com/entity.json
被引用文件的内容所替代。 文件可以从任何配置的集成中引用,类似于通过传递绝对 URL 引用位置。 也可以引用相对文件,如./referenced.yaml
相对引用的处理是相对于catalog-info.yaml
有三种不同类型的占位符:
$text
: 将引用文件的内容解释为纯文本,并将其嵌入为字符串。$json
: 将引用文件的内容解释为 JSON,并嵌入解析后的结构。$yaml
: 将引用文件的内容解释为 YAML,并嵌入解析后的结构。
例如,这可用于从网络服务器加载 API 实体的定义,并将其作为字符串嵌入字段中spec.definition
:
apiVersion: backstage.io/v1alpha1
kind: API
metadata:
name: petstore
description: The Petstore API
spec:
type: openapi
lifecycle: production
owner: [email protected]
definition:
$text: https://petstore.swagger.io/v2/swagger.json
请注意,要读取正常集成点以外的目标,如github.com
中添加一个条目来明确允许它。backend.reading.allow
例如,可以指定路径来进一步限制目标:
backend:
baseUrl: ...
reading:
allow:
- host: example.com
- host: '*.examples.org'
- host: example.net
paths: ['/api/']
所有种类的共同点:信封
根信封对象的结构如下
apiVersion
和 kind
[必填]
kind
是描述的高层实体类型。ADR005描述了一些插件可以知道和理解的核心种类,但使用 Backstage 的组织也可以自由地在目录中添加其他种类的实体。
目录在初始阶段关注的最核心的实体可能是Component
(见下).
apiVersion
是规范所针对的特定实体的规范格式的版本。 版本用于格式的演进,而apiVersion
和kind
应该足以让解析器知道如何解释其余数据的内容。
Backstage特定实体有一个apiVersion
的backstage.io/
在将这些规范与 Kubernetes 对象清单等共同托管时,或在组织向目录中添加自己特定类型的实体时,这一点可能很重要。
早期版本的目录将使用 alpha/beta 版本,例如backstage.io/v1alpha1
之后,我们将使用backstage.io/v1
及以上。
metadata
[必填]
包含实体元数据的结构,即不直接属于实体规范本身的内容。 有关此结构的更多详情,请参阅下文。
spec
[varies] [不同]
描述实体的实际规范数据。
的确切结构spec
取决于apiVersion
和kind
组合,有些种类甚至可能没有spec
有关具体类型的规范结构,请参见本文档的后续内容。
所有类型的共同点:元数据
metadata
根字段有一些具有特定含义的保留字段,如下所述。
除此以外,您还可以直接在以下字段中添加任意数量的其他字段metadata
但请注意,一般的插件和工具可能无法理解它们的语义。 参见扩展模型了解更多信息。
name
[必填]
实体名称:该名称既可用于人眼识别实体,也可用于机器和其他组件引用实体(如 URL 或其他实体规范文件)。
在给定的名称空间(如有指定)内,名称在任何时间点都必须是唯一的。 这种唯一性约束不区分大小写。 从注册表中删除实体后,名称可在以后重复使用。
名称必须遵循一定的格式。 不遵循这些规则的实体将不被接受在目录中注册。 规则集可根据贵组织的需要进行配置,但默认行为如下。
- 长度至少为 1,最多为 63 的字符串 * 必须由"[a-z0-9A-Z]"序列组成,可能由"[-_.]"分隔。
例如visits-tracking-service
,CircleciBuildsDumpV2_avro_gcs
namespace
[可选]
实体所属命名空间的 ID。 该字段为可选字段,目前除了用于约束名称唯一性(如果指定)外,没有其他特殊语义。 该字段保留给将来使用,以后可能会有更广泛的语义含义。
目前,建议不要指定名称空间,除非有特殊需要。"default"
命名空间。
命名空间必须是[a-zA-Z0-9]
,可能以-
命名空间名称不区分大小写,在大多数情况下会以小写字母显示。
例如tracking-services
,payment
uid
[输出]
每个实体在首次进入数据库时都会获得一个自动生成的全局唯一 ID,这个字段不是作为输入数据指定的,而是由数据库引擎在生成输出实体时自行创建的。
请注意uid
值为不是被视为稳定,并应不是可用作实体的外部引用。uid
即使人类观察者可能认为它不会随时间而改变,它也会随时间而改变。 作为众多例子之一,取消注册和重新注册完全相同的文件会导致不同的uid
因此,很少有理由从 外部读取或使用该字段。
如果要通过某种形式的标识符来引用实体,应始终使用字符串形式的实体引用而不是
title
[可选]
实体的显示名称,用于在用户界面中显示,而不是使用name
如果有的话,可以使用上述属性。
当name
标题一般没有那么严格的格式要求,因此可以包含特殊字符,解释性更强。 但一定要简短,避免标题与其他实体的名称相混淆,或两个实体共用一个标题。
请注意,这仅用于显示目的,代码的某些部分可能会忽略它。实体参考仍然经常使用name
而不是标题。
description
[可选]
对实体的可读描述,显示在 Backstage 中。 应保持简短和信息丰富,适合一目了然地概述实体的目的。 更详细的解释和文档应放在其他地方。
labels
[可选]
标签是附加到实体的可选键/值对,其用法与Kubernetes 对象标签.
它们的主要用途是对其他实体的引用,以及以某种方式对当前实体进行分类的信息。 它们通常用作查询或筛选器中的值。
键和值都是字符串,但有以下限制。
键值有一个可选的前缀,后面跟一个斜线,然后是必须的名称部分。 如果有前缀,前缀必须是一个有效的小写域名,总共最多 253 个字符。 名称部分必须是以下的序列[a-zA-Z0-9]
任何一个[-_.]
总共最多 63 个字符。
backstage.io/
前缀保留给Backstage核心组件使用。
值是字符串,其限制与name
以上。
annotations
[可选]
一个对象,实体上附有任意的非标识性元数据,在使用上与Kubernetes 对象注解.
用户可以在描述符 YAML 文件中添加这些注释,但除此之外,自动化系统也可以添加注释,可以在编录过程中添加,也可以在稍后添加。
键和值都是字符串,但有以下限制。
键值有一个可选的前缀,后面跟一个斜线,然后是必填的名称部分。 如果指定了前缀,前缀必须是一个有效的小写域名,总共最多 253 个字符。 名称部分必须是以下的序列[a-zA-Z0-9]
任何一个[-_.]
总共最多 63 个字符。
backstage.io/
前缀保留给Backstage核心组件使用。
值的长度不限,但仅限于字符串。
有一份知名注释但任何人都可以自由添加他们认为合适的注释。
tags
[可选]
单值字符串列表,用于以各种方式对目录实体进行分类。 这与元数据中的标签不同,因为标签是键值对。
数值由用户定义,例如组件使用的编程语言,如java
或go
.
该字段为可选字段,目前没有特殊语义。
每个标记的序列必须是[a-z0-9:+#]
相隔-
总共最多 63 个字符。
links
[可选]
与实体相关的外部超链接列表。 链接可提供Backstage本身以外的其他上下文信息。 例如,管理仪表板或外部内容管理系统页面。
用户可以在描述符 YAML 文件中添加链接,以便为外部内容和资源提供额外的参考信息。 链接的目的不是为了在 Backstage 中驱动任何额外的功能,这些功能最好交由annotations
和labels
建议仅在有同等知名度的情况下使用链接。annotation
并不涵盖类似的用例。
链接的字段有
| 字段 | 类型 | 说明 | | ------- | ------ | ------------------------------------------------------------------------------------ | | | |url
| 字符串[必填]Aurl
在标准uri
格式(例如https://example.com/some/page
) | |title
| 字符串[可选]链接的用户友好显示名称。icon
| 字符串[可选]表示要在用户界面中显示的可视化图标的键。type
| 字符串[可选]可选值,用于将链接归入特定组别。
_注:"......icon
字段值是一个语义键,可映射到图标库提供的特定图标(例如material-ui
这些键应该是一连串的[a-z0-9A-Z]
,可能由以下其中一个分隔[-_.]
Backstage 可能支持一些开箱即用的基本图标,例如在 app-defaults 中定义如果无法解决映射问题,将提供一个通用的后备图标。
的语义。type
采用者可自由定义自己的类型集,并按自己的意愿加以利用。 一些潜在的用例可以是利用类型字段来验证实体上是否存在某些链接,或为特定链接类型创建定制的用户界面组件。
所有种类的共同点:关系
relations
根字段是当前实体与其他实体之间关系的只读列表。知名关系科关系通常是双向的,因此有一对关系类型,每个类型描述关系的一个方向。
作为从应用程序接口读出的单一实体的一部分,关系可能如下所示。
{
// ...
"relations": [
{
"type": "ownedBy",
"targetRef": "group:default/dev.infra"
}
],
"spec": {
"owner": "dev.infra",
// ...
}
}
关系的字段有
| 字段 | 类型 | 说明 | | ----------- | ------ | -------------------------------------------------------------------------- | | | |targetRef
| 字符串实体参考到关系的另一端。type
| 字符串 | 从源实体到目标实体的关系类型。metadata
| 对象 | 保留供将来使用。
实体描述符 YAML 文件不应该包含这个字段,相反,目录处理器会分析实体描述符数据及其周围环境,并推导出关系,然后将这些关系附加到从目录读取的实体上。
在产生关系的地方,它们应被视为该数据的权威来源。 在上面的例子中,插件最好使用关系,而不是spec.owner
来推断实体的所有者,因为甚至可能根本不是从 YAML 中获取所有者信息,而是从附近的 CODEOWNERS 文件中获取。 此外,Ownersspec.owner
是简写形式,可能有与之相关的语义(例如默认类型为Group
如果未指定)。
参见知名关系科中列出的知名/常见关系及其语义。
所有类型的共同点:状态
status
根对象是一组只读状态,与实体的当前状态或健康状况有关,在知名状态部分.
目前,唯一定义的字段是items
数组中的每个项都包含一个特定的数据结构,从某个特定系统的角度来描述实体状态的某些方面。 不同的系统可以根据各自的type
钥匙
该字段的当前主要用途是用于目录本身的摄取流程,以便将错误和警告信息反馈给用户。
作为从应用程序接口读出的单一实体的一部分,状态字段可能如下所示。
{
// ...
"status": {
"items": [
{
"type": "backstage.io/catalog-processing",
"level": "error",
"message": "NotFoundError: File not found",
"error": {
"name": "NotFoundError",
"message": "File not found",
"stack": "..."
}
}
]
},
"spec": {
// ...
}
}
状态项目的字段有
| 字段 | 类型 | 说明 | | --------- | ------ | ------------------------------------------------------------------------------------------------ | | | |type
| 字符串 | 状态类型,作为每个信息源的唯一关键字。 每种类型在数组中可能出现多次。level
| 状态项的级别/严重程度:"info"(信息)、"warning"(警告)或 "error"(错误)。message
| 字符串 | 描述状态的简短信息,供人阅读。error
| 与状态相关的可选序列化错误对象。
type
是一个任意字符串,但我们建议对组织内部非严格私有的类型进行命名,以避免碰撞。 例如,Backstage核心进程发出的类型将以backstage.io/
如上例所示。
实体描述符 YAML 文件不应包含status
取而代之的是,目录处理器分析实体描述符数据及其周 围环境,并推导出状态条目,然后从目录中读取附加到实体上。
参见知名状态部分查看知名/常见状态类型列表。
类型:组件
描述以下实体种类:
| 域 | 值 | | ------------ | ----------------------- | | |apiVersion
|backstage.io/v1alpha1
| |kind
|Component
|
组件描述的是一个软件组件,通常与构成该组件的源代码密切相关,应被开发人员视为一个 "软件单元",通常具有独特的可部署或可链接的工件。
这种类型的描述符文件可能如下所示。
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
name: artist-web
description: The place to be, for great artists
spec:
type: website
lifecycle: production
owner: artist-relations-team
system: artist-engagement-portal
dependsOn:
- resource:default/artists-db
providesApis:
- artist-api
除了通用信封元数据这种形状的结构如下
apiVersion
和 kind
[必填]
恰好等于backstage.io/v1alpha1
和Component
分别为
spec.type
[必填]
以字符串形式表示的组件类型,例如website
该字段为必填字段。
软件目录接受任何类型的值,但组织应非常小心地为这些类型建立适当的分类。 包括Backstage本身在内的工具可能会读取该字段,并根据其值采取不同的行为。 例如,网站类型组件可能会在Backstage界面中显示专门针对网站的工具。
该字段的当前常用值为
- 服务"--后端服务,通常公开一个应用程序接口 * "网站"--网站 * "库"--软件库,如 npm 模块或 Java 库
spec.lifecycle
[必填]
组件的生命周期状态,例如production
该字段为必填字段。
软件目录可接受任何生命周期价值,但企业应非常谨慎地为这些价值建立适当的分类法。
该字段的当前常用值为
- 实 验性"(experimental)--实验性或早期的、非生产性组件,表明用户可能不喜欢使用它,而喜欢使用其他更成熟的组件,或表明可靠性保证较低或没有保证 * "生产性"(production)--成熟的、自有的、受维护的组件 * "废弃的"(deprecated)--处于生命周期末期的组件,可能会在以后某个时间点消失
spec.Owner
[必填]
一个实体参考给组件的 Owner,例如artist-relations-team
该字段为必填字段。
在 Backstage 中,一个组件的 Owner 是对该组件负最终责任的唯一实体(通常是一个团队),它拥有开发和维护该组件的权力和能力。 如果出现问题或需要功能,他们将是联系人。 该字段的主要用途是在 Backstage 中显示,以便查看目录项的人了解该组件属于谁。 它不能用于自动化流程,例如在运行时系统中分配授权。 可能还有其他人也开发或以其他方式接触该组件,但最终的所有者始终只有一个。
|种类| 默认值名称空间| 生成联系类型 | | ------------------------------------------------------ | | ------------------------------------------ | ------------------------------------------------------------------------------- | | |组(默认)、用户| 与本实体相同,通常default
|所有者|