diff --git a/.changeset/wild-apes-care.md b/.changeset/wild-apes-care.md new file mode 100644 index 0000000000..36bc822ec8 --- /dev/null +++ b/.changeset/wild-apes-care.md @@ -0,0 +1,7 @@ +--- +'@backstage/plugin-scaffolder-node-test-utils': patch +'@backstage/plugin-scaffolder-backend': minor +'@backstage/plugin-scaffolder-node': patch +--- + +Add step info to scaffolder action context to access the step id and name. diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts index 79a847c46d..8019bd4134 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts @@ -361,6 +361,24 @@ describe('NunjucksWorkflowRunner', () => { expect.objectContaining({ backstageToken: token }), ); }); + + it('should pass step info through', async () => { + const task = createMockTaskWithSpec({ + steps: [ + { + id: 'test', + name: 'name', + action: 'jest-validated-action', + input: { foo: 1 }, + }, + ], + }); + + await runner.execute(task); + + expect(fakeActionHandler.mock.calls[0][0].step.id).toEqual('test'); + expect(fakeActionHandler.mock.calls[0][0].step.name).toEqual('name'); + }); }); describe('conditionals', () => { @@ -1447,6 +1465,35 @@ describe('NunjucksWorkflowRunner', () => { fakeActionHandler.mock.calls[0][0].templateInfo.entity.metadata.name, ).toEqual('test-template'); }); + + it('should have step info in action context during dry run', async () => { + const task = createMockTaskWithSpec( + { + templateInfo: { + entityRef: 'dryRun-Entity', + entity: { metadata: { name: 'test-template' } }, + }, + steps: [ + { + id: 'test', + name: 'name', + action: 'jest-validated-action', + input: { foo: 1 }, + }, + ], + }, + { + backstageToken: token, + }, + true, + ); + + await runner.execute(task); + + expect(fakeActionHandler.mock.calls[0][0].isDryRun).toEqual(true); + expect(fakeActionHandler.mock.calls[0][0].step.id).toEqual('test'); + expect(fakeActionHandler.mock.calls[0][0].step.name).toEqual('name'); + }); }); describe('permissions', () => { diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts index 1542db8438..d069a6bc1c 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts @@ -438,6 +438,10 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { isDryRun: task.isDryRun, signal: task.cancelSignal, getInitiatorCredentials: () => task.getInitiatorCredentials(), + step: { + id: step.id, + name: step.name, + }, }); } diff --git a/plugins/scaffolder-node-test-utils/src/actions/mockActionContext.ts b/plugins/scaffolder-node-test-utils/src/actions/mockActionContext.ts index e2f07f2320..6d2fa4f4d5 100644 --- a/plugins/scaffolder-node-test-utils/src/actions/mockActionContext.ts +++ b/plugins/scaffolder-node-test-utils/src/actions/mockActionContext.ts @@ -54,6 +54,10 @@ export function createMockActionContext< task: { id: 'mock-task-id', }, + step: { + id: 'mock-step-id', + name: 'mock step name', + }, }; const createDefaultWorkspace = () => ({ diff --git a/plugins/scaffolder-node/report.api.md b/plugins/scaffolder-node/report.api.md index d0fd036f29..3d758baebf 100644 --- a/plugins/scaffolder-node/report.api.md +++ b/plugins/scaffolder-node/report.api.md @@ -53,6 +53,10 @@ export type ActionContext< }; signal?: AbortSignal; each?: JsonObject; + step?: { + id?: string; + name?: string; + }; }; // @public (undocumented) diff --git a/plugins/scaffolder-node/src/actions/types.ts b/plugins/scaffolder-node/src/actions/types.ts index 0162d96d95..04b1e77a7a 100644 --- a/plugins/scaffolder-node/src/actions/types.ts +++ b/plugins/scaffolder-node/src/actions/types.ts @@ -93,6 +93,20 @@ export type ActionContext< * Optional value of each invocation */ each?: JsonObject; + + /** + * Step information + */ + step?: { + /** + * The id of step which triggered the action + */ + id?: string; + /** + * The name of the step which triggered the action + */ + name?: string; + }; }; /** @public */