From 62414770ead7390c129554fea815d22c9d0294b9 Mon Sep 17 00:00:00 2001 From: Heikki Hellgren Date: Wed, 1 Mar 2023 14:51:58 +0200 Subject: [PATCH] chore: allow undefined containerRunner in cookiecutter this is only needed if the cookiecutter command is not available. Signed-off-by: Heikki Hellgren --- .changeset/nine-bikes-applaud.md | 5 +++++ .../scaffolder-backend-module-cookiecutter/README.md | 2 ++ .../api-report.md | 2 +- .../src/actions/fetch/cookiecutter.test.ts | 12 ++++++++++++ .../src/actions/fetch/cookiecutter.ts | 11 ++++++++--- 5 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 .changeset/nine-bikes-applaud.md diff --git a/.changeset/nine-bikes-applaud.md b/.changeset/nine-bikes-applaud.md new file mode 100644 index 0000000000..77a1c0e4be --- /dev/null +++ b/.changeset/nine-bikes-applaud.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend-module-cookiecutter': patch +--- + +allow container runner to be undefined in cookiecutter plugin diff --git a/plugins/scaffolder-backend-module-cookiecutter/README.md b/plugins/scaffolder-backend-module-cookiecutter/README.md index ae34e09c96..0e8e11ef7d 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/README.md +++ b/plugins/scaffolder-backend-module-cookiecutter/README.md @@ -161,3 +161,5 @@ You can do so by including the following lines in the last step of your Dockerfi RUN apt-get update && apt-get install -y python3 python3-pip RUN pip3 install cookiecutter ``` + +In this case, you don't have to include `containerRunner` in the action configuration. diff --git a/plugins/scaffolder-backend-module-cookiecutter/api-report.md b/plugins/scaffolder-backend-module-cookiecutter/api-report.md index 76f2ced66f..2944f5240e 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/api-report.md +++ b/plugins/scaffolder-backend-module-cookiecutter/api-report.md @@ -15,7 +15,7 @@ import { UrlReader } from '@backstage/backend-common'; export function createFetchCookiecutterAction(options: { reader: UrlReader; integrations: ScmIntegrations; - containerRunner: ContainerRunner; + containerRunner?: ContainerRunner; }): TemplateAction<{ url: string; targetPath?: string | undefined; diff --git a/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.test.ts b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.test.ts index f8b049f95f..9d7f06afc8 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.test.ts +++ b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.test.ts @@ -223,4 +223,16 @@ describe('fetch:cookiecutter', () => { }), ); }); + + it('should throw error if cookiecutter is not installed and containerRunner is undefined', async () => { + commandExists.mockResolvedValue(false); + const ccAction = createFetchCookiecutterAction({ + integrations, + reader: mockReader, + }); + + await expect(ccAction.handler(mockContext)).rejects.toThrow( + /Invalid state: containerRunner cannot be undefined when cookiecutter is not installed/, + ); + }); }); diff --git a/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.ts b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.ts index 5c69b9dce2..b63a044a20 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.ts +++ b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.ts @@ -33,9 +33,9 @@ import { import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; export class CookiecutterRunner { - private readonly containerRunner: ContainerRunner; + private readonly containerRunner?: ContainerRunner; - constructor({ containerRunner }: { containerRunner: ContainerRunner }) { + constructor({ containerRunner }: { containerRunner?: ContainerRunner }) { this.containerRunner = containerRunner; } @@ -101,6 +101,11 @@ export class CookiecutterRunner { logStream, }); } else { + if (this.containerRunner === undefined) { + throw new Error( + 'Invalid state: containerRunner cannot be undefined when cookiecutter is not installed', + ); + } await this.containerRunner.runContainer({ imageName: imageName ?? 'spotify/backstage-cookiecutter', command: 'cookiecutter', @@ -139,7 +144,7 @@ export class CookiecutterRunner { export function createFetchCookiecutterAction(options: { reader: UrlReader; integrations: ScmIntegrations; - containerRunner: ContainerRunner; + containerRunner?: ContainerRunner; }) { const { reader, containerRunner, integrations } = options;