From 3c7d087fbca1c4da210d8c364cf7f53c53ecacdc Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 16 Feb 2022 10:30:51 +0100 Subject: [PATCH 01/16] chore: adding deprecations for the spec.metadata and spec.baseUrl to the new templateInfo Signed-off-by: blam --- plugins/scaffolder-common/src/TaskSpec.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/plugins/scaffolder-common/src/TaskSpec.ts b/plugins/scaffolder-common/src/TaskSpec.ts index 1cbe41b28c..0b829ef824 100644 --- a/plugins/scaffolder-common/src/TaskSpec.ts +++ b/plugins/scaffolder-common/src/TaskSpec.ts @@ -21,11 +21,22 @@ import { JsonValue, JsonObject } from '@backstage/types'; * stored in the database. * * @public + * @deprecated */ export type TemplateMetadata = { name: string; }; +/** + * Information about a template that is stored on the scaffolder spec + * + * @public + */ +export type TemplateInfo = { + name: string; + baseUrl?: string; +}; + /** * An individual step of a scaffolder task, as stored in the database. * @@ -64,11 +75,14 @@ export interface TaskSpecV1beta2 { */ export interface TaskSpecV1beta3 { apiVersion: 'scaffolder.backstage.io/v1beta3'; + /** @deprecated use templateInfo.baseUrl instead */ baseUrl?: string; parameters: JsonObject; steps: TaskStep[]; output: { [name: string]: JsonValue }; + /** @deprecated use templateInfo instead */ metadata?: TemplateMetadata; + templateInfo?: TemplateInfo; } /** From a4d53fe18eb8d2b136502a31ea2eb350ab2efc9f Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 16 Feb 2022 10:34:04 +0100 Subject: [PATCH 02/16] chore: added changeset for deprecations Signed-off-by: blam --- .changeset/cool-ways-battle.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .changeset/cool-ways-battle.md diff --git a/.changeset/cool-ways-battle.md b/.changeset/cool-ways-battle.md new file mode 100644 index 0000000000..db3da6c658 --- /dev/null +++ b/.changeset/cool-ways-battle.md @@ -0,0 +1,7 @@ +--- +'@backstage/plugin-scaffolder-common': patch +--- + +- Deprecate `TaskSpecV1Beta2` in favour of the new `TaskSpecV1Beta3` +- Deprecate `TaskSpecV1Beta3.metadata` in favour of the new `TaskSpecV1Beta3.templateInfo` +- Deprecate `TaskSpecV1Beta3.baseUrl` in favour of the new `TaskSpecV1Beta3.templateInfo.baseUrl` From f1cfb215ce10e6fd6e300c030b5bcc1261004447 Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 16 Feb 2022 10:43:02 +0100 Subject: [PATCH 03/16] chore: updating api-report and fixing the warnings Signed-off-by: blam --- plugins/scaffolder-common/api-report.md | 12 ++++++++++-- plugins/scaffolder-common/src/TaskSpec.ts | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/plugins/scaffolder-common/api-report.md b/plugins/scaffolder-common/api-report.md index 8d2324a2dd..ba90a238f9 100644 --- a/plugins/scaffolder-common/api-report.md +++ b/plugins/scaffolder-common/api-report.md @@ -33,9 +33,9 @@ export interface TaskSpecV1beta2 { export interface TaskSpecV1beta3 { // (undocumented) apiVersion: 'scaffolder.backstage.io/v1beta3'; - // (undocumented) + // @deprecated (undocumented) baseUrl?: string; - // (undocumented) + // @deprecated (undocumented) metadata?: TemplateMetadata; // (undocumented) output: { @@ -45,6 +45,8 @@ export interface TaskSpecV1beta3 { parameters: JsonObject; // (undocumented) steps: TaskStep[]; + // (undocumented) + templateInfo?: TemplateInfo; } // @public @@ -116,6 +118,12 @@ export interface TemplateEntityV1beta3 extends Entity { export const templateEntityV1beta3Validator: KindValidator; // @public +export type TemplateInfo = { + name: string; + baseUrl?: string; +}; + +// @public @deprecated export type TemplateMetadata = { name: string; }; diff --git a/plugins/scaffolder-common/src/TaskSpec.ts b/plugins/scaffolder-common/src/TaskSpec.ts index 0b829ef824..c92c432e53 100644 --- a/plugins/scaffolder-common/src/TaskSpec.ts +++ b/plugins/scaffolder-common/src/TaskSpec.ts @@ -21,7 +21,7 @@ import { JsonValue, JsonObject } from '@backstage/types'; * stored in the database. * * @public - * @deprecated + * @deprecated use templateInfo on the spec instead */ export type TemplateMetadata = { name: string; From 7f88d699d4aa8a4ef4117715b6a95416ec62336a Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 16 Feb 2022 11:07:25 +0100 Subject: [PATCH 04/16] chore: updating public docs Signed-off-by: blam --- plugins/scaffolder-common/src/TaskSpec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/scaffolder-common/src/TaskSpec.ts b/plugins/scaffolder-common/src/TaskSpec.ts index c92c432e53..c8bff3a713 100644 --- a/plugins/scaffolder-common/src/TaskSpec.ts +++ b/plugins/scaffolder-common/src/TaskSpec.ts @@ -28,7 +28,7 @@ export type TemplateMetadata = { }; /** - * Information about a template that is stored on the scaffolder spec + * Information about a template that is stored on the scaffolder Spec * * @public */ From 6d808887f90e02b25e45b70dccfbf3044eef55a6 Mon Sep 17 00:00:00 2001 From: Ben Lambert Date: Wed, 16 Feb 2022 11:16:57 +0100 Subject: [PATCH 05/16] chore: it's already done in another PR SIgned-off-by: Ben Lambert --- .changeset/cool-ways-battle.md | 1 - 1 file changed, 1 deletion(-) diff --git a/.changeset/cool-ways-battle.md b/.changeset/cool-ways-battle.md index db3da6c658..f3f2f4f7c0 100644 --- a/.changeset/cool-ways-battle.md +++ b/.changeset/cool-ways-battle.md @@ -2,6 +2,5 @@ '@backstage/plugin-scaffolder-common': patch --- -- Deprecate `TaskSpecV1Beta2` in favour of the new `TaskSpecV1Beta3` - Deprecate `TaskSpecV1Beta3.metadata` in favour of the new `TaskSpecV1Beta3.templateInfo` - Deprecate `TaskSpecV1Beta3.baseUrl` in favour of the new `TaskSpecV1Beta3.templateInfo.baseUrl` From 32f1cc6d46e26684534928811ad1c9e47564c4c5 Mon Sep 17 00:00:00 2001 From: Ben Lambert Date: Wed, 16 Feb 2022 13:20:29 +0100 Subject: [PATCH 06/16] Update plugins/scaffolder-common/src/TaskSpec.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ben Lambert Co-authored-by: Fredrik Adelöw --- plugins/scaffolder-common/src/TaskSpec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/scaffolder-common/src/TaskSpec.ts b/plugins/scaffolder-common/src/TaskSpec.ts index c8bff3a713..0751b0467a 100644 --- a/plugins/scaffolder-common/src/TaskSpec.ts +++ b/plugins/scaffolder-common/src/TaskSpec.ts @@ -28,7 +28,7 @@ export type TemplateMetadata = { }; /** - * Information about a template that is stored on the scaffolder Spec + * Information about a template that is stored on a task specification * * @public */ From b344cd674a3f15ebe2229c6385b705717449d1ef Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 16 Feb 2022 14:50:16 +0100 Subject: [PATCH 07/16] chore: move to templateInfo in the scaffolder-backend Signed-off-by: blam --- .../src/scaffolder/actions/builtin/fetch/plain.ts | 2 +- .../scaffolder/actions/builtin/fetch/template.test.ts | 2 +- .../src/scaffolder/actions/builtin/fetch/template.ts | 2 +- .../src/scaffolder/actions/types.ts | 6 ++++++ .../scaffolder/tasks/HandlebarsWorkflowRunner.test.ts | 2 +- .../src/scaffolder/tasks/HandlebarsWorkflowRunner.ts | 11 ++++------- .../scaffolder/tasks/NunjucksWorkflowRunner.test.ts | 2 +- .../src/scaffolder/tasks/NunjucksWorkflowRunner.ts | 3 +++ 8 files changed, 18 insertions(+), 12 deletions(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.ts index 9cac6d5ab8..17f49a5bd4 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.ts @@ -59,7 +59,7 @@ export function createFetchPlainAction(options: { await fetchContents({ reader, integrations, - baseUrl: ctx.baseUrl, + baseUrl: ctx.templateInfo?.baseUrl, fetchUrl: ctx.input.url, outputPath, }); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts index 2f9bfd3796..284b400833 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts @@ -75,7 +75,7 @@ describe('fetch:template', () => { const logger = getVoidLogger(); const mockContext = (inputPatch: Partial = {}) => ({ - baseUrl: 'base-url', + templateInfo: { baseUrl: 'base-url', name: 'test' }, input: { url: './skeleton', targetPath: './target', diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts index 08dfc46caf..a8ba9ac19f 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts @@ -135,7 +135,7 @@ export function createFetchTemplateAction(options: { await fetchContents({ reader, integrations, - baseUrl: ctx.baseUrl, + baseUrl: ctx.templateInfo?.baseUrl, fetchUrl: ctx.input.url, outputPath: templateDir, }); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/types.ts b/plugins/scaffolder-backend/src/scaffolder/actions/types.ts index 6008e8183f..b2227426b8 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/types.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/types.ts @@ -19,10 +19,12 @@ import { Writable } from 'stream'; import { JsonValue, JsonObject } from '@backstage/types'; import { Schema } from 'jsonschema'; import { TaskSecrets, TemplateMetadata } from '../tasks/types'; +import { TemplateInfo } from '@backstage/plugin-scaffolder-common'; export type ActionContext = { /** * Base URL for the location of the task spec, typically the url of the source entity file. + * @deprecated please use templateInfo.baseUrl instead */ baseUrl?: string; @@ -38,7 +40,11 @@ export type ActionContext = { */ createTemporaryDirectory(): Promise; + /** + * @deprecated please use templateInfo instead + */ metadata?: TemplateMetadata; + templateInfo?: TemplateInfo; }; export type TemplateAction = { diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/HandlebarsWorkflowRunner.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/HandlebarsWorkflowRunner.test.ts index 9b05c43831..aff0615733 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/HandlebarsWorkflowRunner.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/HandlebarsWorkflowRunner.test.ts @@ -107,7 +107,7 @@ describe('LegacyWorkflowRunner', () => { ], output: {}, values: {}, - metadata: { name: templateName }, + templateInfo: { name: templateName }, }); await runner.execute(task); diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/HandlebarsWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/HandlebarsWorkflowRunner.ts index 86e719c828..135c40d95f 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/HandlebarsWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/HandlebarsWorkflowRunner.ts @@ -225,13 +225,8 @@ export class HandlebarsWorkflowRunner implements WorkflowRunner { input: JSON.stringify(input, null, 2), }); - if (!task.spec.metadata) { - console.warn( - 'DEPRECATION NOTICE: metadata is undefined. metadata will be required in the future.', - ); - } - await action.handler({ + // deprecated in favor of templateInfo.baseUrl baseUrl: task.spec.baseUrl, logger: taskLogger, logStream: stream, @@ -248,7 +243,9 @@ export class HandlebarsWorkflowRunner implements WorkflowRunner { output(name: string, value: JsonValue) { stepOutputs[name] = value; }, - metadata: task.spec.metadata, + // deprecated in favor of templateInfo + metadata: task.spec.templateInfo, + templateInfo: task.spec.templateInfo, }); // Remove all temporary directories that were created when executing the action diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts index f46d969eb8..03a185ea5a 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts @@ -176,7 +176,7 @@ describe('DefaultWorkflowRunner', () => { input: { foo: 1 }, }, ], - metadata: { name: templateName }, + templateInfo: { name: templateName }, }); await runner.execute(task); diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts index 5d39d0bc00..b1177ca49c 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts @@ -259,6 +259,7 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { const stepOutput: { [outputName: string]: JsonValue } = {}; await action.handler({ + // deprecated in favourof templateInfo.baseUrl baseUrl: task.spec.baseUrl, input, secrets: task.secrets ?? {}, @@ -275,7 +276,9 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { output(name: string, value: JsonValue) { stepOutput[name] = value; }, + // deprecated in favour of templateInfo metadata: task.spec.metadata, + templateInfo: task.spec.templateInfo, }); // Remove all temporary directories that were created when executing the action From 93215cb382a6a2f2faf56052f3593da0a02f5086 Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 16 Feb 2022 14:51:04 +0100 Subject: [PATCH 08/16] chore: move to templateInfo in other modules Signed-off-by: blam --- .../src/actions/fetch/cookiecutter.test.ts | 7 ++- .../src/actions/fetch/cookiecutter.ts | 2 +- .../src/actions/fetch/rails/index.ts | 2 +- .../scaffolder-backend/src/service/router.ts | 48 ++++++++++--------- plugins/scaffolder-common/src/TaskSpec.ts | 4 ++ .../src/components/TaskPage/TaskPage.tsx | 4 +- 6 files changed, 39 insertions(+), 28 deletions(-) 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 bba51e3f01..edc5c3ff77 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 @@ -89,7 +89,10 @@ describe('fetch:cookiecutter', () => { help: 'me', }, }, - baseUrl: 'somebase', + templateInfo: { + name: 'lols', + baseUrl: 'somebase', + }, workspacePath: mockTmpDir, logger: getVoidLogger(), logStream: new PassThrough(), @@ -149,7 +152,7 @@ describe('fetch:cookiecutter', () => { expect.objectContaining({ reader: mockReader, integrations, - baseUrl: mockContext.baseUrl, + baseUrl: mockContext.templateInfo?.baseUrl, fetchUrl: mockContext.input.url, outputPath: join( mockTmpDir, 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 c4d7f1e3e8..0455f01989 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.ts +++ b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.ts @@ -222,7 +222,7 @@ export function createFetchCookiecutterAction(options: { await fetchContents({ reader, integrations, - baseUrl: ctx.baseUrl, + baseUrl: ctx.templateInfo?.baseUrl, fetchUrl: ctx.input.url, outputPath: templateContentsDir, }); diff --git a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.ts b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.ts index 2865361a8b..132929ee1c 100644 --- a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.ts +++ b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.ts @@ -170,7 +170,7 @@ export function createFetchRailsAction(options: { await fetchContents({ reader, integrations, - baseUrl: ctx.baseUrl, + baseUrl: ctx.templateInfo?.baseUrl, fetchUrl: ctx.input.url, outputPath: workDir, }); diff --git a/plugins/scaffolder-backend/src/service/router.ts b/plugins/scaffolder-backend/src/service/router.ts index b2978441bd..a5f5b5fa40 100644 --- a/plugins/scaffolder-backend/src/service/router.ts +++ b/plugins/scaffolder-backend/src/service/router.ts @@ -28,6 +28,8 @@ import { ScmIntegrations } from '@backstage/integration'; import { TemplateEntityV1beta2, TemplateEntityV1beta3, + TaskSpecV1beta3, + TaskSpecV1beta2, } from '@backstage/plugin-scaffolder-common'; import express from 'express'; import Router from 'express-promise-router'; @@ -219,32 +221,36 @@ export async function createRouter( const baseUrl = getEntityBaseUrl(template); + const baseTaskSpec = { + baseUrl, + steps: template.spec.steps.map((step, index) => ({ + ...step, + id: step.id ?? `step-${index + 1}`, + name: step.name ?? step.action, + })), + output: template.spec.output ?? {}, + + // deprecated in favour of templateInfo + metadata: { name: template.metadata?.name }, + + templateInfo: { + name: template.metadata?.name, + baseUrl, + }, + }; + taskSpec = template.apiVersion === 'backstage.io/v1beta2' - ? { + ? ({ + ...baseTaskSpec, apiVersion: template.apiVersion, - baseUrl, values, - steps: template.spec.steps.map((step, index) => ({ - ...step, - id: step.id ?? `step-${index + 1}`, - name: step.name ?? step.action, - })), - output: template.spec.output ?? {}, - metadata: { name: template.metadata?.name }, - } - : { + } as TaskSpecV1beta2) + : ({ + ...baseTaskSpec, apiVersion: template.apiVersion, - baseUrl, parameters: values, - steps: template.spec.steps.map((step, index) => ({ - ...step, - id: step.id ?? `step-${index + 1}`, - name: step.name ?? step.action, - })), - output: template.spec.output ?? {}, - metadata: { name: template.metadata?.name }, - }; + } as TaskSpecV1beta3); } else { throw new InputError( `Unsupported apiVersion field in schema entity, ${ @@ -256,8 +262,6 @@ export async function createRouter( const result = await taskBroker.dispatch(taskSpec, { ...req.body.secrets, backstageToken: token, - // This is deprecated, but we need to support it for now if people are running their own task broker. - token: token, }); res.status(201).json({ id: result.taskId }); diff --git a/plugins/scaffolder-common/src/TaskSpec.ts b/plugins/scaffolder-common/src/TaskSpec.ts index 0751b0467a..09d46b7fbb 100644 --- a/plugins/scaffolder-common/src/TaskSpec.ts +++ b/plugins/scaffolder-common/src/TaskSpec.ts @@ -60,11 +60,15 @@ export interface TaskStep { */ export interface TaskSpecV1beta2 { apiVersion: 'backstage.io/v1beta2'; + /** @deprecated use templateInfo.baseUrl instead */ baseUrl?: string; values: JsonObject; steps: TaskStep[]; output: { [name: string]: string }; + /** @deprecated use templateInfo instead */ metadata?: TemplateMetadata; + + templateInfo?: TemplateInfo; } /** diff --git a/plugins/scaffolder/src/components/TaskPage/TaskPage.tsx b/plugins/scaffolder/src/components/TaskPage/TaskPage.tsx index 2f49f40643..346a842838 100644 --- a/plugins/scaffolder/src/components/TaskPage/TaskPage.tsx +++ b/plugins/scaffolder/src/components/TaskPage/TaskPage.tsx @@ -291,7 +291,7 @@ export const TaskPage = ({ loadingText }: TaskPageProps) => { const { output } = taskStream; const handleStartOver = () => { - if (!taskStream.task || !taskStream.task?.spec.metadata?.name) { + if (!taskStream.task || !taskStream.task?.spec.templateInfo?.name) { navigate(generatePath(rootLink())); } @@ -306,7 +306,7 @@ export const TaskPage = ({ loadingText }: TaskPageProps) => { formData: JSON.stringify(formData), })}`, { - templateName: taskStream.task!.spec.metadata!.name, + templateName: taskStream.task!.spec.templateInfo!.name, }, ), ); From 09000c16636cb03e63996a07db9b50e1049ec2c0 Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 16 Feb 2022 15:01:26 +0100 Subject: [PATCH 09/16] chore: updating api-reports for all packages Signed-off-by: blam --- .changeset/cool-ways-battle.md | 4 ++-- plugins/scaffolder-backend/api-report.md | 2 ++ plugins/scaffolder-common/api-report.md | 6 ++++-- plugins/scaffolder-common/src/TaskSpec.ts | 1 - 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.changeset/cool-ways-battle.md b/.changeset/cool-ways-battle.md index f3f2f4f7c0..264b8ca420 100644 --- a/.changeset/cool-ways-battle.md +++ b/.changeset/cool-ways-battle.md @@ -2,5 +2,5 @@ '@backstage/plugin-scaffolder-common': patch --- -- Deprecate `TaskSpecV1Beta3.metadata` in favour of the new `TaskSpecV1Beta3.templateInfo` -- Deprecate `TaskSpecV1Beta3.baseUrl` in favour of the new `TaskSpecV1Beta3.templateInfo.baseUrl` +**DEPRECATION** - Deprecate `TaskSpecV1Beta3.metadata` in favour of the new `TaskSpecV1Beta3.templateInfo` +**DEPRECATION** - Deprecate `TaskSpecV1Beta3.baseUrl` in favour of the new `TaskSpecV1Beta3.templateInfo.baseUrl` diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index ba16b5d4f0..b0e6a43be2 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -29,6 +29,7 @@ import { SpawnOptionsWithoutStdio } from 'child_process'; import { TaskSpec } from '@backstage/plugin-scaffolder-common'; import { TaskSpecV1beta2 } from '@backstage/plugin-scaffolder-common'; import { TaskSpecV1beta3 } from '@backstage/plugin-scaffolder-common'; +import { TemplateInfo } from '@backstage/plugin-scaffolder-common'; import { TemplateMetadata } from '@backstage/plugin-scaffolder-common'; import { UrlReader } from '@backstage/backend-common'; import { Writable } from 'stream'; @@ -46,6 +47,7 @@ export type ActionContext = { output(name: string, value: JsonValue): void; createTemporaryDirectory(): Promise; metadata?: TemplateMetadata; + templateInfo?: TemplateInfo; }; // @public diff --git a/plugins/scaffolder-common/api-report.md b/plugins/scaffolder-common/api-report.md index ba90a238f9..92935bd5bb 100644 --- a/plugins/scaffolder-common/api-report.md +++ b/plugins/scaffolder-common/api-report.md @@ -15,9 +15,9 @@ export type TaskSpec = TaskSpecV1beta2 | TaskSpecV1beta3; export interface TaskSpecV1beta2 { // (undocumented) apiVersion: 'backstage.io/v1beta2'; - // (undocumented) + // @deprecated (undocumented) baseUrl?: string; - // (undocumented) + // @deprecated (undocumented) metadata?: TemplateMetadata; // (undocumented) output: { @@ -26,6 +26,8 @@ export interface TaskSpecV1beta2 { // (undocumented) steps: TaskStep[]; // (undocumented) + templateInfo?: TemplateInfo; + // (undocumented) values: JsonObject; } diff --git a/plugins/scaffolder-common/src/TaskSpec.ts b/plugins/scaffolder-common/src/TaskSpec.ts index 09d46b7fbb..f0002ac0a5 100644 --- a/plugins/scaffolder-common/src/TaskSpec.ts +++ b/plugins/scaffolder-common/src/TaskSpec.ts @@ -67,7 +67,6 @@ export interface TaskSpecV1beta2 { output: { [name: string]: string }; /** @deprecated use templateInfo instead */ metadata?: TemplateMetadata; - templateInfo?: TemplateInfo; } From 0f37cdef191d0c4606ec396f1b810cb600633a65 Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 16 Feb 2022 15:03:02 +0100 Subject: [PATCH 10/16] chore: added a seperate changelog entry for the other packages Signed-off-by: blam --- .changeset/cool-ways-battle.md | 6 ++++-- .changeset/purple-camels-accept.md | 8 ++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 .changeset/purple-camels-accept.md diff --git a/.changeset/cool-ways-battle.md b/.changeset/cool-ways-battle.md index 264b8ca420..1ef108d9d2 100644 --- a/.changeset/cool-ways-battle.md +++ b/.changeset/cool-ways-battle.md @@ -2,5 +2,7 @@ '@backstage/plugin-scaffolder-common': patch --- -**DEPRECATION** - Deprecate `TaskSpecV1Beta3.metadata` in favour of the new `TaskSpecV1Beta3.templateInfo` -**DEPRECATION** - Deprecate `TaskSpecV1Beta3.baseUrl` in favour of the new `TaskSpecV1Beta3.templateInfo.baseUrl` +- **DEPRECATED** `TaskSpecV1Beta3.metadata` in favour of the new `TaskSpecV1Beta3.templateInfo` +- **DEPRECATED** `TaskSpecV1Beta3.baseUrl` in favour of the new `TaskSpecV1Beta3.templateInfo.baseUrl` +- **DEPRECATED** `TaskSpecV1Beta2.metadata` in favour of the new `TaskSpecV1Beta2.templateInfo` +- **DEPRECATED** `TaskSpecV1Beta2.baseUrl` in favour of the new `TaskSpecV1Beta2.templateInfo.baseUrl` diff --git a/.changeset/purple-camels-accept.md b/.changeset/purple-camels-accept.md new file mode 100644 index 0000000000..0ee64567f9 --- /dev/null +++ b/.changeset/purple-camels-accept.md @@ -0,0 +1,8 @@ +--- +'@backstage/plugin-scaffolder': patch +'@backstage/plugin-scaffolder-backend': patch +'@backstage/plugin-scaffolder-backend-module-cookiecutter': patch +'@backstage/plugin-scaffolder-backend-module-rails': patch +--- + +Migrated over from the deprecated `spec.metadata` to `spec.templateInfo` for the name and the `baseUrl` of the template. From f25fd16490f72f4827d6a3439dfce04dc5485a63 Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 16 Feb 2022 19:19:47 +0100 Subject: [PATCH 11/16] chore: fixing tests Signed-off-by: blam --- .../src/scaffolder/tasks/HandlebarsWorkflowRunner.test.ts | 2 +- .../src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/HandlebarsWorkflowRunner.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/HandlebarsWorkflowRunner.test.ts index aff0615733..c3f80f0b54 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/HandlebarsWorkflowRunner.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/HandlebarsWorkflowRunner.test.ts @@ -112,7 +112,7 @@ describe('LegacyWorkflowRunner', () => { await runner.execute(task); - expect(fakeActionHandler.mock.calls[0][0].metadata).toEqual({ + expect(fakeActionHandler.mock.calls[0][0].templateInfo).toEqual({ name: templateName, }); }); diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts index 03a185ea5a..0c808e620b 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts @@ -181,7 +181,7 @@ describe('DefaultWorkflowRunner', () => { await runner.execute(task); - expect(fakeActionHandler.mock.calls[0][0].metadata).toEqual({ + expect(fakeActionHandler.mock.calls[0][0].templateInfo).toEqual({ name: templateName, }); }); From a8c29cc99a8f6b01e45685892a4670c0d3d82aa4 Mon Sep 17 00:00:00 2001 From: blam Date: Thu, 17 Feb 2022 09:59:41 +0100 Subject: [PATCH 12/16] chore: move to entityRef Signed-off-by: blam --- .../src/actions/fetch/cookiecutter.test.ts | 2 +- plugins/scaffolder-common/src/TaskSpec.ts | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) 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 edc5c3ff77..2c1ecd06f9 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 @@ -90,7 +90,7 @@ describe('fetch:cookiecutter', () => { }, }, templateInfo: { - name: 'lols', + entityRef: 'template:default/cookiecutter', baseUrl: 'somebase', }, workspacePath: mockTmpDir, diff --git a/plugins/scaffolder-common/src/TaskSpec.ts b/plugins/scaffolder-common/src/TaskSpec.ts index f0002ac0a5..2c7eb26d5b 100644 --- a/plugins/scaffolder-common/src/TaskSpec.ts +++ b/plugins/scaffolder-common/src/TaskSpec.ts @@ -28,12 +28,13 @@ export type TemplateMetadata = { }; /** - * Information about a template that is stored on a task specification + * Information about a template that is stored on a task specification. + * Includes a stringified entityRef, and the baseUrl which is usually the relative path of the template definition * * @public */ export type TemplateInfo = { - name: string; + entityRef: string; baseUrl?: string; }; From bab802702996cf2de54897daea8cab8a50262421 Mon Sep 17 00:00:00 2001 From: blam Date: Thu, 17 Feb 2022 14:22:06 +0100 Subject: [PATCH 13/16] chore: reworking the templateInfo type Signed-off-by: blam --- .../scaffolder/actions/builtin/fetch/template.test.ts | 5 ++++- .../scaffolder/tasks/HandlebarsWorkflowRunner.test.ts | 2 +- .../src/scaffolder/tasks/HandlebarsWorkflowRunner.ts | 2 +- .../scaffolder/tasks/NunjucksWorkflowRunner.test.ts | 2 +- plugins/scaffolder-backend/src/service/router.ts | 9 ++++++++- .../scaffolder/src/components/TaskPage/TaskPage.tsx | 10 ++++++++-- 6 files changed, 23 insertions(+), 7 deletions(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts index 284b400833..3f1b338965 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts @@ -75,7 +75,10 @@ describe('fetch:template', () => { const logger = getVoidLogger(); const mockContext = (inputPatch: Partial = {}) => ({ - templateInfo: { baseUrl: 'base-url', name: 'test' }, + templateInfo: { + baseUrl: 'base-url', + entityRef: 'template:default/test-template', + }, input: { url: './skeleton', targetPath: './target', diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/HandlebarsWorkflowRunner.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/HandlebarsWorkflowRunner.test.ts index c3f80f0b54..59a8bf9097 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/HandlebarsWorkflowRunner.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/HandlebarsWorkflowRunner.test.ts @@ -107,7 +107,7 @@ describe('LegacyWorkflowRunner', () => { ], output: {}, values: {}, - templateInfo: { name: templateName }, + templateInfo: { entityRef: `template:default/${templateName}` }, }); await runner.execute(task); diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/HandlebarsWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/HandlebarsWorkflowRunner.ts index 135c40d95f..e525e6bd14 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/HandlebarsWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/HandlebarsWorkflowRunner.ts @@ -244,7 +244,7 @@ export class HandlebarsWorkflowRunner implements WorkflowRunner { stepOutputs[name] = value; }, // deprecated in favor of templateInfo - metadata: task.spec.templateInfo, + metadata: task.spec.metadata, templateInfo: task.spec.templateInfo, }); diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts index 0c808e620b..43a5c180be 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts @@ -176,7 +176,7 @@ describe('DefaultWorkflowRunner', () => { input: { foo: 1 }, }, ], - templateInfo: { name: templateName }, + templateInfo: { entityRef: `template:default/${templateName}` }, }); await runner.execute(task); diff --git a/plugins/scaffolder-backend/src/service/router.ts b/plugins/scaffolder-backend/src/service/router.ts index a5f5b5fa40..8a3645cf31 100644 --- a/plugins/scaffolder-backend/src/service/router.ts +++ b/plugins/scaffolder-backend/src/service/router.ts @@ -188,12 +188,15 @@ export async function createRouter( }) .post('/v2/tasks', async (req, res) => { const templateName: string = req.body.templateName; + const { kind, namespace } = { kind: 'template', namespace: 'default' }; const values = req.body.values; const token = getBearerToken(req.headers.authorization); const template = await findTemplate({ catalogApi: catalogClient, entityRef: { name: templateName, + kind, + namespace, }, token: getBearerToken(req.headers.authorization), }); @@ -234,7 +237,11 @@ export async function createRouter( metadata: { name: template.metadata?.name }, templateInfo: { - name: template.metadata?.name, + entityRef: stringifyEntityRef({ + kind, + namespace, + name: template.metadata?.name, + }), baseUrl, }, }; diff --git a/plugins/scaffolder/src/components/TaskPage/TaskPage.tsx b/plugins/scaffolder/src/components/TaskPage/TaskPage.tsx index 346a842838..a642660bac 100644 --- a/plugins/scaffolder/src/components/TaskPage/TaskPage.tsx +++ b/plugins/scaffolder/src/components/TaskPage/TaskPage.tsx @@ -14,6 +14,7 @@ * limitations under the License. */ +import { parseEntityRef } from '@backstage/catalog-model'; import { Content, ErrorPage, @@ -291,8 +292,9 @@ export const TaskPage = ({ loadingText }: TaskPageProps) => { const { output } = taskStream; const handleStartOver = () => { - if (!taskStream.task || !taskStream.task?.spec.templateInfo?.name) { + if (!taskStream.task || !taskStream.task?.spec.templateInfo?.entityRef) { navigate(generatePath(rootLink())); + return; } const formData = @@ -300,13 +302,17 @@ export const TaskPage = ({ loadingText }: TaskPageProps) => { ? taskStream.task!.spec.values : taskStream.task!.spec.parameters; + const { name } = parseEntityRef( + taskStream.task!.spec.templateInfo?.entityRef, + ); + navigate( generatePath( `${rootLink()}/templates/:templateName?${qs.stringify({ formData: JSON.stringify(formData), })}`, { - templateName: taskStream.task!.spec.templateInfo!.name, + templateName: name, }, ), ); From 8bd0d83311feb665c83c03442ebd83032208fbbe Mon Sep 17 00:00:00 2001 From: blam Date: Thu, 17 Feb 2022 14:30:56 +0100 Subject: [PATCH 14/16] chore: common is now entityRef Signed-off-by: blam --- plugins/scaffolder-common/api-report.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/scaffolder-common/api-report.md b/plugins/scaffolder-common/api-report.md index 92935bd5bb..1872aa3ed8 100644 --- a/plugins/scaffolder-common/api-report.md +++ b/plugins/scaffolder-common/api-report.md @@ -121,7 +121,7 @@ export const templateEntityV1beta3Validator: KindValidator; // @public export type TemplateInfo = { - name: string; + entityRef: string; baseUrl?: string; }; From 504e03b537d1a01134989cb70202e3426fdd0611 Mon Sep 17 00:00:00 2001 From: blam Date: Thu, 17 Feb 2022 15:16:34 +0100 Subject: [PATCH 15/16] chore: updating changeset description Signed-off-by: blam --- .changeset/cool-ways-battle.md | 10 ++++++---- .changeset/purple-camels-accept.md | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/.changeset/cool-ways-battle.md b/.changeset/cool-ways-battle.md index 1ef108d9d2..383e2879c0 100644 --- a/.changeset/cool-ways-battle.md +++ b/.changeset/cool-ways-battle.md @@ -2,7 +2,9 @@ '@backstage/plugin-scaffolder-common': patch --- -- **DEPRECATED** `TaskSpecV1Beta3.metadata` in favour of the new `TaskSpecV1Beta3.templateInfo` -- **DEPRECATED** `TaskSpecV1Beta3.baseUrl` in favour of the new `TaskSpecV1Beta3.templateInfo.baseUrl` -- **DEPRECATED** `TaskSpecV1Beta2.metadata` in favour of the new `TaskSpecV1Beta2.templateInfo` -- **DEPRECATED** `TaskSpecV1Beta2.baseUrl` in favour of the new `TaskSpecV1Beta2.templateInfo.baseUrl` +**DEPRECATED** - The `TaskSpec.metadata` and `TaskSpec.baseUrl` has been deprecated in favour of the new `TaskSpec.templateInfo`. +The `baseUrl` is now found on the `templateInfo` object, and the name can be inferred from the `templateInfo.entityRef` property. + +Usages of `TaskSpec.metadata.name` or `ctx.metadata.name` in Actions should migrate to using `parseEntityRef(taskSpec.templateInfo.entityRef)` to get the parsed entity triplet. + +Usages of `ctx.baseUrl` in Actions should migrate to using `ctx.templateInfo.baseUrl` instead. diff --git a/.changeset/purple-camels-accept.md b/.changeset/purple-camels-accept.md index 0ee64567f9..fe3da66a74 100644 --- a/.changeset/purple-camels-accept.md +++ b/.changeset/purple-camels-accept.md @@ -5,4 +5,4 @@ '@backstage/plugin-scaffolder-backend-module-rails': patch --- -Migrated over from the deprecated `spec.metadata` to `spec.templateInfo` for the name and the `baseUrl` of the template. +Migrated over from the deprecated `spec.metadata` to `spec.templateInfo` for the `name` and the `baseUrl` of the template. From f65b60d1014d029a8e34addc3b0a8285c8d76432 Mon Sep 17 00:00:00 2001 From: blam Date: Thu, 17 Feb 2022 15:24:35 +0100 Subject: [PATCH 16/16] chore: fixing broken tests Signed-off-by: blam --- .../src/actions/fetch/rails/index.test.ts | 7 +++++-- .../src/scaffolder/actions/builtin/fetch/template.test.ts | 2 +- .../src/scaffolder/tasks/HandlebarsWorkflowRunner.test.ts | 6 +++--- .../src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts | 6 +++--- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.test.ts b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.test.ts index 0c7552f72f..0a6a996aa8 100644 --- a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.test.ts +++ b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.test.ts @@ -62,7 +62,10 @@ describe('fetch:rails', () => { help: 'me', }, }, - baseUrl: 'somebase', + templateInfo: { + baseUrl: 'somebase', + entityRef: 'template:default/myTemplate', + }, workspacePath: mockTmpDir, logger: getVoidLogger(), logStream: new PassThrough(), @@ -100,7 +103,7 @@ describe('fetch:rails', () => { expect(fetchContents).toHaveBeenCalledWith({ reader: mockReader, integrations, - baseUrl: mockContext.baseUrl, + baseUrl: mockContext.templateInfo.baseUrl, fetchUrl: mockContext.input.url, outputPath: resolvePath(mockContext.workspacePath), }); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts index 3f1b338965..8f641fe2e2 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts @@ -202,7 +202,7 @@ describe('fetch:template', () => { it('uses fetchContents to retrieve the template content', () => { expect(mockFetchContents).toHaveBeenCalledWith( expect.objectContaining({ - baseUrl: context.baseUrl, + baseUrl: context.templateInfo?.baseUrl, fetchUrl: context.input.url, }), ); diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/HandlebarsWorkflowRunner.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/HandlebarsWorkflowRunner.test.ts index 59a8bf9097..9f4135b3d1 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/HandlebarsWorkflowRunner.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/HandlebarsWorkflowRunner.test.ts @@ -94,7 +94,7 @@ describe('LegacyWorkflowRunner', () => { }); it('should pass metadata through', async () => { - const templateName = 'template name'; + const entityRef = `template:default/templateName`; const task = createMockTaskWithSpec({ apiVersion: 'backstage.io/v1beta2', steps: [ @@ -107,13 +107,13 @@ describe('LegacyWorkflowRunner', () => { ], output: {}, values: {}, - templateInfo: { entityRef: `template:default/${templateName}` }, + templateInfo: { entityRef }, }); await runner.execute(task); expect(fakeActionHandler.mock.calls[0][0].templateInfo).toEqual({ - name: templateName, + entityRef, }); }); diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts index 43a5c180be..b66c69ee17 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts @@ -163,7 +163,7 @@ describe('DefaultWorkflowRunner', () => { }); it('should pass metadata through', async () => { - const templateName = 'template name'; + const entityRef = `template:default/templateName`; const task = createMockTaskWithSpec({ apiVersion: 'scaffolder.backstage.io/v1beta3', parameters: {}, @@ -176,13 +176,13 @@ describe('DefaultWorkflowRunner', () => { input: { foo: 1 }, }, ], - templateInfo: { entityRef: `template:default/${templateName}` }, + templateInfo: { entityRef }, }); await runner.execute(task); expect(fakeActionHandler.mock.calls[0][0].templateInfo).toEqual({ - name: templateName, + entityRef, }); });