diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts index 9d0ab0ad06..4f0d6f7091 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts @@ -276,31 +276,29 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { return; } } - - const iterations = new Array(); - if (step.each) { - const each = await this.render(step.each, context, renderTemplate); - iterations.push( - ...Object.keys(each).map((key: any) => { - return { each: { key, value: each[key] } }; - }), - ); - } else { - iterations.push({}); - } - for (const iteration of iterations) { + const iterations = ( + step.each + ? Object.entries(this.render(step.each, context, renderTemplate)).map( + ([key, value]) => ({ + each: { key, value }, + }), + ) + : [{}] + ).map(i => ({ + ...i, // Secrets are only passed when templating the input to actions for security reasons - iteration.input = - (step.input && - this.render( + input: step.input + ? this.render( step.input, - { ...context, ...iteration, secrets: task.secrets ?? {} }, + { ...context, ...i, ...task }, renderTemplate, - )) ?? - {}; + ) + : {}, + })); + for (const iteration of iterations) { let actionId = action.id; - if (Object.hasOwn(iteration, 'each')) { - actionId += `[${(iteration.each as JsonObject).key}]`; + if (iteration.each) { + actionId += `[${iteration.each.key}]`; } if (action.schema?.input) { const validateResult = validateJsonSchema( @@ -343,7 +341,7 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { ); } await action.handler({ - input: iteration.input as JsonObject, + input: iteration.input, secrets: task.secrets ?? {}, logger: taskLogger, logStream: streamLogger,