From 662d7b0b333d5fc301e412a9d82ea9b38f9be0bc Mon Sep 17 00:00:00 2001 From: Fabio Vincenzi Date: Mon, 11 Nov 2024 13:00:22 +0100 Subject: [PATCH 1/8] Add taskID and tests Signed-off-by: Fabio Vincenzi --- .../tasks/NunjucksWorkflowRunner.test.ts | 28 +++++++++++++++++++ .../tasks/NunjucksWorkflowRunner.ts | 11 +++++++- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts index 0bcbd2f917..ecd9b73750 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts @@ -684,6 +684,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 6f7551568f..d5736ef928 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 = @@ -480,11 +485,15 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { const taskTrack = await this.tracker.taskStart(task); await fs.ensureDir(workspacePath); - const context: TemplateContext = { parameters: task.spec.parameters, steps: {}, user: task.spec.user, + context: { + task: { + id: taskId, + }, + }, }; const [decision]: PolicyDecision[] = From 5d9e5c8483c55a4e8563909f78a5ca4dd46f6d73 Mon Sep 17 00:00:00 2001 From: Fabio Vincenzi Date: Tue, 12 Nov 2024 12:55:13 +0100 Subject: [PATCH 2/8] add changeset Signed-off-by: Fabio Vincenzi --- .changeset/famous-dryers-protect.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/famous-dryers-protect.md diff --git a/.changeset/famous-dryers-protect.md b/.changeset/famous-dryers-protect.md new file mode 100644 index 0000000000..f1da5fc511 --- /dev/null +++ b/.changeset/famous-dryers-protect.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': minor +--- + +New `taskId` Context Variable in Scaffolder Templates From 315f6eb0244d2c1943a195c66e9e73fe4e16e4a5 Mon Sep 17 00:00:00 2001 From: Fabio Vincenzi Date: Tue, 10 Dec 2024 12:19:06 +0100 Subject: [PATCH 3/8] Add task id to ActionContext Signed-off-by: Fabio Vincenzi --- .../src/scaffolder/tasks/NunjucksWorkflowRunner.ts | 3 +++ plugins/scaffolder-node/src/actions/types.ts | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts index 81bcb30a64..dcbfcc0a34 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts @@ -372,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), diff --git a/plugins/scaffolder-node/src/actions/types.ts b/plugins/scaffolder-node/src/actions/types.ts index 5dd9d5526f..51addda05c 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; + /** + * Optional task information + */ + task?: { + id: string; + }; + templateInfo?: TemplateInfo; /** From 9295c16b7890858c2fadfa421897bf45e31d6b0d Mon Sep 17 00:00:00 2001 From: Fabio Vincenzi Date: Tue, 10 Dec 2024 17:22:13 +0100 Subject: [PATCH 4/8] add changeset Signed-off-by: Fabio Vincenzi --- .changeset/wise-students-tell.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/wise-students-tell.md diff --git a/.changeset/wise-students-tell.md b/.changeset/wise-students-tell.md new file mode 100644 index 0000000000..12acb5f892 --- /dev/null +++ b/.changeset/wise-students-tell.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-node': patch +--- + +Add task id to ActionContext From a024f23ce6e2e795681040b6ecb06c6029714008 Mon Sep 17 00:00:00 2001 From: Fabio Vincenzi Date: Tue, 10 Dec 2024 17:36:01 +0100 Subject: [PATCH 5/8] add api report Signed-off-by: Fabio Vincenzi --- plugins/scaffolder-node/report.api.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/scaffolder-node/report.api.md b/plugins/scaffolder-node/report.api.md index c14a689d1a..a8f7b4da67 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?: { From 51bf762181dbc798c7bd4e22cd4feab59e004df1 Mon Sep 17 00:00:00 2001 From: Fabio Vincenzi Date: Fri, 13 Dec 2024 18:22:14 +0100 Subject: [PATCH 6/8] make task not optional in ActionContext Signed-off-by: Fabio Vincenzi --- .changeset/famous-dryers-protect.md | 3 ++- .changeset/wise-students-tell.md | 5 ----- plugins/scaffolder-node/report.api.md | 2 +- 3 files changed, 3 insertions(+), 7 deletions(-) delete mode 100644 .changeset/wise-students-tell.md diff --git a/.changeset/famous-dryers-protect.md b/.changeset/famous-dryers-protect.md index f1da5fc511..b015a562aa 100644 --- a/.changeset/famous-dryers-protect.md +++ b/.changeset/famous-dryers-protect.md @@ -1,5 +1,6 @@ --- '@backstage/plugin-scaffolder-backend': minor +'@backstage/plugin-scaffolder-node': patch --- -New `taskId` Context Variable in Scaffolder Templates +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/.changeset/wise-students-tell.md b/.changeset/wise-students-tell.md deleted file mode 100644 index 12acb5f892..0000000000 --- a/.changeset/wise-students-tell.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-node': patch ---- - -Add task id to ActionContext diff --git a/plugins/scaffolder-node/report.api.md b/plugins/scaffolder-node/report.api.md index a8f7b4da67..1141f0ada0 100644 --- a/plugins/scaffolder-node/report.api.md +++ b/plugins/scaffolder-node/report.api.md @@ -41,7 +41,7 @@ export type ActionContext< ): void; createTemporaryDirectory(): Promise; getInitiatorCredentials(): Promise; - task?: { + task: { id: string; }; templateInfo?: TemplateInfo; From 372a4cac0d3ba62eccdf1387823b4e417eef9efe Mon Sep 17 00:00:00 2001 From: Fabio Vincenzi Date: Mon, 16 Dec 2024 09:43:25 +0100 Subject: [PATCH 7/8] make task not optional in ActionContext Signed-off-by: Fabio Vincenzi --- .../src/scaffolder/tasks/NunjucksWorkflowRunner.ts | 1 + plugins/scaffolder-node/src/actions/types.ts | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts index dcbfcc0a34..ad9d85cb2d 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts @@ -493,6 +493,7 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { const taskTrack = await this.tracker.taskStart(task); await fs.ensureDir(workspacePath); + const context: TemplateContext = { parameters: task.spec.parameters, steps: {}, diff --git a/plugins/scaffolder-node/src/actions/types.ts b/plugins/scaffolder-node/src/actions/types.ts index 51addda05c..171d3d82db 100644 --- a/plugins/scaffolder-node/src/actions/types.ts +++ b/plugins/scaffolder-node/src/actions/types.ts @@ -58,9 +58,9 @@ export type ActionContext< getInitiatorCredentials(): Promise; /** - * Optional task information + * Task information */ - task?: { + task: { id: string; }; From 6ea0d2f1a5a36b46cf26a41fb640844542400e82 Mon Sep 17 00:00:00 2001 From: Fabio Vincenzi Date: Mon, 16 Dec 2024 11:30:41 +0100 Subject: [PATCH 8/8] create mock task id Signed-off-by: Fabio Vincenzi --- .../src/actions/mockActionContext.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) 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, }; };