编写自定义操作
如果您想扩展 Scaffolder 的功能,可以通过编写自定义操作来实现。内置动作.
注意:添加自定义操作时,操作数组也将替换内置操作。 也就是说,您将无法再使用它们。 > 如果您想继续使用内置操作,请在注册自定义操作时将它们包含在操作 > 数组中,如下所示。
撰写自定义操作
您可以选择自定义操作的位置,但最简单的方法是将其与您的backend
软件包中packages/backend
.
让我们创建一个简单的操作,添加一个新文件和一些内容,这些内容以input
功能。
在packages/backend/src/plugins/scaffolder/actions/custom.ts
我们可以创建一个新的操作。
import { createTemplateAction } from '@backstage/plugin-scaffolder-node';
import fs from 'fs-extra';
import { z } from 'zod';
export const createNewFileAction = () => {
return createTemplateAction({
id: 'acme:file:create',
schema: {
input: z.object({
contents: z.string().describe('The contents of the file'),
filename: z
.string()
.describe('The filename of the file that will be created'),
}),
},
async handler(ctx) {
await fs.outputFile(
`${ctx.workspacePath}/${ctx.input.filename}`,
ctx.input.contents,
);
},
});
};
让我们来分析一下。createNewFileAction
是一个返回createTemplateAction
的依赖关系的好地方。TemplateAction
看看我们的内置动作供参考。
createTemplateAction
的对象,该对象指定了以下内容:
id
- 您的自定义操作的唯一 ID。 我们鼓励您以某种方式为其命名,这样它们就不会与我们可能随scaffolder-backend
插件一起发布的内置操作相冲突。schema.input
- 用于向您的函数输入值的zod
或 JSON 架构对象 *schema.output
- 用于使用ctx.output
从函数输出值的zod
或 JSON 架构对象 *handler
- 作为操作的一部分运行的实际代码,带有上下文。
您也可以选择使用 JSON 模式定义自定义操作,而不是使用zod
:
import { createTemplateAction } from '@backstage/plugin-scaffolder-node';
import { writeFile } from 'fs';
export const createNewFileAction = () => {
return createTemplateAction<{ contents: string; filename: string }>({
id: 'acme:file:create',
schema: {
input: {
required: ['contents', 'filename'],
type: 'object',
properties: {
contents: {
type: 'string',
title: 'Contents',
description: 'The contents of the file',
},
filename: {
type: 'string',
title: 'Filename',
description: 'The filename of the file that will be created',
},
},
},
},
async handler(ctx) {
const { signal } = ctx;
await writeFile(
`${ctx.workspacePath}/${ctx.input.filename}`,
ctx.input.contents,
{ signal },
_ => {},
);
},
});
};
命名约定
无论是您自己的自定义操作,还是为开源贡献的任何操作,都应尽量保持名称一致。:
我们遵循provider:entity:verb
例如github:actions:create
或github:repo:create
.
如果您愿意,也可以使用您的公司名称为它们命名,例如acme:file:create
如上。
首选使用camelCase
越过snake-case
这样就能更好地读写模板实体定义。
我们也将逐步在版本库中迁移这些内容。
上下文对象
当行动handler
被调用时,我们会为您提供context
它看起来像下面这样:
ctx.baseUrl
- a string where the template is located *ctx.logger
- a Winston logger for additional logging inside your action *ctx.logStream
- a stream version of the logger if needed *ctx.workspacePath
- a string of the working directory of the template run *ctx.input
- an object which should match thezod
or JSON schema provided in theschema.input
part of the action definition *ctx.output
- a function which you can call to set outputs that match the JSON schema orzod
inschema.output
for ex.ctx.output('downloadUrl', myDownloadUrl)
*createTemporaryDirectory
a function to call to give you a temporary directory somewhere on the runner so you can store some files there rather than polluting theworkspacePath
*ctx.metadata
- an object containing aname
field, indicating the template name. More metadata fields may be added later.
注册自定义操作
准备好与脚手架配合使用的自定义动作后,您需要将其传递到scaffolder-backend``createRouter
你应该在packages/backend/src/plugins/scaffolder.ts
return await createRouter({
containerRunner,
catalogClient,
logger: env.logger,
config: env.config,
database: env.database,
reader: env.reader,
});
这里还可以传递另一个属性,它是一个由actions
将设置脚手架持有者可以访问的可用操作。
import { createBuiltinActions } from '@backstage/plugin-scaffolder-backend';
import { ScmIntegrations } from '@backstage/integration';
import { createNewFileAction } from './scaffolder/actions/custom';
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
const catalogClient = new CatalogClient({ discoveryApi: env.discovery });
const integrations = ScmIntegrations.fromConfig(env.config);
const builtInActions = createBuiltinActions({
integrations,
catalogClient,
config: env.config,
reader: env.reader,
});
const actions = [...builtInActions, createNewFileAction()];
return createRouter({
actions,
catalogClient: catalogClient,
logger: env.logger,
config: env.config,
database: env.database,
reader: env.reader,
});
}
自定义行动包列表
以下是可添加到 Backstage scaffolder 后端的开源自定义操作列表:
| 名称 | 软件包 | Owner | | ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------ | | Yeoman |plugin-scaffolder-backend-module-yeoman|Backstage| | Cookiecutter | Cookiecutterplugin-scaffolder-backend-module-cookiecutter|Backstage| | Rails |plugin-scaffolder-backend-module-rails|Backstage| HTTP 请求scaffolder 后端模块-http-request|路人| 实用行动scaffolder-backend-module-utils|路人| AWS cli 操作scaffolder-backend-module-aws|路人| Scaffolder .NET 操作plugin-scaffolder-dotnet 后端|Alef Carlos| Scaffolder Git 操作plugin-scaffolder-git-actions|德鲁-希尔| Azure 管道操作scaffolder-backend-module-azure-pipelines|道格拉斯香水| Azure 存储库操作scaffolder-backend-module-azure-repositories|道格拉斯香水| Snyk 导入项目插件-scaffolder-backend-module-snyk|马修-托马斯| JSON 合并操作plugin-scaffolder-json-merge-actions|德鲁-希尔| 国家预防机制行动plugin-scaffolder-npm-actions|德鲁-希尔| Slack 行动插件-scaffolder-后端-模块-slack|德鲁-希尔| Microsoft Teams 操作plugin-scaffolder-backend-module-ms-teams|高拉夫-潘迪|
玩得开心! 🚀