diff --git a/.changeset/light-squids-eat.md b/.changeset/light-squids-eat.md new file mode 100644 index 0000000000..3676f94081 --- /dev/null +++ b/.changeset/light-squids-eat.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': patch +--- + +Fixed an issue causing actions to fail when retrieving auth credentials diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts index fbd3813163..81897a96f8 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts @@ -434,7 +434,7 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { user: task.spec.user, isDryRun: task.isDryRun, signal: task.cancelSignal, - getInitiatorCredentials: task.getInitiatorCredentials, + getInitiatorCredentials: () => task.getInitiatorCredentials(), }); } diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts index 29a22716ba..e9a408d9d6 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts @@ -28,7 +28,7 @@ import { TaskCompletionState, TaskContext, } from '@backstage/plugin-scaffolder-node'; -import { TaskStore } from './types'; +import { InternalTaskSecrets, TaskStore } from './types'; import { readDuration } from './helper'; import { AuthService, @@ -179,8 +179,10 @@ export class TaskManager implements TaskContext { } async getInitiatorCredentials(): Promise { - if (this.task.secrets && '__initiatorCredentials' in this.task.secrets) { - return JSON.parse(this.task.secrets.__initiatorCredentials); + const secrets = this.task.secrets as InternalTaskSecrets; + + if (secrets && secrets.__initiatorCredentials) { + return JSON.parse(secrets.__initiatorCredentials); } if (!this.auth) { throw new Error( diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts index c0854af391..aa647d8bd6 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts @@ -228,3 +228,10 @@ export type TaskTrackType = { action: TemplateAction, ) => Promise; }; + +/** + * @internal + */ +export type InternalTaskSecrets = TaskSecrets & { + __initiatorCredentials: string; +}; diff --git a/plugins/scaffolder-backend/src/service/router.test.ts b/plugins/scaffolder-backend/src/service/router.test.ts index d3cb2d1897..2118f46b22 100644 --- a/plugins/scaffolder-backend/src/service/router.test.ts +++ b/plugins/scaffolder-backend/src/service/router.test.ts @@ -316,7 +316,7 @@ describe('createRouter', () => { createdBy: 'user:default/mock', secrets: { backstageToken: token, - initiatorCredentials: JSON.stringify(credentials), + __initiatorCredentials: JSON.stringify(credentials), }, spec: { @@ -455,7 +455,7 @@ describe('createRouter', () => { createdAt: '', secrets: { backstageToken: token, - initiatorCredentials: JSON.stringify(credentials), + __initiatorCredentials: JSON.stringify(credentials), }, createdBy: '', }); @@ -925,7 +925,7 @@ data: {"id":1,"taskId":"a-random-id","type":"completion","createdAt":"","body":{ createdBy: 'user:default/mock', secrets: { backstageToken: token, - initiatorCredentials: JSON.stringify(credentials), + __initiatorCredentials: JSON.stringify(credentials), }, spec: { @@ -995,7 +995,7 @@ data: {"id":1,"taskId":"a-random-id","type":"completion","createdAt":"","body":{ createdBy: 'user:default/mock', secrets: { backstageToken: token, - initiatorCredentials: JSON.stringify(credentials), + __initiatorCredentials: JSON.stringify(credentials), }, spec: { @@ -1084,7 +1084,7 @@ data: {"id":1,"taskId":"a-random-id","type":"completion","createdAt":"","body":{ createdBy: 'user:default/mock', secrets: { backstageToken: token, - initiatorCredentials: JSON.stringify(credentials), + __initiatorCredentials: JSON.stringify(credentials), }, spec: { @@ -1220,7 +1220,7 @@ data: {"id":1,"taskId":"a-random-id","type":"completion","createdAt":"","body":{ createdAt: '', secrets: { backstageToken: token, - initiatorCredentials: JSON.stringify(credentials), + __initiatorCredentials: JSON.stringify(credentials), }, createdBy: '', }); diff --git a/plugins/scaffolder-backend/src/service/router.ts b/plugins/scaffolder-backend/src/service/router.ts index 50f6fc372f..43618ed5a7 100644 --- a/plugins/scaffolder-backend/src/service/router.ts +++ b/plugins/scaffolder-backend/src/service/router.ts @@ -88,6 +88,7 @@ import { IdentityApi, IdentityApiGetIdentityRequest, } from '@backstage/plugin-auth-node'; +import { InternalTaskSecrets } from '../scaffolder/tasks/types'; /** * @@ -523,14 +524,16 @@ export async function createRouter( }, }; + const secrets: InternalTaskSecrets = { + ...req.body.secrets, + backstageToken: token, + __initiatorCredentials: JSON.stringify(credentials), + }; + const result = await taskBroker.dispatch({ spec: taskSpec, createdBy: userEntityRef, - secrets: { - ...req.body.secrets, - backstageToken: token, - initiatorCredentials: JSON.stringify(credentials), - }, + secrets, }); res.status(201).json({ id: result.taskId });