From 704eb4eac712ca0d85e865de11d1c6dfbae43ed7 Mon Sep 17 00:00:00 2001 From: sblausten Date: Thu, 31 Oct 2024 10:05:10 +0100 Subject: [PATCH 1/4] Add parameters --- content/docs/docs-nav.yaml | 13 +- .../scaffolder/scaffolder-parameters/index.md | 563 ++++++++++++++++++ .../scaffolder/writing-templates/index.md | 339 ----------- 3 files changed, 570 insertions(+), 345 deletions(-) create mode 100644 content/docs/scaffolder/scaffolder-parameters/index.md diff --git a/content/docs/docs-nav.yaml b/content/docs/docs-nav.yaml index 1383d7dd3..1f6049e8e 100644 --- a/content/docs/docs-nav.yaml +++ b/content/docs/docs-nav.yaml @@ -117,12 +117,13 @@ nav: - Configuration: '/docs/custom-plugins/legacy/configuring/' - Publishing Plugins: '/docs/custom-plugins/legacy/artifactory/' - Scaffolder: - - Writing scaffolder templates: '/docs/scaffolder/writing-templates/' - - Certified templates: '/docs/scaffolder/certified-templates/' - - Troubleshooting: '/docs/scaffolder/troubleshooting/' - - Extending the Scaffolder with Field Extensions: '/docs/scaffolder/custom-fields/' - - Custom Scaffolder Actions: '/docs/scaffolder/self-hosted-scaffolder-actions/' - - Scaffolder Actions Directory: '/docs/scaffolder/scaffolder-actions-directory/' + - Overview: '/docs/scaffolder/writing-templates/' + - Scaffolder Actions: + - Actions Directory: '/docs/scaffolder/scaffolder-actions-directory/' + - Custom Scaffolder Actions: '/docs/scaffolder/self-hosted-scaffolder-actions/' + - Scaffolder Parameters: + - Paremeters Guide: '/docs/scaffolder/scaffolder-parameters' + - Custom Scaffolder Parameters: '/docs/scaffolder/custom-fields/' - Recipes: - Create RFC: '/docs/scaffolder/create-rfc/' - Debug template: '/docs/scaffolder/debug-template/' diff --git a/content/docs/scaffolder/scaffolder-parameters/index.md b/content/docs/scaffolder/scaffolder-parameters/index.md new file mode 100644 index 000000000..4844e6a3a --- /dev/null +++ b/content/docs/scaffolder/scaffolder-parameters/index.md @@ -0,0 +1,563 @@ +--- +title: Backstage Scaffolder Parameters +publishedDate: '2024-08-08' +description: Parameter form available for use in Backstage scaffolder templates +--- + +Parameters are how you get input data from users of Backstage Scaffolder templates. Parameters are defined in YAML alongside your template definition and rendered in a form when you run a template. + +They are defined in the template YAML file and each array element contains the configuration for a single page of items to be filled by the user running the template. + +Here is the most basic example: + +```yaml +parameters: + properties: + name: + type: string +``` + +The parameters YAML is based on [react-jsonschema-form](https://rjsf-team.github.io/react-jsonschema-form/). You can find the available base syntax options [there](https://rjsf-team.github.io/react-jsonschema-form/) and [YAML examples here](https://backstage.io/docs/features/software-templates/input-examples/). + +This page lists some examples from React Json Schema Form in YAML format for how to configure parameter forms in the Backstage Scaffolder. + +### Testing and iterating + +You can test the core RJSF parameters live in Roadie at `/create/tools` -> `Template Form Preview`. + +![parameters-preview](./parameters-preview.webp) + +**NB:** This tool does not work with complex form fields and some syntax that will work in the real Scaffolder like a single page form structured as an object. + +### Field types + +Each parameter can be one of a few types: `string`, `number`, `array` or `object`. + +#### `string` + +```yaml +parameters: + properties: + name: + type: string +``` + +NB: You can **validate strings** using a regex with the `pattern` parameter. See [Field Validation](#field-validation) below. + +#### `number` + +You can allow the user to enter a number using the `number` type: + +```yaml +parameters: + properties: + size: + type: number +``` + +#### `object` + +The `object` allows the collection of more complex types of data from the user. It contains the `properties` option to add variables to the object as follows: + +```yaml +parameters: + properties: + person: + type: object + properties: + name: + type: string + age: + type: number +``` + +You may choose to make an object property to be mandatory using the `required` property. + +```yaml +parameters: + properties: + person: + type: object + required: + - name + properties: + name: + type: string + age: + type: number +``` + +#### `array` + +You can prompt for an array of properties using the array option. The `items` option can be any type: `array`, `object`, `string` or `number` as you like. + +```yaml +parameters: + properties: + languages: + type: array + items: + type: string +``` + +#### `enums` + +Enums values can be provided for all these types like so: + +```yaml +properties: + name: + title: Name + type: string + enum: ['Tom', 'Bob'] +``` + +Enums render by default with a select dropdown. + +##### Radio and Checkboxes +You can use a radio or checkbox by adding the widget field: + +```yaml +properties: + name: + title: Name + type: string + enum: ['Tom', 'Bob'] + ui:widget: "RadioWidget" +``` + +```yaml +properties: + name: + title: Name + type: string + enum: ['Tom', 'Bob'] + ui:widget: "CheckboxesWidget" +``` + +##### Multi select +Multi select can be achieved using the array type: + +```yaml +properties: + names: + title: Names + type: array + ui:widget: "CheckboxesWidget" + uniqueItems: true + items: + enum: + - Tom + - Bob +``` + +##### Enum Display Names + +You can render a different name for your enum values using `enumNames`: + +```yaml +properties: + city: + title: City + type: string + enumNames: + - New York + - Amsterdam + - Hong Kong + enum: + - nyc + - ams + - hk +``` + +This is particularly useful for encoding additional hidden data in your enum values that can be used in later template steps: + +```yaml +properties: + city: + title: City + type: string + enumNames: + - New York + - Amsterdam + - Hong Kong + enum: + - name: 'New York' + lat: 40 + lon: 74 + - name: Amsterdam + lat: 52 + lon: 5 + - name: 'Hong Kong' + lat: 22 + lon: 114 + +steps: + - id: log-message + name: Log Message + action: debug:log + input: + message: 'The city ${{ parameters.city.name }} is at ${{ parameters.city.lat }},${{ parameters.city.lon }}' +``` + +### Field Validation + +You can use [react-jsonschema-form](https://rjsf-team.github.io/react-jsonschema-form/) to perform validation on input fields using a regex in the `pattern` filed or character counts using `maxLength` and `minLength`. + +```yaml +parameters: + properties: + name: + title: Simple text input + type: string + description: Description about input + maxLength: 8 + pattern: '^([a-zA-Z][a-zA-Z0-9]*)(-[a-zA-Z0-9]+)*$' + ui:autofocus: true + ui:help: 'Hint: additional description...' + errorMessage: + properties: + name: '1-8 alphanumeric tokens (first starts with letter) delimited by -' +``` + + +### Multi Page Forms + +You can choose to break up the parameters into form pages or collect all the parameters in one single page. + +**Single Page:** +```yaml +parameters: + properties: + name: + title: Name + type: string + email: + title: Email + type: string + maxLength: 8 + pattern: '^[^\s@]+@([^\s@.,]+\.)+[^\s@.,]{2,}$' + role: + title: Role + type: string + company: + title: Company Name + type: string +``` + +**Multi Page:** +```yaml +parameters: + - title: Provide some info about yourself + required: + - name + - email + properties: + name: + title: Name + type: string + email: + title: Email + type: string + maxLength: 8 + pattern: '^[^\s@]+@([^\s@.,]+\.)+[^\s@.,]{2,}$' + - title: Provide some info about your occupation + properties: + role: + title: Role + type: string + company: + title: Company Name + type: string +``` + +In a multipage form, each parameter page must contain `title` and `properties` + + +### Complex Form Fields + +#### Entity picker + +You can prompt the user with a list of catalog entities using the `ui:field: EntityPicker` option as follows: + +```yaml +parameters: + properties: + entity: + type: string + ui:field: EntityPicker +``` + +#### Owned entity picker + +Alternatively if you would like the user to only select entities that they already own, you might want to use the OwnedEntityPicker. + +```yaml +parameters: + properties: + ownedEntity: + type: string + ui:field: OwnedEntityPicker +``` + +#### Entity name picker + +If you would like a little validation when the user enters an Entity name, you can use the EntityNamePicker. It will prevent the user from entering an entity name that is not an acceptable entity name. + +```yaml +parameters: + properties: + ownedEntity: + type: string + ui:field: EntityNamePicker +``` + +#### Repository picker + +The respository picker can allow the user to select the name and location of a new repository. The picker restricts the target location of the repository to make it a little easier for the user to select a target location. + +The following example, will only allow the user to enter a new repository name targeting the GitHub using the AcmeInc organization. + +```yaml +parameters: + properties: + repoUrl: + type: string + ui:field: RepoUrlPicker + ui:options: + allowedHosts: + - github.com + allowedOwners: + - AcmeInc +``` + +The `RepoUrlPicker` uses the `allowedHosts` to decide how to build the repo url output value. If you use `bitbucket.org` it will output a valid repo url for Bitbucket. + +```yaml +parameters: + properties: + repoUrl: + type: string + ui:field: RepoUrlPicker + ui:options: + allowedHosts: + - bitbucket.org +``` + +#### Owner picker + +The owner picker, allows the user to select a user / group in the Backstage catalog. e.g. + +```yaml +parameters: + properties: + owner: + type: string + ui:field: OwnerPicker +``` + +This returns a variable in the format `group:/`. You can extract the entity name using replace when you refer to the parameter like so: `${{ parameters.owner | replace(\"group:.*/\", \"\") }}` + +#### Picker from external API source + +This custom scaffolder field, makes an API call to the Backstage backend and allows the result to be rendered to a list. + +```yaml +parameters: + properties: + custom: + title: custom + type: string + description: Custom field from external API + + # Use `SelectFieldFromApi` to configure the select field for the entry. + ui:field: SelectFieldFromApi + + ui:options: + # The Path on the Backstage API and the parameters to fetch the data for the dropdown + path: 'catalog/entity-facets' + params: + facet: 'kind' + + # This selects the array element from the API fetch response. It finds the array with the name kind + # under the facets object + arraySelector: 'facets.kind' + + # (Optional) This selects the field in the array to use for the value of each select item. If its not specified + # it will use the value of the item directly. + valueSelector: 'count' + # (Optional) This selects the field in the array to use for the label of each select item. + labelSelector: 'value' +``` + +Some of the `SelectFieldFromApi` options allow using parameters from earlier parameter pages to be used to template the options. The templated options are `params`, `path`, `valueSelector` and `labelSelector`. e.g. + +```yaml +parameters: + - title: Select an Entity kind + required: + - kind + properties: + kind: + title: Kind + type: string + enum: + - template + - location + default: template + ui:autofocus: true + ui:options: + rows: 5 + - title: Select the specific entity you want + properties: + obj: + title: custom + type: string + description: Entity Selector + ui:field: SelectFieldFromApi + ui:options: + path: "catalog/entities" + params: + filter: "kind={{ parameters.kind }}" + valueSelector: "metadata.name" + labelSelector: "metadata.description" +``` + +## Re-using Parameter Pages + +You can create re-usable form pages using the `placeholders` feature like so: + +```yaml +--- +apiVersion: scaffolder.backstage.io/v1beta3 +kind: Template +metadata: + name: global-param-example + title: Example of sourcing params from a constant +spec: + owner: roadie + type: service + + parameters: + - $yaml: ./constants/products.yaml + + steps: + - id: log-message + name: List selected product + action: debug:log + input: + message: 'Selected product: ${{ parameters.product }}' +``` + + +./constants/products.yaml +```yaml +title: Select Product +properties: + product: + title: Product + type: string + enum: ["Search", "CRM", "Onboarding"] +``` + +**NB:** This only works for top level parameters objects and not for sections within a form page. + + +### Using Parameters In Actions + +Parameters can be retrieved later on by action steps using parameter outputs. Here is an example of a parameter `name` being used by a `debug:log` step. + +```yaml +parameters: + properties: + name: + type: string +steps: + - id: log-message + name: Log Message + action: debug:log + input: + message: 'Hello, ${{ parameters.name }}!' +``` + +If you need to reference elements of an array parameter you can refer to them using the following syntax: + +```yaml +steps: + - id: log-message + name: Log Message + action: debug:log + input: + message: 'Hello, ${{ parameters.names[0] }}!' +``` + +An `object` parameter values can be reference in the way you might expect. Keys with special characters can be accessed via square bracket notation like so `${{ parameters["something-else"] }}` + +```yaml +steps: + - id: log-message + name: Log Message + action: debug:log + input: + message: 'Hello, ${{ parameters.person.name }}!' +``` + +#### Using logic in Parameter references + +Inliine logic can be used in these references also via pipe functions using [Nunjucks templating syntax](https://mozilla.github.io/nunjucks/templating.html#builtin-filters). + +i.e. +```yaml +steps: + - id: log-message + name: Log Message + action: debug:log + input: + message: "Hello, ${{ parameters.name | replace('Mr', 'Mrs') | capitalize }}! You have lived at the following addresses: ${{ parameters.addresses | join(", ") }}" +``` + +Available filters are listed in [Nunjucks documentation here](https://mozilla.github.io/nunjucks/templating.html#builtin-filters). + + +### Default values + +If you would like to default the value of a field you can use the `default` option: + +```yaml +parameters: + properties: + name: + type: string + default: 'world!' +``` + +### Field display options +You can display a more human description to a field value by using `title` and `description` + +```yaml +parameters: + properties: + name: + type: string + title: 'Name' + description: 'Name to say hello to' +``` + +## Adding custom parameters + +You can extend and customize the available Scaffolder functionality by using [Roadie Custom Plugins](/docs/custom-plugins/overview/) and creating a `Field extension`. + +You can find more information on how this is done [in the tutorial on the Open Source Backstage documentation page.](https://backstage.io/docs/features/software-templates/writing-custom-field-extensions/) + +Field extensions are react form components that can be imported dynamically into the Roadie Scaffolder. You can use the same workflow and development experience to build your own custom Scaffolder Field Extensions as any other plugin, using the Roadie CLI. + +### Registering your Field Extension + +Scaffolder Field Extensions are automatically registered to be usable within Scaffolder Templates, once they have been registered as a [Custom Plugin component](/docs/custom-plugins/overview/) in the Roadie application. You can do this by navigating to the `Administration` -> `Custom Plugins` page and registering your Custom Plugin bundle, including a component of type `ScaffolderFieldExtension`. + +![Custom plugin registration form](custom_plugin_registration_form.webp) + +## Links +- [Official Backstage docs](https://backstage.io/docs/features/software-templates/writing-templates). +- [Nunjucks templating docs](https://mozilla.github.io/nunjucks/templating.html) + diff --git a/content/docs/scaffolder/writing-templates/index.md b/content/docs/scaffolder/writing-templates/index.md index 977398b64..c6a2c6e4a 100644 --- a/content/docs/scaffolder/writing-templates/index.md +++ b/content/docs/scaffolder/writing-templates/index.md @@ -112,346 +112,7 @@ parameters: type: string ``` -### Validation -You can use [react-jsonschema-form](https://rjsf-team.github.io/react-jsonschema-form/) to perform validation on input fields using a regex or character counts. - -```yaml -parameters: - properties: - name: - title: Simple text input - type: string - description: Description about input - maxLength: 8 - pattern: '^([a-zA-Z][a-zA-Z0-9]*)(-[a-zA-Z0-9]+)*$' - ui:autofocus: true - ui:help: 'Hint: additional description...' -``` - -### `string` - -You may collect text data from the user by using the string type. Here is the most basic example. It will prompt the user for a name. - -```yaml -parameters: - properties: - name: - type: string -``` - -#### Entity picker - -You can prompt the user with a list of catalog entities using the `ui:field: EntityPicker` option as follows: - -```yaml -parameters: - properties: - entity: - type: string - ui:field: EntityPicker -``` - -#### Owned entity picker - -Alternatively if you would like the user to only select entities that they already own, you might want to use the OwnedEntityPicker. - -```yaml -parameters: - properties: - ownedEntity: - type: string - ui:field: OwnedEntityPicker -``` - -#### Entity name picker - -If you would like a little validation when the user enters an Entity name, you can use the EntityNamePicker. It will prevent the user from entering an entity name that is not an acceptable entity name. - -```yaml -parameters: - properties: - ownedEntity: - type: string - ui:field: EntityNamePicker -``` - -#### Repository picker - -The respository picker can allow the user to select the name and location of a new repository. The picker restricts the target location of the repository to make it a little easier for the user to select a target location. - -The following example, will only allow the user to enter a new repository name targeting the GitHub using the AcmeInc organization. - -```yaml -parameters: - properties: - repoUrl: - type: string - ui:field: RepoUrlPicker - ui:options: - allowedHosts: - - github.com - allowedOwners: - - AcmeInc -``` - -The `RepoUrlPicker` uses the `allowedHosts` to decide how to build the repo url output value. If you use `bitbucket.org` it will output a valid repo url for Bitbucket. - -```yaml -parameters: - properties: - repoUrl: - type: string - ui:field: RepoUrlPicker - ui:options: - allowedHosts: - - bitbucket.org -``` - -#### Owner picker - -The owner picker, allows the user to select a user / group in the Backstage catalog. e.g. - -```yaml -parameters: - properties: - owner: - type: string - ui:field: OwnerPicker -``` - -This returns a variable in the format `group:/`. You can extract the entity name using replace when you refer to the parameter like so: `${{ parameters.owner | replace(\"group:.*/\", \"\") }}` - -#### Picker from external API source - -This custom scaffolder field, makes an API call to the Backstage backend and allows the result to be rendered to a list. - -```yaml -parameters: - properties: - custom: - title: custom - type: string - description: Custom field from external API - - # Use `SelectFieldFromApi` to configure the select field for the entry. - ui:field: SelectFieldFromApi - - ui:options: - # The Path on the Backstage API and the parameters to fetch the data for the dropdown - path: 'catalog/entity-facets' - params: - facet: 'kind' - - # This selects the array element from the API fetch response. It finds the array with the name kind - # under the facets object - arraySelector: 'facets.kind' - - # (Optional) This selects the field in the array to use for the value of each select item. If its not specified - # it will use the value of the item directly. - valueSelector: 'count' - # (Optional) This selects the field in the array to use for the label of each select item. - labelSelector: 'value' -``` - -Some of the `SelectFieldFromApi` options allow using parameters from earlier parameter pages to be used to template the options. The templated options are `params`, `path`, `valueSelector` and `labelSelector`. e.g. - -```yaml -parameters: - - title: Select an Entity kind - required: - - kind - properties: - kind: - title: Kind - type: string - enum: - - template - - location - default: template - ui:autofocus: true - ui:options: - rows: 5 - - title: Select the specific entity you want - properties: - obj: - title: custom - type: string - description: Entity Selector - ui:field: SelectFieldFromApi - ui:options: - path: "catalog/entities" - params: - filter: "kind={{ parameters.kind }}" - valueSelector: "metadata.name" - labelSelector: "metadata.description" -``` - -### `number` - -You can allow the user to enter a number using the `number` type: - -```yaml -parameters: - properties: - size: - type: number -``` - -### `object` - -The `object` allows the collection of more complex types of data from the user. It contains the `properties` option to add variables to the object as follows: - -```yaml -parameters: - properties: - person: - type: object - properties: - name: - type: string - age: - type: number -``` - -You may choose to make an object property to be mandatory using the `required` property. - -```yaml -parameters: - properties: - person: - type: object - required: - - name - properties: - name: - type: string - age: - type: number -``` - -### `array` - -You can prompt for an array of properties using the array option. The `items` option can be any type: `array`, `object`, `string` or `number` as you like. - -```yaml -parameters: - properties: - languages: - type: array - items: - type: string -``` - -If you would like to prompt the user to add entity tags, you can use the `ui:field: EntityTagPicker` as shown below. - -```yaml -parameters: - properties: - entityTags: - type: array - ui:field: EntityTagsPicker -``` - -### Outputs - -Parameters can be retrieved later on by steps using parameter outputs. Here is an example of a parameter `name` being used by a `debug:log` step. - -```yaml -parameters: - properties: - name: - type: string -steps: - - id: log-message - name: Log Message - action: debug:log - input: - message: 'Hello, ${{ parameters.name }}!' -``` - -If you need to reference elements of an array parameter you can refer to them using the following syntax: - -```yaml -steps: - - id: log-message - name: Log Message - action: debug:log - input: - message: 'Hello, ${{ parameters.names[0] }}!' -``` - -An `object` parameter values can be reference in the way you might expect. - -```yaml -steps: - - id: log-message - name: Log Message - action: debug:log - input: - message: 'Hello, ${{ parameters.person.name }}!' -``` - -### Common Options - -If you would like to default the value of a field you can use the `default` option: - -```yaml -parameters: - properties: - name: - type: string - default: 'world!' -``` - -If you would like to prompt the users for a fixed list of options, you may use the `enum` option. - -```yaml -parameters: - properties: - size: - type: number - enum: [50, 100, 200] -``` - -You can display a more human description to a field value by using `title` and `description` - -```yaml -parameters: - properties: - name: - type: string - title: 'Name' - description: 'Name to say hello to' -``` - -### Form Steps - -It might be jarring for your user to enter a lot of parameters one after another on the same page, especially if some properties require validation. As such Backstage have provided form steps. - -You can make use of form steps using the following example. - -```yaml -parameters: - - title: 'Fill in the Name' - properties: - name: - type: string - - title: 'Fill in the Age' - properties: - age: - type: number -``` - -### Previewing parameters - -Template Preview, which is accessible via `Tools > Template Preview` provides a preview page for templates, where you can see a live preview of the template form. This is done in order to provide an easy way to preview scaffolder template form UIs without running your own local instance of the plugin or committing changes to the template. - -![parameters-preview](./parameters-preview.webp) - -### More Reading - -You can read more about parameter configuration in the official backstage docs [here](https://backstage.io/docs/features/software-templates/writing-templates). ## `steps` From ad06d733cc7297e11ac8eac3234ece1c1b9073a9 Mon Sep 17 00:00:00 2001 From: sblausten Date: Thu, 31 Oct 2024 10:48:10 +0100 Subject: [PATCH 2/4] Comments --- .../scaffolder/scaffolder-parameters/index.md | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/content/docs/scaffolder/scaffolder-parameters/index.md b/content/docs/scaffolder/scaffolder-parameters/index.md index 4844e6a3a..9588c9f18 100644 --- a/content/docs/scaffolder/scaffolder-parameters/index.md +++ b/content/docs/scaffolder/scaffolder-parameters/index.md @@ -1,6 +1,6 @@ --- title: Backstage Scaffolder Parameters -publishedDate: '2024-08-08' +publishedDate: '2024-10-31' description: Parameter form available for use in Backstage scaffolder templates --- @@ -276,6 +276,10 @@ In a multipage form, each parameter page must contain `title` and `properties` ### Complex Form Fields +The following items are enhanced form fields that can be used out of the box to build richer forms for your templates. + +Roadie allows you to [create your own custom React form components](#adding-custom-parameters) and use them in the same way if you have special use cases. + #### Entity picker You can prompt the user with a list of catalog entities using the `ui:field: EntityPicker` option as follows: @@ -423,6 +427,21 @@ parameters: labelSelector: "metadata.description" ``` +## Adding custom parameters + +You can extend and customize the available Scaffolder functionality by using [Roadie Custom Plugins](/docs/custom-plugins/overview/) and creating a `Field extension`. + +You can find more information on how this is done [in the tutorial on the Open Source Backstage documentation page.](https://backstage.io/docs/features/software-templates/writing-custom-field-extensions/) + +Field extensions are react form components that can be imported dynamically into the Roadie Scaffolder. You can use the same workflow and development experience to build your own custom Scaffolder Field Extensions as any other plugin, using the Roadie CLI. + +### Registering your Field Extension + +Scaffolder Field Extensions are automatically registered to be usable within Scaffolder Templates, once they have been registered as a [Custom Plugin component](/docs/custom-plugins/overview/) in the Roadie application. You can do this by navigating to the `Administration` -> `Custom Plugins` page and registering your Custom Plugin bundle, including a component of type `ScaffolderFieldExtension`. + +![Custom plugin registration form](custom_plugin_registration_form.webp) + + ## Re-using Parameter Pages You can create re-usable form pages using the `placeholders` feature like so: @@ -543,20 +562,6 @@ parameters: description: 'Name to say hello to' ``` -## Adding custom parameters - -You can extend and customize the available Scaffolder functionality by using [Roadie Custom Plugins](/docs/custom-plugins/overview/) and creating a `Field extension`. - -You can find more information on how this is done [in the tutorial on the Open Source Backstage documentation page.](https://backstage.io/docs/features/software-templates/writing-custom-field-extensions/) - -Field extensions are react form components that can be imported dynamically into the Roadie Scaffolder. You can use the same workflow and development experience to build your own custom Scaffolder Field Extensions as any other plugin, using the Roadie CLI. - -### Registering your Field Extension - -Scaffolder Field Extensions are automatically registered to be usable within Scaffolder Templates, once they have been registered as a [Custom Plugin component](/docs/custom-plugins/overview/) in the Roadie application. You can do this by navigating to the `Administration` -> `Custom Plugins` page and registering your Custom Plugin bundle, including a component of type `ScaffolderFieldExtension`. - -![Custom plugin registration form](custom_plugin_registration_form.webp) - ## Links - [Official Backstage docs](https://backstage.io/docs/features/software-templates/writing-templates). - [Nunjucks templating docs](https://mozilla.github.io/nunjucks/templating.html) From 7a632866a73fddb410ad7bcfa4ae61a02271a31b Mon Sep 17 00:00:00 2001 From: sblausten Date: Thu, 31 Oct 2024 10:58:55 +0100 Subject: [PATCH 3/4] Add image --- .../scaffolder/scaffolder-parameters/index.md | 28 +++++++++++++----- .../scaffolder-parameters/rendering.jpg | Bin 0 -> 32505 bytes 2 files changed, 21 insertions(+), 7 deletions(-) create mode 100644 content/docs/scaffolder/scaffolder-parameters/rendering.jpg diff --git a/content/docs/scaffolder/scaffolder-parameters/index.md b/content/docs/scaffolder/scaffolder-parameters/index.md index 9588c9f18..aa7d94cba 100644 --- a/content/docs/scaffolder/scaffolder-parameters/index.md +++ b/content/docs/scaffolder/scaffolder-parameters/index.md @@ -6,17 +6,30 @@ description: Parameter form available for use in Backstage scaffolder templates Parameters are how you get input data from users of Backstage Scaffolder templates. Parameters are defined in YAML alongside your template definition and rendered in a form when you run a template. -They are defined in the template YAML file and each array element contains the configuration for a single page of items to be filled by the user running the template. - -Here is the most basic example: +Here is the most basic example of a single parameter form field in a template: ```yaml -parameters: - properties: - name: - type: string +--- +apiVersion: scaffolder.backstage.io/v1beta3 +kind: Template +metadata: + name: parameters-example +spec: + owner: roadiehq + type: example + parameters: + properties: + name: + type: string + steps: + - id: log-message + action: debug:log + input: + message: 'Hello ${{ parameters.name }}' ``` +![Screenshot of rendered template](./rendering.jpg) + The parameters YAML is based on [react-jsonschema-form](https://rjsf-team.github.io/react-jsonschema-form/). You can find the available base syntax options [there](https://rjsf-team.github.io/react-jsonschema-form/) and [YAML examples here](https://backstage.io/docs/features/software-templates/input-examples/). This page lists some examples from React Json Schema Form in YAML format for how to configure parameter forms in the Backstage Scaffolder. @@ -563,6 +576,7 @@ parameters: ``` ## Links +- [React Json Schema Form](https://rjsf-team.github.io/react-jsonschema-form/ - [Official Backstage docs](https://backstage.io/docs/features/software-templates/writing-templates). - [Nunjucks templating docs](https://mozilla.github.io/nunjucks/templating.html) diff --git a/content/docs/scaffolder/scaffolder-parameters/rendering.jpg b/content/docs/scaffolder/scaffolder-parameters/rendering.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a679dfcc120f4cf85f3775321fe274cefcd43d87 GIT binary patch literal 32505 zcmeFZ2UrzbvMAh}4Qz4-$vGz_2g$gB4U&^2CFdLkBnSe!K{AMB$w&~8AR;O`XC#Uu zIV(}ge}m_E&fJ+dGk5NN|Nrj)X7R1=>grn6t7@%PyQ)?<=M(3%0D-asLIHrFKmaB1 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 literal 0 HcmV?d00001 From f2ece21e1830b01c856107a8ba8e168fcf02c034 Mon Sep 17 00:00:00 2001 From: sblausten Date: Thu, 31 Oct 2024 11:22:16 +0100 Subject: [PATCH 4/4] Missing image --- .../parameters-preview.webp | Bin 0 -> 59062 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 content/docs/scaffolder/scaffolder-parameters/parameters-preview.webp diff --git a/content/docs/scaffolder/scaffolder-parameters/parameters-preview.webp b/content/docs/scaffolder/scaffolder-parameters/parameters-preview.webp new file mode 100644 index 0000000000000000000000000000000000000000..13f2d6e0f1af31e6544079a16ef5b7adcb9b026c GIT binary patch literal 59062 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