diff --git a/.changeset/sharp-eagles-peel.md b/.changeset/sharp-eagles-peel.md new file mode 100644 index 0000000000..8a1cace3f1 --- /dev/null +++ b/.changeset/sharp-eagles-peel.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': patch +--- + +Support custom file name for `catalog:write` action diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.test.ts index 48c44f090a..8b1be0c187 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.test.ts @@ -69,4 +69,33 @@ describe('catalog:write', () => { yaml.stringify(entity), ); }); + + it('should support a custom filename', async () => { + const entity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + name: 'n', + namespace: 'ns', + annotations: { + [ORIGIN_LOCATION_ANNOTATION]: 'url:https://example.com', + }, + }, + spec: {}, + }; + + await action.handler({ + ...mockContext, + input: { + filePath: 'some-dir/entity-info.yaml', + entity, + }, + }); + + expect(fsMock.writeFile).toHaveBeenCalledTimes(1); + expect(fsMock.writeFile).toHaveBeenCalledWith( + resolvePath(mockContext.workspacePath, 'some-dir/entity-info.yaml'), + yaml.stringify(entity), + ); + }); }); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts index b813244020..46220358c7 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts @@ -21,13 +21,18 @@ import { Entity } from '@backstage/catalog-model'; import { resolveSafeChildPath } from '@backstage/backend-common'; export function createCatalogWriteAction() { - return createTemplateAction<{ name?: string; entity: Entity }>({ + return createTemplateAction<{ filePath?: string; entity: Entity }>({ id: 'catalog:write', description: 'Writes the catalog-info.yaml for your template', schema: { input: { type: 'object', properties: { + filePath: { + title: 'Catalog file path', + description: 'Defaults to catalog-info.yaml', + type: 'string', + }, entity: { title: 'Entity info to write catalog-info.yaml', description: @@ -39,10 +44,11 @@ export function createCatalogWriteAction() { }, async handler(ctx) { ctx.logStream.write(`Writing catalog-info.yaml`); - const { entity } = ctx.input; + const { filePath, entity } = ctx.input; + const path = filePath ?? 'catalog-info.yaml'; await fs.writeFile( - resolveSafeChildPath(ctx.workspacePath, 'catalog-info.yaml'), + resolveSafeChildPath(ctx.workspacePath, path), yaml.stringify(entity), ); },