Skip to main content

编写自定义操作

如果您想扩展 Scaffolder 的功能,可以通过编写自定义操作来实现。内置动作.

注意:添加自定义操作时,操作数组也将替换内置操作。 也就是说,您将无法再使用它们。 > 如果您想继续使用内置操作,请在注册自定义操作时将它们包含在操作 > 数组中,如下所示。

撰写自定义操作

您可以选择自定义操作的位置,但最简单的方法是将其与您的backend软件包中packages/backend.

让我们创建一个简单的操作,添加一个新文件和一些内容,这些内容以input功能。

packages/backend/src/plugins/scaffolder/actions/custom.ts我们可以创建一个新的操作。

With Zod
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:

With JSON Schema
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:creategithub: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 the zod or JSON schema provided in the schema.input part of the action definition * ctx.output - a function which you can call to set outputs that match the JSON schema or zod in schema.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 the workspacePath * ctx.metadata - an object containing a name 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|高拉夫-潘迪|

玩得开心! 🚀