diff --git a/.changeset/curly-tomatoes-reply.md b/.changeset/curly-tomatoes-reply.md new file mode 100644 index 0000000000..386e2b6109 --- /dev/null +++ b/.changeset/curly-tomatoes-reply.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': patch +--- + +handle step.if: false diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts index 44f8836fd1..0bcbd2f917 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts @@ -407,6 +407,48 @@ describe('NunjucksWorkflowRunner', () => { expect(output.result).toBeUndefined(); }); + describe('should apply boolean step conditions', () => { + it('executes when true', async () => { + const task = createMockTaskWithSpec({ + apiVersion: 'scaffolder.backstage.io/v1beta3', + steps: [ + { + id: 'conditional', + name: 'conditional', + action: 'output-action', + if: true, + }, + ], + output: { + result: '${{ steps.conditional.output.mock }}', + }, + parameters: {}, + }); + + const { output } = await runner.execute(task); + expect(output.result).toBe('backstage'); + }); + it('skips when false', async () => { + const task = createMockTaskWithSpec({ + apiVersion: 'scaffolder.backstage.io/v1beta3', + steps: [ + { + id: 'conditional', + name: 'conditional', + action: 'output-action', + if: false, + }, + ], + output: { + result: '${{ steps.conditional.output.mock }}', + }, + parameters: {}, + }); + + const { output } = await runner.execute(task); + expect(output.result).toBeUndefined(); + }); + }); }); describe('templating', () => { diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts index 6de51ea3b6..6f7551568f 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts @@ -244,14 +244,14 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { } try { - if (step.if) { - const ifResult = this.render(step.if, context, renderTemplate); - if (!isTruthy(ifResult)) { - await stepTrack.skipFalsy(); - return; - } + if ( + step.if === false || + (typeof step.if === 'string' && + !isTruthy(this.render(step.if, context, renderTemplate))) + ) { + await stepTrack.skipFalsy(); + return; } - const action: TemplateAction = this.options.actionRegistry.get(step.action); const { taskLogger, streamLogger } = createStepLogger({