有什么新消息?
那么,我们到了! 🚀
在不同的插件和系统中,Backstage 已经有了多种形式的模板语言。 我们已经有了cookiecutter
语法,我们还在模板中使用了handlebars
模板中的kind: Template
然后,我们想移除对cookiecutter
因此,我们引入了nunjucks
作为fetch:template
动作,该动作基于jinja2
语法,因此它们非常相似。 为了减少混淆并统一使用一种模板语言,我们将正式弃用对handlebars
模板中的kind: Template
具有以下特征的实体apiVersion``scaffolder.backstage.io/v1beta3
并转而使用nunjucks
而不是
这为我们提供了许多内置的filters
(handlebars
帮助器),作为模板作者,这将为您提供更多的灵活性,同时还可以在实体和实际的skeleton
此外,还消除了两种语言之间的细微差别。
我们还删除了许多与handlebars
因为他们现在作为一等公民得到以下两个方面的支持nunjucks
或新的scaffolder
当使用scaffolder.backstage.io/v1beta3``apiVersion
迁移路径非常简单,我们已经消除了编写handlebars
我们来看看有哪些新功能以及如何升级。
将处理器添加到 plugin-catalog-backend
后端
一个重要的更改是将所需的处理器添加到您的packages/backend/src/plugins/catalog.ts
import { ScaffolderEntitiesProcessor } from '@backstage/plugin-scaffolder-backend';
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
const builder = await CatalogBuilder.create(env);
builder.addProcessor(new ScaffolderEntitiesProcessor());
const { processingEngine, router } = await builder.build();
// ..
}
backstage.io/v1beta2
-> scaffolder.backstage.io/v1beta3
最重要的变化是,您需要将apiVersion
模板中的新模板。
kind: Template
apiVersion: backstage.io/v1beta2
apiVersion: scaffolder.backstage.io/v1beta3
${{ }}
而不是 "{{ }}"
一个很大的可读性问题和造成混乱的原因在于handlebars
和yaml
中的引号来封装模板字符串。yaml
这样它就不会尝试将其解析为一个json
这很令人讨厌,因为这意味着所有东西看起来都像字符串。 现在情况不再是这样了,你现在可以删除""
并利用书写漂亮的yaml
能正常工作的文件。
spec:
steps:
input:
allowedHosts: ['github.com']
description: 'This is {{ parameters.name }}'
description: This is ${{ parameters.name }}
repoUrl: '{{ parameters.repoUrl }}'
repoUrl: ${{ parameters.repoUrl }}
不再有 eq
或 not
助手
有了表现力更强的api
那nunjucks
您只需使用内置的nunjucks
和jinja2
式运算符。
spec:
steps:
input:
if: '{{ eq parameters.value "backstage" }}'
if: ${{ parameters.value === "backstage" }}
然后为not
spec:
steps:
input:
if: '{{ not parameters.value "backstage" }}'
if: ${{ parameters.value !== "backstage" }}
好多了,对吧?
不再有 json
助手
现在不再需要这个辅助函数了,因为我们已经添加了对复杂值的支持,并支持额外的基元值,而不是所有值都是一个string
这意味着,现在您可以通过parameters
所有操作都应如期进行,并保持输入模式中声明的类型。
spec:
parameters:
test:
type: number
name: Test Number
address:
type: object
required:
- line1
properties:
line1:
type: string
name: Line 1
line2:
type: string
name: Line 2
steps:
- id: test step
action: run:something
input:
address: '{{ json parameters.address }}'
address: ${{ parameters.address }}
test: '{{ parameters.test }}'
test: ${{ parameters.test }} # this will now make sure that the type of test is a number 🙏
parseRepoUrl
现在是一个过滤器
。
所有呼叫parseRepoUrl
现在是jinja2``filter
这意味着您需要更新语法。
spec:
steps:
input:
repoUrl: '{{ parseRepoUrl parameters.repoUrl }}'
repoUrl: ${{ parameters.repoUrl | parseRepoUrl }}
现在我们也支持复杂值了,希望这个filter
将在未来版本中消失,而RepoUrlPicker
将返回一个对象,因此parameters.repoUrl
就已经是{ host: string; owner: string; repo: string }
🚀
应使用链接而不是命名输出
以前,可以使用命名输出提供指向前台的链接entityRef
和remoteUrl
这些应移至links
根据output
对象。
output:
remoteUrl: {{ steps['publish'].output.remoteUrl }}
entityRef: {{ steps['register'].output.entityRef }}
links:
- title: Repository
url: ${{ steps['publish'].output.remoteUrl }}
- title: Open in catalog
icon: catalog
entityRef: ${{ steps['register'].output.entityRef }}
注意 "破折号"。
nunjucks 编译器会遇到问题,如果id
字段使用破折号字符,因为这些 ID 在作为输出访问时会直接转换为 JavaScript 对象属性。 一种可能的迁移路径是使用camelCase
的操作 ID。
steps:
id: my-custom-action
...
id: publish-pull-request
input:
repoUrl: {{ steps.my-custom-action.output.repoUrl }} # Will not recognize 'my-custom-action' as a JS property since it contains dashes!
steps:
id: myCustomAction
...
id: publishPullRequest
input:
repoUrl: ${{ steps.myCustomAction.output.repoUrl }}
另外,还可以保留dash-case
语法,并像在 JavaScript 中一样使用括号来访问属性:
input:
repoUrl: ${{ steps['my-custom-action'].output.repoUrl }}