diff --git a/.changeset/tidy-jokes-itch.md b/.changeset/tidy-jokes-itch.md new file mode 100644 index 0000000000..1a3684a0a7 --- /dev/null +++ b/.changeset/tidy-jokes-itch.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-common': patch +--- + +Add optional `lifecycle` property to the spec field of Template entities. diff --git a/plugins/scaffolder-common/report.api.md b/plugins/scaffolder-common/report.api.md index 3aa7e08121..455921c085 100644 --- a/plugins/scaffolder-common/report.api.md +++ b/plugins/scaffolder-common/report.api.md @@ -87,6 +87,7 @@ export interface TemplateEntityV1beta3 extends Entity { [name: string]: string; }; owner?: string; + lifecycle?: string; }; } diff --git a/plugins/scaffolder-common/src/Template.v1beta3.schema.json b/plugins/scaffolder-common/src/Template.v1beta3.schema.json index 58f8ef240a..a9f846068c 100644 --- a/plugins/scaffolder-common/src/Template.v1beta3.schema.json +++ b/plugins/scaffolder-common/src/Template.v1beta3.schema.json @@ -15,6 +15,7 @@ "spec": { "owner": "artist-relations-team", "type": "website", + "lifecycle": "production", "parameters": { "required": ["name", "description", "repoUrl"], "backstage:permissions": { @@ -95,6 +96,12 @@ "description": "The user (or group) owner of the template", "minLength": 1 }, + "lifecycle": { + "type": "string", + "description": "The lifecycle state of the template.", + "examples": ["experimental", "production", "deprecated"], + "minLength": 1 + }, "parameters": { "oneOf": [ { diff --git a/plugins/scaffolder-common/src/TemplateEntityV1beta3.test.ts b/plugins/scaffolder-common/src/TemplateEntityV1beta3.test.ts index 432292548e..744ec3ad9c 100644 --- a/plugins/scaffolder-common/src/TemplateEntityV1beta3.test.ts +++ b/plugins/scaffolder-common/src/TemplateEntityV1beta3.test.ts @@ -181,4 +181,14 @@ describe('templateEntityV1beta3Validator', () => { entity.spec.steps[0]['backstage:permissions'] = true as {}; expect(() => validator(entity)).toThrow(/must be object/); }); + + it('accepts undefined lifecycle', async () => { + delete (entity as any).spec.lifecycle; + expect(validator(entity)).toBe(entity); + }); + + it('accepts valid lifecycle', async () => { + (entity as any).spec.lifecycle = 'production'; + expect(validator(entity)).toBe(entity); + }); }); diff --git a/plugins/scaffolder-common/src/TemplateEntityV1beta3.ts b/plugins/scaffolder-common/src/TemplateEntityV1beta3.ts index c5b576b5c2..304057af77 100644 --- a/plugins/scaffolder-common/src/TemplateEntityV1beta3.ts +++ b/plugins/scaffolder-common/src/TemplateEntityV1beta3.ts @@ -80,6 +80,10 @@ export interface TemplateEntityV1beta3 extends Entity { * The owner entityRef of the TemplateEntity */ owner?: string; + /** + * Specifies the lifecycle phase of the TemplateEntity + */ + lifecycle?: string; }; }