diff --git a/.changeset/famous-dryers-protect.md b/.changeset/famous-dryers-protect.md new file mode 100644 index 0000000000..b015a562aa --- /dev/null +++ b/.changeset/famous-dryers-protect.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-scaffolder-backend': minor +'@backstage/plugin-scaffolder-node': patch +--- + +Added the ability to use `${{ context.task.id }}` in nunjucks templating, as well as `ctx.task.id` in actions to get the current task ID. diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts index 3990ac14b6..7e204d35df 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts @@ -707,6 +707,34 @@ describe('NunjucksWorkflowRunner', () => { expect(output.foo).toEqual('BACKSTAGE'); }); + + it('should include task ID in the templated context', async () => { + const task = createMockTaskWithSpec({ + apiVersion: 'scaffolder.backstage.io/v1beta3', + steps: [ + { + id: 'test', + name: 'name', + action: 'jest-mock-action', + input: { + values: { + taskId: '${{context.task.id}}', + }, + }, + }, + ], + output: {}, + parameters: {}, + }); + + await runner.execute(task); + + expect(fakeActionHandler).toHaveBeenCalledWith( + expect.objectContaining({ + input: { values: { taskId: 'test-workspace' } }, + }), + ); + }); }); describe('redactions', () => { diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts index c5413a08e0..ad9d85cb2d 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts @@ -80,6 +80,11 @@ type TemplateContext = { ref?: string; }; each?: JsonValue; + context: { + task: { + id: string; + }; + }; }; type CheckpointState = @@ -367,6 +372,9 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { await action.handler({ input: iteration.input, + task: { + id: await task.getWorkspaceName(), + }, secrets: task.secrets ?? {}, // TODO(blam): move to LoggerService and away from Winston logger: loggerToWinstonLogger(taskLogger), @@ -490,6 +498,11 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { parameters: task.spec.parameters, steps: {}, user: task.spec.user, + context: { + task: { + id: taskId, + }, + }, }; const [decision]: PolicyDecision[] = diff --git a/plugins/scaffolder-node-test-utils/src/actions/mockActionContext.ts b/plugins/scaffolder-node-test-utils/src/actions/mockActionContext.ts index b178a1d51d..1d45051753 100644 --- a/plugins/scaffolder-node-test-utils/src/actions/mockActionContext.ts +++ b/plugins/scaffolder-node-test-utils/src/actions/mockActionContext.ts @@ -45,6 +45,9 @@ export const createMockActionContext = < input: {} as TActionInput, checkpoint: jest.fn(), getInitiatorCredentials: () => Promise.resolve(credentials), + task: { + id: 'mock-task-id', + }, }; const createDefaultWorkspace = () => ({ @@ -58,8 +61,15 @@ export const createMockActionContext = < }; } - const { input, logger, logStream, secrets, templateInfo, workspacePath } = - options; + const { + input, + logger, + logStream, + secrets, + templateInfo, + workspacePath, + task, + } = options; return { ...defaultContext, @@ -71,6 +81,7 @@ export const createMockActionContext = < ...(logStream && { logStream }), ...(input && { input }), ...(secrets && { secrets }), + ...(task && { task }), templateInfo, }; }; diff --git a/plugins/scaffolder-node/report.api.md b/plugins/scaffolder-node/report.api.md index c14a689d1a..1141f0ada0 100644 --- a/plugins/scaffolder-node/report.api.md +++ b/plugins/scaffolder-node/report.api.md @@ -41,6 +41,9 @@ export type ActionContext< ): void; createTemporaryDirectory(): Promise; getInitiatorCredentials(): Promise; + task: { + id: string; + }; templateInfo?: TemplateInfo; isDryRun?: boolean; user?: { diff --git a/plugins/scaffolder-node/src/actions/types.ts b/plugins/scaffolder-node/src/actions/types.ts index 5dd9d5526f..171d3d82db 100644 --- a/plugins/scaffolder-node/src/actions/types.ts +++ b/plugins/scaffolder-node/src/actions/types.ts @@ -57,6 +57,13 @@ export type ActionContext< */ getInitiatorCredentials(): Promise; + /** + * Task information + */ + task: { + id: string; + }; + templateInfo?: TemplateInfo; /**