Merge branch 'master' into fix/issue-25890
This commit is contained in:
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/backend-defaults': patch
|
||||
---
|
||||
|
||||
Add access restrictions to the JWKS external access method config schema
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-catalog': patch
|
||||
---
|
||||
|
||||
Export `RelatedEntitiesCard` presets to be reused.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-scaffolder': patch
|
||||
---
|
||||
|
||||
Add an extra bit of height to the EntityPicker dropdown to make it clear there are more options to select from, and to remove the scroll bar when there is less than 10 options
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/frontend-plugin-api': patch
|
||||
---
|
||||
|
||||
Fixing issue with extension blueprints `inputs` merging.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-scaffolder-react': patch
|
||||
---
|
||||
|
||||
Fixed a bug in `DefaultTableOutputs` where output elements overlapped on smaller screen sizes
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-catalog': patch
|
||||
---
|
||||
|
||||
The entity relation cards available for the new frontend system via `/alpha` now have more accurate and granular default filters.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/backend-app-api': minor
|
||||
---
|
||||
|
||||
**BREAKING**: Removed several deprecated service factories. These can instead be imported from `@backstage/backend-defaults` package.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/backend-plugin-api': patch
|
||||
---
|
||||
|
||||
Added `createBackendFeatureLoader`, which can be used to create an installable backend feature that can in turn load in additional backend features in a dynamic way.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/frontend-plugin-api': patch
|
||||
---
|
||||
|
||||
Added support for using the `params` in other properties of the `createExtensionBlueprint` options by providing a callback.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/frontend-plugin-api': patch
|
||||
---
|
||||
|
||||
Renamed `createPlugin` to `createFrontendPlugin`. The old symbol is still exported but deprecated.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-notifications': patch
|
||||
---
|
||||
|
||||
Fixed issue with notification reloading on page change
|
||||
@@ -0,0 +1,7 @@
|
||||
---
|
||||
'@backstage/plugin-catalog-backend': patch
|
||||
---
|
||||
|
||||
`ProcessorOutputCollector` returns an error when receiving deferred entities that have an invalid `metadata.annotations` format.
|
||||
|
||||
This allows to return an error on an actual validation issue instead of reporting that the location annotations are missing afterwards, which is misleading for the users.
|
||||
@@ -0,0 +1,7 @@
|
||||
---
|
||||
'@backstage/plugin-catalog-react': patch
|
||||
'@backstage/plugin-search-react': patch
|
||||
'@backstage/plugin-catalog': patch
|
||||
---
|
||||
|
||||
Deprecate the old pattern of `create*Extension`, and replace it with the equivalent Blueprint implementation instead.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/frontend-plugin-api': patch
|
||||
---
|
||||
|
||||
Correct the `TConfig` type of data references to only contain config
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/backend-app-api': patch
|
||||
---
|
||||
|
||||
Added support for the latest version of `BackendFeature`s from `@backstage/backend-plugin-api`, including feature loaders.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/backend-test-utils': patch
|
||||
---
|
||||
|
||||
Internal updates to support latest version of `BackendFeauture`s from `@backstage/backend-plugin-api`.
|
||||
@@ -0,0 +1,16 @@
|
||||
---
|
||||
'@backstage/plugin-scaffolder-backend-module-confluence-to-markdown': patch
|
||||
'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch
|
||||
'@backstage/plugin-scaffolder-backend-module-cookiecutter': patch
|
||||
'@backstage/backend-dynamic-feature-service': patch
|
||||
'@backstage/plugin-scaffolder-backend-module-rails': patch
|
||||
'@backstage/plugin-catalog-backend-module-openapi': patch
|
||||
'@backstage/plugin-catalog-backend-module-aws': patch
|
||||
'@backstage/plugin-search-backend-node': patch
|
||||
'@backstage/plugin-scaffolder-backend': patch
|
||||
'@backstage/plugin-catalog-backend': patch
|
||||
'@backstage/plugin-scaffolder-node': patch
|
||||
'@backstage/plugin-techdocs-node': patch
|
||||
---
|
||||
|
||||
Update deprecated url-reader-related imports.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-kubernetes-react': patch
|
||||
---
|
||||
|
||||
`Liveness Probe` added in ContainerCard Component of PodDrawer
|
||||
@@ -0,0 +1,6 @@
|
||||
---
|
||||
'@backstage/plugin-scaffolder-backend': patch
|
||||
'@backstage/plugin-scaffolder-node': patch
|
||||
---
|
||||
|
||||
Add support for status filtering in scaffolder tasks endpoint
|
||||
@@ -0,0 +1,15 @@
|
||||
---
|
||||
'@backstage/backend-plugin-api': minor
|
||||
---
|
||||
|
||||
**BREAKING** Deleted the following deprecated `UrlReader` exports
|
||||
|
||||
- ReadUrlOptions: Use `UrlReaderServiceReadUrlOptions` instead;
|
||||
- ReadUrlResponse: Use `UrlReaderServiceReadUrlResponse` instead;
|
||||
- ReadTreeOptions: Use `UrlReaderServiceReadTreeOptions` instead;
|
||||
- ReadTreeResponse: Use `UrlReaderServiceReadTreeResponse` instead;
|
||||
- ReadTreeResponseFile: Use `UrlReaderServiceReadTreeResponseFile` instead;
|
||||
- ReadTreeResponseDirOptions: Use `UrlReaderServiceReadTreeResponseDirOptions` instead;
|
||||
- SearchOptions: Use `UrlReaderServiceSearchOptions` instead;
|
||||
- SearchResponse: Use `UrlReaderServiceSearchResponse` instead;
|
||||
- SearchResponseFile: Use `UrlReaderServiceSearchResponseFile` instead.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-scaffolder-backend-module-bitbucket-cloud': patch
|
||||
---
|
||||
|
||||
Added autocompletion support for resource `branches`
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-scaffolder-backend-module-bitbucket-cloud': patch
|
||||
---
|
||||
|
||||
Add ability to set the initial commit message when initializing a repository using the scaffolder action.
|
||||
@@ -0,0 +1,6 @@
|
||||
---
|
||||
'@backstage/plugin-notifications-backend-module-email': patch
|
||||
'@backstage/plugin-notifications-backend': patch
|
||||
---
|
||||
|
||||
Avoid sending broadcast emails as a fallback in case the entity-typed notification user can not be resolved.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-scaffolder-backend-module-azure': patch
|
||||
---
|
||||
|
||||
Added examples for publish:azure action and updated its test cases
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-api-docs': patch
|
||||
---
|
||||
|
||||
`ConsumingComponentsCard` and `ProvidingComponentsCard` will now optionally accept `columns` to override which table columns are displayed
|
||||
@@ -0,0 +1,10 @@
|
||||
---
|
||||
'@backstage/backend-test-utils': patch
|
||||
'@backstage/plugin-kubernetes-node': patch
|
||||
'@backstage/plugin-kubernetes-backend': patch
|
||||
'@backstage/plugin-scaffolder-backend': patch
|
||||
'@backstage/plugin-proxy-backend': patch
|
||||
'@backstage/backend-dynamic-feature-service': patch
|
||||
---
|
||||
|
||||
Update internal imports
|
||||
@@ -0,0 +1,20 @@
|
||||
---
|
||||
'@backstage/frontend-plugin-api': patch
|
||||
---
|
||||
|
||||
Support overriding of plugin extensions using the new `plugin.withOverrides` method.
|
||||
|
||||
```tsx
|
||||
import homePlugin from '@backstage/plugin-home';
|
||||
|
||||
export default homePlugin.withOverrides({
|
||||
extensions: [
|
||||
homePage.getExtension('page:home').override({
|
||||
*factory(originalFactory) {
|
||||
yield* originalFactory();
|
||||
yield coreExtensionData.reactElement(<h1>My custom home page</h1>);
|
||||
},
|
||||
}),
|
||||
],
|
||||
});
|
||||
```
|
||||
@@ -0,0 +1,8 @@
|
||||
---
|
||||
'@backstage/frontend-test-utils': patch
|
||||
'@backstage/frontend-app-api': patch
|
||||
'@backstage/core-compat-api': patch
|
||||
'@backstage/plugin-app-visualizer': patch
|
||||
---
|
||||
|
||||
Updated usage of `useRouteRef`, which can now always return `undefined`.
|
||||
@@ -0,0 +1,6 @@
|
||||
---
|
||||
'@backstage/backend-defaults': patch
|
||||
---
|
||||
|
||||
Added deprecation warning to urge users to perform the auth service migration or implement their own token manager service.
|
||||
See https://backstage.io/docs/tutorials/auth-service-migration for more information.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/cli': patch
|
||||
---
|
||||
|
||||
Switched the `process` polyfill to use `require.resolve` for greater compatability.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/backend-defaults': patch
|
||||
---
|
||||
|
||||
update the `morgan` middleware to use a custom format to prevent PII from being logged
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-scaffolder-backend-module-gitlab': patch
|
||||
---
|
||||
|
||||
Added test cases for gitlab:issues:create examples
|
||||
@@ -0,0 +1,14 @@
|
||||
---
|
||||
'@backstage/plugin-app-visualizer': patch
|
||||
'@backstage/plugin-catalog-graph': patch
|
||||
'@backstage/plugin-catalog-import': patch
|
||||
'@backstage/plugin-catalog': patch
|
||||
'@backstage/plugin-devtools': patch
|
||||
'@backstage/plugin-org': patch
|
||||
'@backstage/plugin-scaffolder': patch
|
||||
'@backstage/plugin-search': patch
|
||||
'@backstage/plugin-techdocs': patch
|
||||
'@backstage/plugin-user-settings': patch
|
||||
---
|
||||
|
||||
Deprecate the old pattern of `create*Extension`, and replace it with the equivalent Blueprint implementation instead
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/backend-app-api': minor
|
||||
---
|
||||
|
||||
Remove deprecated `urlReaderServiceFactory`, please import from `@backstage/backend-defaults/urlReader` instead.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-techdocs': patch
|
||||
---
|
||||
|
||||
Allow for more granular control of TechDocsReaderPage styling. Theme overrides can now be provided to TechDocs without affecting the theme in other areas of Backstage.
|
||||
@@ -0,0 +1,6 @@
|
||||
---
|
||||
'@backstage/backend-plugin-api': patch
|
||||
'@backstage/backend-defaults': patch
|
||||
---
|
||||
|
||||
The `SchedulerService` now allows tasks with `frequency: { trigger: 'manual' }`. This means that the task will not be scheduled, but rather run only when manually triggered with `SchedulerService.triggerTask`.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-scaffolder-backend-module-github': patch
|
||||
---
|
||||
|
||||
Added examples for github:repo:create action and improved test cases
|
||||
@@ -0,0 +1,26 @@
|
||||
---
|
||||
'@backstage/backend-plugin-api': patch
|
||||
---
|
||||
|
||||
Added `createBackendFeatureLoader`, which can be used to programmatically select and install backend features.
|
||||
|
||||
A feature loader can return an list of features to be installed, for example in the form on an `Array` or other for of iterable, which allows for the loader to be defined as a generator function. Both synchronous and asynchronous loaders are supported.
|
||||
|
||||
Additionally, a loader can depend on services in its implementation, with the restriction that it can only depend on root-scoped services, and it may not override services that have already been instantiated.
|
||||
|
||||
```ts
|
||||
const searchLoader = createBackendFeatureLoader({
|
||||
deps: {
|
||||
config: coreServices.rootConfig,
|
||||
},
|
||||
*loader({ config }) {
|
||||
// Example of a custom config flag to enable search
|
||||
if (config.getOptionalString('customFeatureToggle.search')) {
|
||||
yield import('@backstage/plugin-search-backend/alpha');
|
||||
yield import('@backstage/plugin-search-backend-module-catalog/alpha');
|
||||
yield import('@backstage/plugin-search-backend-module-explore/alpha');
|
||||
yield import('@backstage/plugin-search-backend-module-techdocs/alpha');
|
||||
}
|
||||
},
|
||||
});
|
||||
```
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-scaffolder-backend': minor
|
||||
---
|
||||
|
||||
Added OpenTelemetry support to Scaffolder metrics
|
||||
@@ -0,0 +1,12 @@
|
||||
---
|
||||
'@backstage/backend-test-utils': minor
|
||||
---
|
||||
|
||||
**BREAKING**: Removed these deprecated helpers:
|
||||
|
||||
- `setupRequestMockHandlers` Use `CreateMockDirectoryOptions` instead.
|
||||
- `CreateMockDirectoryOptions` Use `registerMswTestHooks` instead.
|
||||
|
||||
Stopped exporting the deprecated and internal `isDockerDisabledForTests` helper.
|
||||
|
||||
Removed `get` method from `ServiceFactoryTester` which is replaced by `getSubject`
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-notifications-backend': patch
|
||||
---
|
||||
|
||||
fix: consider broadcast union with user
|
||||
@@ -0,0 +1,36 @@
|
||||
---
|
||||
'@backstage/backend-common': minor
|
||||
---
|
||||
|
||||
**BREAKING**: Removed the following `Url Reader` deprecated exports:
|
||||
|
||||
- UrlReader: Use `UrlReaderService` from `@backstage/backend-plugin-api` instead;
|
||||
- AzureUrlReader: Import from `@backstage/backend-defaults/urlReader` instead;
|
||||
- BitbucketUrlReader: Import from `@backstage/backend-defaults/urlReader` instead;
|
||||
- BitbucketCloudUrlReader: Import from `@backstage/backend-defaults/urlReader` instead;
|
||||
- BitbucketServerUrlReader: Import from `@backstage/backend-defaults/urlReader` instead;
|
||||
- GithubUrlReader: Import from `@backstage/backend-defaults/urlReader` instead;
|
||||
- GitlabUrlReader: Import from `@backstage/backend-defaults/urlReader` instead;
|
||||
- GerritUrlReader: Import from `@backstage/backend-defaults/urlReader` instead;
|
||||
- GiteaUrlReader: Import from `@backstage/backend-defaults/urlReader` instead;
|
||||
- HarnessUrlReader: Import from `@backstage/backend-defaults/urlReader` instead;
|
||||
- AwsS3UrlReader: Import from `@backstage/backend-defaults/urlReader` instead;
|
||||
- FetchUrlReader: Import from `@backstage/backend-defaults/urlReader` instead;
|
||||
- UrlReaders: Import from `@backstage/backend-defaults/urlReader` instead;
|
||||
- UrlReadersOptions: Import from `@backstage/backend-defaults/urlReader` instead;
|
||||
- UrlReaderPredicateTuple: Import from `@backstage/backend-defaults/urlReader` instead;
|
||||
- FromReadableArrayOptions: Import from `@backstage/backend-defaults/urlReader` instead;
|
||||
- ReaderFactory: Import from `@backstage/backend-defaults/urlReader` instead;
|
||||
- ReadUrlOptions:Use `UrlReaderServiceReadUrlOptions` from `@backstage/backend-plugin-api` instead;
|
||||
- ReadUrlResponse: Use `UrlReaderServiceReadUrlResponse` from `@backstage/backend-plugin-api` instead;
|
||||
- ReadUrlResponseFactory: Import from `@backstage/backend-defaults/urlReader` instead;
|
||||
- ReadUrlResponseFactoryFromStreamOptions: Import from `@backstage/backend-defaults/urlReader` instead;
|
||||
- ReadTreeOptions: Use `UrlReaderServiceReadTreeOptions` from `@backstage/backend-plugin-api` instead;
|
||||
- ReadTreeResponse: Use `UrlReaderServiceReadTreeResponse` from `@backstage/backend-plugin-api` instead;
|
||||
- ReadTreeResponseFile: Use `UrlReaderServiceReadTreeResponseFile` from `@backstage/backend-plugin-api` instead;
|
||||
- ReadTreeResponseDirOptions: Use `UrlReaderServiceReadTreeResponseDirOptions` from `@backstage/backend-plugin-api` instead;
|
||||
- ReadTreeResponseFactory: Import from `@backstage/backend-defaults/urlReader` instead;
|
||||
- ReadTreeResponseFactoryOptions: Import from `@backstage/backend-defaults/urlReader` instead;
|
||||
- SearchOptions: Use `UrlReaderServiceSearchOptions` from `@backstage/backend-plugin-api` instead;
|
||||
- SearchResponse: Use `UrlReaderServiceSearchResponse` from `@backstage/backend-plugin-api` instead;
|
||||
- SearchResponseFile: Use `UrlReaderServiceSearchResponseFile` from `@backstage/backend-plugin-api` instead.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/backend-tasks': patch
|
||||
---
|
||||
|
||||
The `PluginTaskScheduler` now allows tasks with `frequency: { trigger: 'manual' }`. This means that the task will not be scheduled, but rather run only when manually triggered with `PluginTaskScheduler.triggerTask`.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/backend-app-api': patch
|
||||
---
|
||||
|
||||
Update the `ServiceRegister` implementation to enable registering multiple service implementations for a given service ref.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-techdocs-backend': patch
|
||||
---
|
||||
|
||||
Added back `type: 'local'` to TechDocs config schema for `publisher`
|
||||
@@ -0,0 +1,10 @@
|
||||
---
|
||||
'@backstage/core-compat-api': patch
|
||||
'@backstage/frontend-app-api': patch
|
||||
'@backstage/frontend-test-utils': patch
|
||||
'@backstage/plugin-api-docs': patch
|
||||
'@backstage/plugin-home': patch
|
||||
'@backstage/plugin-kubernetes': patch
|
||||
---
|
||||
|
||||
Migrating usages of the deprecated `createExtension` `v1` format to the newer `v2` format, and old `create*Extension` extension creators to blueprints.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-notifications-backend': patch
|
||||
---
|
||||
|
||||
Allow using notifications without users in the catalog
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-auth-node': minor
|
||||
---
|
||||
|
||||
**BREAKING**: Sign-in resolvers configured via `.signIn.resolvers` now take precedence over sign-in resolvers passed to `signInResolver` option of `createOAuthProviderFactory`. This effectively makes sign-in resolvers passed via the `signInResolver` the default one, which you can then override through configuration.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/backend-dev-utils': patch
|
||||
---
|
||||
|
||||
Fix `EventEmitter` memory leak in the development utilities
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/frontend-plugin-api': patch
|
||||
---
|
||||
|
||||
Add support for accessing extensions definitions provided by a plugin via `plugin.getExtension(...)`. For this to work the extensions must be defined using the v2 format, typically using an extension blueprint.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-scaffolder': minor
|
||||
---
|
||||
|
||||
Changed the way to display entities in `MyGroupsPicker` to use `entityPresentationApi` and make it consistent across scaffolder pickers
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-techdocs': patch
|
||||
---
|
||||
|
||||
Refactor TechDocs' mkdocs-redirects support.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-techdocs': patch
|
||||
---
|
||||
|
||||
TechDocs redirect feature now includes a notification to the user before they are redirected.
|
||||
+72
-1
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"mode": "pre",
|
||||
"mode": "exit",
|
||||
"tag": "next",
|
||||
"initialVersions": {
|
||||
"example-app": "0.2.99",
|
||||
@@ -190,41 +190,73 @@
|
||||
"@backstage/plugin-techdocs-common": "0.0.0"
|
||||
},
|
||||
"changesets": [
|
||||
"angry-dolphins-camp",
|
||||
"big-countries-wait",
|
||||
"big-eagles-grab",
|
||||
"blue-pumas-cheer",
|
||||
"breezy-cats-kiss",
|
||||
"breezy-jeans-tie",
|
||||
"breezy-rings-fly",
|
||||
"bright-donkeys-buy",
|
||||
"bright-trainers-brake",
|
||||
"calm-crabs-drop",
|
||||
"chilly-days-peel",
|
||||
"chilly-trains-sleep",
|
||||
"clean-kids-applaud",
|
||||
"clever-pans-brake",
|
||||
"cool-insects-remember",
|
||||
"cool-schools-vanish",
|
||||
"create-app-1722413762",
|
||||
"cuddly-zebras-crash",
|
||||
"curvy-pillows-joke",
|
||||
"cyan-shrimps-push",
|
||||
"dry-squids-tap",
|
||||
"dull-ghosts-double",
|
||||
"early-trees-dance",
|
||||
"eighty-emus-leave",
|
||||
"eighty-jokes-deny",
|
||||
"eighty-mirrors-flow",
|
||||
"fair-hairs-mix",
|
||||
"fair-pumas-hang",
|
||||
"fast-bulldogs-relax",
|
||||
"few-wasps-hug",
|
||||
"five-mangos-agree",
|
||||
"flat-papayas-push",
|
||||
"flat-plums-grow",
|
||||
"forty-ties-agree",
|
||||
"forty-ties-disagree",
|
||||
"fresh-timers-walk",
|
||||
"friendly-cherries-applaud",
|
||||
"friendly-chicken-cry",
|
||||
"friendly-feet-refuse",
|
||||
"funny-bears-sort",
|
||||
"funny-wolves-learn",
|
||||
"gentle-dryers-smile",
|
||||
"good-steaks-report",
|
||||
"green-planets-reflect",
|
||||
"grumpy-owls-suffer",
|
||||
"healthy-fireants-jump",
|
||||
"healthy-timers-divide",
|
||||
"heavy-numbers-love",
|
||||
"hip-fishes-guess",
|
||||
"hip-hairs-exist",
|
||||
"itchy-experts-tie",
|
||||
"khaki-lamps-peel",
|
||||
"late-games-protect",
|
||||
"light-pianos-exercise",
|
||||
"little-bulldogs-guess",
|
||||
"little-suns-fly",
|
||||
"mean-apricots-perform",
|
||||
"metal-planes-nail",
|
||||
"metal-rice-call",
|
||||
"mighty-apricots-taste",
|
||||
"mighty-dolls-retire",
|
||||
"mighty-geckos-kiss",
|
||||
"modern-parrots-protect",
|
||||
"modern-poems-mate",
|
||||
"neat-bears-divide",
|
||||
"neat-gifts-join",
|
||||
"neat-socks-cheer",
|
||||
"new-scissors-try",
|
||||
"nice-peas-retire",
|
||||
"nine-cherries-decide",
|
||||
@@ -232,20 +264,41 @@
|
||||
"nine-seahorses-relate",
|
||||
"ninety-icons-smile",
|
||||
"odd-books-share",
|
||||
"old-tools-smell",
|
||||
"olive-books-sort",
|
||||
"orange-gifts-protect",
|
||||
"perfect-cars-jam",
|
||||
"pink-gorillas-brake",
|
||||
"plenty-tools-exist",
|
||||
"popular-panthers-hear",
|
||||
"purple-carrots-crash",
|
||||
"quick-roses-juggle",
|
||||
"rare-foxes-compete",
|
||||
"real-lizards-sit",
|
||||
"red-radios-promise",
|
||||
"renovate-147ac48",
|
||||
"renovate-f04beb1",
|
||||
"rich-mugs-dress",
|
||||
"selfish-bees-think",
|
||||
"seven-days-film",
|
||||
"seven-eggs-admire",
|
||||
"shaggy-dodos-applaud",
|
||||
"shaggy-mugs-return",
|
||||
"shy-games-poke",
|
||||
"shy-waves-share",
|
||||
"silly-candles-sin",
|
||||
"silly-cycles-tan",
|
||||
"silly-scissors-turn",
|
||||
"silver-pillows-begin",
|
||||
"six-mails-smell",
|
||||
"six-rats-kick",
|
||||
"sixty-kiwis-poke",
|
||||
"slow-ducks-rush",
|
||||
"slow-ligers-drum",
|
||||
"slow-rocks-end",
|
||||
"slow-toes-jog",
|
||||
"small-bottles-cough",
|
||||
"small-ears-poke",
|
||||
"small-spoons-shout",
|
||||
"smooth-countries-relate",
|
||||
"soft-gorillas-refuse",
|
||||
@@ -253,20 +306,38 @@
|
||||
"spicy-planets-provide",
|
||||
"spotty-planets-accept",
|
||||
"strange-papayas-beg",
|
||||
"strong-chicken-kiss",
|
||||
"strong-otters-compete",
|
||||
"stupid-dots-relate",
|
||||
"sweet-oranges-buy",
|
||||
"swift-kings-sparkle",
|
||||
"tall-snakes-fix",
|
||||
"tasty-ads-rescue",
|
||||
"ten-penguins-roll",
|
||||
"thick-hotels-know",
|
||||
"thick-squids-drive",
|
||||
"thin-carrots-eat",
|
||||
"thirty-adults-grab",
|
||||
"thirty-paws-hope",
|
||||
"tiny-dodos-prove-2",
|
||||
"tiny-dodos-prove",
|
||||
"tiny-oranges-pretend",
|
||||
"tough-goats-hang",
|
||||
"tough-lies-repair",
|
||||
"tricky-ducks-juggle",
|
||||
"tricky-rules-destroy",
|
||||
"two-emus-work",
|
||||
"violet-jokes-wave",
|
||||
"warm-monkeys-marry",
|
||||
"weak-jobs-joke",
|
||||
"wicked-bobcats-teach",
|
||||
"wild-eggs-exist",
|
||||
"wise-spiders-walk",
|
||||
"witty-bears-behave",
|
||||
"witty-geese-battle",
|
||||
"witty-queens-run",
|
||||
"witty-timers-marry",
|
||||
"young-birds-push",
|
||||
"young-games-visit",
|
||||
"young-peaches-shake"
|
||||
]
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/backend-test-utils': patch
|
||||
---
|
||||
|
||||
Update the `ServiceFactoryTester` to be able to test services that enables multi implementation installation.
|
||||
@@ -0,0 +1,6 @@
|
||||
---
|
||||
'@backstage/plugin-auth-backend-module-gcp-iap-provider': patch
|
||||
'@backstage/core-components': patch
|
||||
---
|
||||
|
||||
Corrected the documentation for the GCP IAP auth module and updated the configuration to follow proxy configuration conventions by ignoring authEnv
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-scaffolder': patch
|
||||
---
|
||||
|
||||
Fix undefined in the title of Scaffolder Runs on the page load
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-api-docs': patch
|
||||
---
|
||||
|
||||
Updated dependency `@graphiql/react` to `^0.23.0`.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/backend-plugin-api': patch
|
||||
---
|
||||
|
||||
Fixed a type issue where plugin and modules depending on multiton services would not receive the correct type.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-techdocs-backend': patch
|
||||
---
|
||||
|
||||
Update configuration schema to match actual behavior
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-notifications-backend-module-email': patch
|
||||
---
|
||||
|
||||
Add support for stream transport for debugging purposes
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/backend-defaults': patch
|
||||
---
|
||||
|
||||
Update the `UrlReader` service to depends on multiple instances of `UrlReaderFactoryProvider` service.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-techdocs': patch
|
||||
---
|
||||
|
||||
TechDocs now supports the `mkdocs-redirects` plugin. Redirects defined using the `mkdocs-redirect` plugin will be handled automatically in TechDocs. Redirecting to external urls is not supported. In the case that an external redirect url is provided, TechDocs will redirect to the current documentation site home.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/create-app': patch
|
||||
---
|
||||
|
||||
Included permission config and enabled it out of the box
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/backend-common': patch
|
||||
---
|
||||
|
||||
Internal type refactor.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/frontend-plugin-api': patch
|
||||
---
|
||||
|
||||
Support merging of `inputs` in extension blueprints, but stop merging `output`. In addition, the original factory in extension blueprints now returns a data container that both provides access to the returned data, but can also be forwarded as output.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/backend-defaults': patch
|
||||
---
|
||||
|
||||
use formatted query to prevent chance of SQL-injection
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/core-compat-api': patch
|
||||
---
|
||||
|
||||
Both `compatWrapper` and `convertLegacyRouteRef` now support converting from the new system to the old.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/cli': patch
|
||||
---
|
||||
|
||||
Updated dependency `@module-federation/enhanced` to `0.3.1`
|
||||
@@ -0,0 +1,58 @@
|
||||
---
|
||||
'@backstage/backend-plugin-api': minor
|
||||
---
|
||||
|
||||
The `createServiceRef` function now accepts a new boolean `multiple` option. The `multiple` option defaults to `false` and when set to `true`, it enables that multiple implementation are installed for the created service ref.
|
||||
|
||||
We're looking for ways to make it possible to augment services without the need to replace the entire service.
|
||||
|
||||
Typical example of that being the ability to install support for additional targets for the `UrlReader` service without replacing the service itself. This achieves that by allowing us to define services that can have multiple simultaneous implementation, allowing the `UrlReader` implementation to depend on such a service to collect all possible implementation of support for external targets:
|
||||
|
||||
```diff
|
||||
// @backstage/backend-defaults
|
||||
|
||||
+ export const urlReaderFactoriesServiceRef = createServiceRef<ReaderFactory>({
|
||||
+ id: 'core.urlReader.factories',
|
||||
+ scope: 'plugin',
|
||||
+ multiton: true,
|
||||
+ });
|
||||
|
||||
...
|
||||
|
||||
export const urlReaderServiceFactory = createServiceFactory({
|
||||
service: coreServices.urlReader,
|
||||
deps: {
|
||||
config: coreServices.rootConfig,
|
||||
logger: coreServices.logger,
|
||||
+ factories: urlReaderFactoriesServiceRef,
|
||||
},
|
||||
- async factory({ config, logger }) {
|
||||
+ async factory({ config, logger, factories }) {
|
||||
return UrlReaders.default({
|
||||
config,
|
||||
logger,
|
||||
+ factories,
|
||||
});
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
With that, you can then add more custom `UrlReader` factories by installing more implementations of the `urlReaderFactoriesServiceRef` in your backend instance. Something like:
|
||||
|
||||
```ts
|
||||
// packages/backend/index.ts
|
||||
import { createServiceFactory } from '@backstage/backend-plugin-api';
|
||||
import { urlReaderFactoriesServiceRef } from '@backstage/backend-defaults';
|
||||
...
|
||||
|
||||
backend.add(createServiceFactory({
|
||||
service: urlReaderFactoriesServiceRef,
|
||||
deps: {},
|
||||
async factory() {
|
||||
return CustomUrlReader.factory;
|
||||
},
|
||||
}));
|
||||
|
||||
...
|
||||
|
||||
```
|
||||
@@ -0,0 +1,7 @@
|
||||
---
|
||||
'@backstage/frontend-plugin-api': minor
|
||||
---
|
||||
|
||||
**BREAKING**: All types of route refs are always considered optional by `useRouteRef`, which means the caller must always handle a potential `undefined` return value. Related to this change, the `optional` option from `createExternalRouteRef` has been removed, since it is no longer necessary.
|
||||
|
||||
This is released as an immediate breaking change as we expect the usage of the new route refs to be extremely low or zero, since plugins that support the new system will still use route refs and `useRouteRef` from `@backstage/core-plugin-api` in combination with `convertLegacyRouteRef` from `@backstage/core-compat-api`.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-auth-backend-module-cloudflare-access-provider': minor
|
||||
---
|
||||
|
||||
Support for Cloudflare Custom Headers and Custom Cookie Auth Name
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/backend-defaults': patch
|
||||
---
|
||||
|
||||
Avoid excessive numbers of error listeners on cache clients
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-notifications': minor
|
||||
---
|
||||
|
||||
By default, set notification as read when opening snackbar or web notification link
|
||||
@@ -0,0 +1,34 @@
|
||||
---
|
||||
'@backstage/frontend-plugin-api': patch
|
||||
'@backstage/frontend-test-utils': patch
|
||||
---
|
||||
|
||||
Added support for being able to override extension definitions.
|
||||
|
||||
```tsx
|
||||
const TestCard = EntityCardBlueprint.make({
|
||||
...
|
||||
});
|
||||
|
||||
TestCard.override({
|
||||
// override attachment points
|
||||
attachTo: { id: 'something-else', input: 'overridden' },
|
||||
// extend the config schema
|
||||
config: {
|
||||
schema: {
|
||||
newConfig: z => z.string().optional(),
|
||||
}
|
||||
},
|
||||
// override factory
|
||||
*factory(originalFactory, { inputs, config }){
|
||||
const originalOutput = originalFactory();
|
||||
|
||||
yield coreExentsionData.reactElement(
|
||||
<Wrapping>
|
||||
{originalOutput.get(coreExentsionData.reactElement)}
|
||||
</Wrapping>
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
```
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-scaffolder-backend-module-github': patch
|
||||
---
|
||||
|
||||
Added examples for action github:pages and improved its test cases
|
||||
@@ -0,0 +1,6 @@
|
||||
---
|
||||
'@backstage/plugin-search-backend-node': patch
|
||||
'@backstage/plugin-catalog-node': patch
|
||||
---
|
||||
|
||||
Explicit declare if the service ref accepts `single` or `multiple` implementations.
|
||||
@@ -0,0 +1,19 @@
|
||||
---
|
||||
'@backstage/frontend-test-utils': patch
|
||||
---
|
||||
|
||||
Deprecate the `.render` method of the `createExtensionTester` in favour of using `renderInTestApp` directly.
|
||||
|
||||
```tsx
|
||||
import {
|
||||
renderInTestApp,
|
||||
createExtensionTester,
|
||||
} from '@backstage/frontend-test-utils';
|
||||
|
||||
const tester = createExtensionTester(extension);
|
||||
|
||||
const { getByTestId } = renderInTestApp(tester.reactElement());
|
||||
|
||||
// or if you're not using `coreExtensionData.reactElement` as the output ref
|
||||
const { getByTestId } = renderInTestApp(tester.get(myComponentRef));
|
||||
```
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/backend-common': patch
|
||||
---
|
||||
|
||||
export `createConfigSecretEnumerator` from `@backstage/backend-common` instead of `@backstage/backend-app-api`.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/frontend-test-utils': patch
|
||||
---
|
||||
|
||||
Deprecate existing `ExtensionCreators` in favour of their new Blueprint counterparts.
|
||||
@@ -0,0 +1,9 @@
|
||||
---
|
||||
'@backstage/frontend-test-utils': patch
|
||||
---
|
||||
|
||||
Refactor `.make` method on Blueprints into two different methods, `.make` and `.makeWithOverrides`.
|
||||
|
||||
When using `createExtensionBlueprint` you can define parameters for the factory function, if you wish to take advantage of these parameters you should use `.make` when creating an extension instance of a Blueprint. If you wish to override more things other than the standard `attachTo`, `name`, `namespace` then you should use `.makeWithOverrides` instead.
|
||||
|
||||
`.make` is reserved for simple creation of extension instances from Blueprints using higher level parameters, whereas `.makeWithOverrides` is lower level and you have more control over the final extension.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-scaffolder': minor
|
||||
---
|
||||
|
||||
Added field extension `RepoBranchPicker` that supports autocompletion for Bitbucket
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-techdocs-node': patch
|
||||
---
|
||||
|
||||
Fix TechDocs Edit URL for nested docs
|
||||
@@ -0,0 +1,8 @@
|
||||
---
|
||||
'@backstage/plugin-catalog-backend-module-github': patch
|
||||
---
|
||||
|
||||
Fix GitHub `repository` event support.
|
||||
|
||||
- `$.repository.organization` is only provided for `push` events. Switched to `$.organization.login` instead.
|
||||
- `$.repository.url` is not always returning the expected and required value. Use `$.repository.html_url` instead.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-scaffolder-backend-module-sentry': patch
|
||||
---
|
||||
|
||||
Added test cases for sentry:project:create examples
|
||||
@@ -0,0 +1,6 @@
|
||||
---
|
||||
'@backstage/plugin-api-docs': patch
|
||||
'@backstage/plugin-catalog': patch
|
||||
---
|
||||
|
||||
Add `tableOptions` to all tables and additionally `title` to API tables.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-catalog-react': patch
|
||||
---
|
||||
|
||||
Entity page extensions created for the new frontend system via the `/alpha` exports will now be enabled by default.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-notifications-backend-module-email': patch
|
||||
---
|
||||
|
||||
Notification email processor supports allowing or denying specific email addresses from receiving notifications
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-bitbucket-cloud-common': patch
|
||||
---
|
||||
|
||||
Added method `listBranchesByRepository` to `BitbucketCloudClient`
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/catalog-model': minor
|
||||
---
|
||||
|
||||
Introduce an optional spec.type attribute on the Domain and System entity kinds
|
||||
@@ -243,8 +243,10 @@ Mkdocs
|
||||
monorepo
|
||||
Monorepo
|
||||
monorepos
|
||||
morgan
|
||||
msgraph
|
||||
msw
|
||||
multiton
|
||||
mutex
|
||||
mutexes
|
||||
mysql
|
||||
|
||||
@@ -51,7 +51,7 @@ jobs:
|
||||
|
||||
- run: yarn build-storybook
|
||||
|
||||
- uses: chromaui/action@5991575112b472a4fa85429f29cc17e2fb83a2a2 # v11
|
||||
- uses: chromaui/action@fdbe7756d4dbf493e2fbb822df73be7accd07e1c # v11
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
# projectToken intentionally shared to allow collaborators to run Chromatic on forks
|
||||
|
||||
@@ -0,0 +1,223 @@
|
||||
---
|
||||
title: Supporting templating syntax in `parameters` schema
|
||||
status: provisional
|
||||
authors:
|
||||
- '@benjdlambert'
|
||||
owners:
|
||||
- '@benjdlambert'
|
||||
- '@backstage/scaffolder-maintainers'
|
||||
project-areas:
|
||||
- scaffolder
|
||||
creation-date: 2024-03-26
|
||||
---
|
||||
|
||||
<!--
|
||||
**Note:** When your BEP is complete, all these pre-existing comments should be removed
|
||||
|
||||
When editing BEPs, aim for tightly-scoped, single-topic PRs to keep discussions focused. If you disagree with what is already in a document, open a new PR with suggested changes.
|
||||
-->
|
||||
|
||||
# BEP: Supporting templating syntax in `parameters` schema
|
||||
|
||||
<!-- Before merging the initial BEP PR, create a feature issue and update the below link. You can wait with this step until the BEP is ready to be merged. -->
|
||||
|
||||
[**Discussion Issue**](https://github.com/backstage/backstage/issues/16275)
|
||||
|
||||
- [Summary](#summary)
|
||||
- [Motivation](#motivation)
|
||||
- [Goals](#goals)
|
||||
- [Non-Goals](#non-goals)
|
||||
- [Proposal](#proposal)
|
||||
- [Design Details](#design-details)
|
||||
- [Release Plan](#release-plan)
|
||||
- [Dependencies](#dependencies)
|
||||
- [Alternatives](#alternatives)
|
||||
|
||||
## Summary
|
||||
|
||||
<!--
|
||||
The summary of the BEP is a few paragraphs long and give a high-level overview of the features to be implemented. It should be possible to read *only* the summary and understand what the BEP is proposing to accomplish and what impact it has for users.
|
||||
-->
|
||||
|
||||
This BEP proposes to add support for templating syntax in the `parameters` schema of a scaffolder template.
|
||||
This will allow users to define properties in the JSON Schema which are templated from current values that have been collected from the user already.
|
||||
This can be useful when you want to use a value that has already been collected as a default value in another field.
|
||||
|
||||
For example:
|
||||
|
||||
```yaml
|
||||
apiVersion: scaffolder.backstage.io/v1beta3
|
||||
kind: Template
|
||||
metadata:
|
||||
name: my-template
|
||||
spec:
|
||||
parameters:
|
||||
- title: Some input
|
||||
description: Get some info from the user
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
default: Test
|
||||
description:
|
||||
type: string
|
||||
default: ${{ parameters.name or "unknown" }}-description
|
||||
```
|
||||
|
||||
## Motivation
|
||||
|
||||
<!--
|
||||
This section is for explicitly listing the motivation, goals, and non-goals of
|
||||
this BEP. Describe why the change is important and the benefits to users.
|
||||
-->
|
||||
|
||||
Inclusive of the initial RFC there's been a swarm of issues that are requesting this feature, and we want to align on the implementation and design of this feature.
|
||||
|
||||
See the following:
|
||||
|
||||
- https://github.com/backstage/backstage/issues/16275
|
||||
- https://github.com/backstage/backstage/pull/23283
|
||||
- https://github.com/backstage/backstage/issues/19597
|
||||
- https://github.com/backstage/backstage/issues/20533
|
||||
- https://github.com/backstage/backstage/pull/17746
|
||||
|
||||
There's some ideas for introducing a templating syntax for both templating into the `parameters` schema, and also being able to pass through some templating strings to underlying field extensions that can use those templating strings.
|
||||
We want to align here so that we're not going to have those conflict or compete, and create a standard for how to achieve templating in both circumstances.
|
||||
|
||||
### Goals
|
||||
|
||||
<!--
|
||||
List the specific goals of the BEP. What is it trying to achieve? How will we
|
||||
know that this has succeeded?
|
||||
-->
|
||||
|
||||
- This BEP will settle the implementation for the templating of fields into the JSON Schema in the `parameters` section in the scaffolder templates.
|
||||
- This BEP will settle how to pass through templating strings to underlying field extensions in a non-conflicting way.
|
||||
|
||||
### Non-Goals
|
||||
|
||||
<!--
|
||||
What is out of scope for this BEP? Listing non-goals helps to focus discussion
|
||||
and make progress.
|
||||
-->
|
||||
|
||||
## Proposal
|
||||
|
||||
The proposal is to be able to decorate the template schema server side with a context and use that to drive the form rendering client side.
|
||||
|
||||
We can extend the `/parameter-schema` endpoint to accept a `formData` context query parameter which will be a JSON object of the current `formData` state. This in turn allows the scaffolder frontend to repeatedly call the endpoint to get the updated rendered parameter schema. We'll need to turn the endpoint into a `POST` endpoint to accept the form data, but will retain the `GET` version for backwards compatibility.
|
||||
|
||||
## Design Details
|
||||
|
||||
### Example implementation of the `/parameter-schema` endpoint
|
||||
|
||||
```diff
|
||||
export interface ScaffolderApi {
|
||||
getTemplateParameterSchema(
|
||||
templateRef: string,
|
||||
+ formData?: JsonObject,
|
||||
): Promise<TemplateParameterSchema>;
|
||||
}
|
||||
```
|
||||
|
||||
```diff
|
||||
router
|
||||
- .get(
|
||||
+ .post(
|
||||
'/v2/templates/:namespace/:kind/:name/parameter-schema',
|
||||
async (req, res) => {
|
||||
const credentials = await httpAuth.credentials(req);
|
||||
const { token } = await auth.getPluginRequestToken({
|
||||
onBehalfOf: credentials,
|
||||
targetPluginId: 'catalog',
|
||||
});
|
||||
const template = await authorizeTemplate(
|
||||
req.params,
|
||||
token,
|
||||
credentials,
|
||||
);
|
||||
|
||||
const parameters = [template.spec.parameters ?? []].flat();
|
||||
+ const secureTemplater = await SecureTemplater.loadRenderer({
|
||||
+ templateFilters: {
|
||||
+ ...createDefaultFilters({ integrations }),
|
||||
+ ...additionalTemplateFilters,
|
||||
+ },
|
||||
+ templateGlobals: additionalTemplateGlobals,
|
||||
+ });
|
||||
+
|
||||
+ const templatedParameters = parameters.map(parameter =>
|
||||
+ renderTemplateString(
|
||||
+ parameter,
|
||||
+ {
|
||||
+ parameters: req.body.formData,
|
||||
+ },
|
||||
+ secureTemplater,
|
||||
+ logger,
|
||||
+ ),
|
||||
+ );
|
||||
```
|
||||
|
||||
You can see a quick implementation of this in this [branch](https://github.com/backstage/backstage/compare/master...blam/templating-in-parameters)
|
||||
|
||||
### Workaround for the `default` field
|
||||
|
||||
There's a slight issue with the implementation of the `react-jsonschema-form`, which makes things like live updating on things like the `default` field slightly more difficult.
|
||||
Currently, on first render, the default value is populated and then stored in the `formData` object or the current state, and the default value is never re-evaluated again at a later stage.
|
||||
|
||||
This means that if end users are wanting to set default values with `${{ parameters.myOtherProperty }}`, then they would need to ensure that they are on different steps in the form
|
||||
as the form would need to be re-rendered, and for performance reasons, we don't want to re-render the form on every `formData` update.
|
||||
|
||||
We could fix this, by implementing custom logic for when the `parameter-schema` is updated, if the updated field is in a `default: *` field, then we replace the previous value with the new value in the `formData` automatically.
|
||||
This is a pretty ugly workaround, but maybe the only option we have. Also at this point, pretty unsure if this affects any other parts of the `JSONSchema`, and we would also have to implement it for those fields if they exist.
|
||||
|
||||
### Templated error messages
|
||||
|
||||
Templating for `errorMessages` has been solved by using the `ajv-errors` library https://github.com/backstage/backstage/pull/25624, you can see more about [`backrefs` and pointers here](https://ajv.js.org/packages/ajv-errors.html). Any other template strings that will be passed through the underlying components and to be left untemplated should be encapsulated with options instead of passing through raw strings. The below example illustrates an `entityAndName` format, which under the hood, might do something like `${{ parameters.entity }} - ${{ parameters.name }}`, but this implementation never leaks out to the templating language.
|
||||
|
||||
```yaml
|
||||
parameters:
|
||||
properties:
|
||||
...
|
||||
description:
|
||||
type: string
|
||||
default: Test-description
|
||||
ui:field: CustomDisplayField
|
||||
ui:options:
|
||||
format: entityAndName
|
||||
```
|
||||
|
||||
## Release Plan
|
||||
|
||||
<!--
|
||||
This section should describe the rollout process for any new features. It must take our version policies into account and plan for a phased rollout if this change affects any existing stable APIs.
|
||||
|
||||
If there is any particular feedback to be gathered during the rollout, this should be described here as well.
|
||||
-->
|
||||
|
||||
This change is backwards compatible, and can be released in a minor release. There's no breaking changes to worry about here.
|
||||
|
||||
## Dependencies
|
||||
|
||||
<!--
|
||||
List any dependencies that this work has on other BEPs or features.
|
||||
-->
|
||||
|
||||
## Alternatives
|
||||
|
||||
<!--
|
||||
What other approaches did you consider, and why did you rule them out? These do
|
||||
not need to be as detailed as the proposal, but should include enough
|
||||
information to express the idea and why it was not acceptable.
|
||||
-->
|
||||
|
||||
### Templating client side
|
||||
|
||||
- This could lead to confusion as `filters` such as `parseRepoUrl` and `pick` and any custom filters which you define in the backend would not be available in the client side.
|
||||
|
||||
- Also with the limitations of the `default` value being updated only on first render and never re-evaluated, there's no performance benefit of doing things client side anymore.
|
||||
|
||||
### Accept limitation of the `default` field
|
||||
|
||||
Rather than using a workaround to support re-evaluating the `default` field, we could instead accept it as a limitation, and document it as such.
|
||||
|
||||
This is not desirable, as it is likely a very common use-case to want to template the `default` field, leading to a poor template creation experience.
|
||||
@@ -9,53 +9,79 @@
|
||||
#
|
||||
# Once the commands have been run, you can build the image using `yarn docker-build`
|
||||
|
||||
FROM cgr.dev/chainguard/wolfi-base:latest
|
||||
# syntax = docker/dockerfile:1.4
|
||||
|
||||
ENV NODE_VERSION 18=~18.19
|
||||
ENV PYTHON_VERSION 3.12=~3.12
|
||||
# Build Python environment in a separate builder stage
|
||||
FROM cgr.dev/chainguard/python:latest-dev as python-builder
|
||||
|
||||
RUN apk add nodejs-$NODE_VERSION yarn
|
||||
ENV PATH=/venv/bin:$PATH
|
||||
|
||||
# Install sqlite3 dependencies. You can skip this if you don't use sqlite3 in the image,
|
||||
# in which case you should also move better-sqlite3 to "devDependencies" in package.json.
|
||||
# Additionally, we install dependencies for `techdocs.generator.runIn: local`.
|
||||
# https://backstage.io/docs/features/techdocs/getting-started#disabling-docker-in-docker-situation-optional
|
||||
RUN --mount=type=cache,target=/var/cache/apk,sharing=locked \
|
||||
--mount=type=cache,target=/var/lib/apk,sharing=locked \
|
||||
apk update && \
|
||||
apk add sqlite-dev python-$PYTHON_VERSION py3-pip python-3-dev py3-setuptools build-base gcc libffi-dev glibc-dev openssl-dev brotli-dev c-ares-dev nghttp2-dev icu-dev zlib-dev gcc-12 libuv-dev && \
|
||||
yarn config set python /usr/bin/python3
|
||||
RUN --mount=type=cache,target=/home/nonroot/.cache/pip,uid=65532,gid=65532 \
|
||||
python3 -m venv /home/nonroot/venv && \
|
||||
/home/nonroot/venv/bin/pip install mkdocs-techdocs-core==1.3.3
|
||||
|
||||
# Set up a virtual environment for mkdocs-techdocs-core.
|
||||
ENV VIRTUAL_ENV=/opt/venv
|
||||
RUN python3 -m venv $VIRTUAL_ENV
|
||||
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
|
||||
# Build Node environment in a separate builder stage
|
||||
FROM cgr.dev/chainguard/wolfi-base:latest as node-builder
|
||||
|
||||
RUN pip3 install mkdocs-techdocs-core==1.3.3
|
||||
|
||||
# From here on we use the least-privileged `node` user to run the backend.
|
||||
WORKDIR /app
|
||||
RUN chown nonroot:nonroot /app
|
||||
USER nonroot
|
||||
|
||||
# This switches many Node.js dependencies to production mode.
|
||||
ENV NODE_VERSION 20=~20.11
|
||||
ENV NODE_ENV production
|
||||
|
||||
# Copy over Yarn 3 configuration, release, and plugins
|
||||
COPY --chown=nonroot:nonroot .yarn ./.yarn
|
||||
COPY --chown=nonroot:nonroot .yarnrc.yml ./
|
||||
RUN --mount=type=cache,target=/var/cache/apk,sharing=locked,uid=65532,gid=65532 \
|
||||
--mount=type=cache,target=/var/lib/apk,sharing=locked,uid=65532,gid=65532 \
|
||||
apk update && \
|
||||
apk add nodejs-$NODE_VERSION yarn \
|
||||
# Install isolate-vm dependencies, these are needed by the @backstage/plugin-scaffolder-backend.
|
||||
openssl-dev brotli-dev c-ares-dev nghttp2-dev icu-dev zlib-dev gcc-12 libuv-dev build-base
|
||||
|
||||
# Copy repo skeleton first, to avoid unnecessary docker cache invalidation.
|
||||
# The skeleton contains the package.json of each package in the monorepo,
|
||||
# and along with yarn.lock and the root package.json, that's enough to run yarn install.
|
||||
COPY --chown=nonroot:nonroot yarn.lock package.json packages/backend/dist/skeleton.tar.gz ./
|
||||
WORKDIR /app
|
||||
RUN chown -R nonroot:nonroot /app
|
||||
|
||||
RUN mkdir -p /home/nonroot/.yarn/berry && chown -R 65532:65532 /home/nonroot/.yarn/berry
|
||||
|
||||
USER nonroot
|
||||
|
||||
COPY --chown=65532:65532 .yarn ./.yarn
|
||||
COPY --chown=65532:65532 .yarnrc.yml ./
|
||||
|
||||
COPY --chown=65532:65532 yarn.lock package.json packages/backend/dist/skeleton.tar.gz ./
|
||||
RUN tar xzf skeleton.tar.gz && rm skeleton.tar.gz
|
||||
|
||||
RUN --mount=type=cache,target=/home/node/.yarn/berry/cache,sharing=locked,uid=1000,gid=1000 \
|
||||
yarn workspaces focus --all --production
|
||||
RUN --mount=type=cache,target=/home/nonroot/.yarn/berry/cache,sharing=locked,uid=65532,gid=65532 \
|
||||
yarn workspaces focus --all --production && yarn cache clean --all
|
||||
|
||||
# Then copy the rest of the backend bundle, along with any other files we might want.
|
||||
COPY --chown=nonroot:nonroot packages/backend/dist/bundle.tar.gz app-config*.yaml ./
|
||||
RUN tar xzf bundle.tar.gz && rm bundle.tar.gz
|
||||
# Final stage to build the application image
|
||||
FROM cgr.dev/chainguard/wolfi-base:latest
|
||||
|
||||
ENV PYTHON_VERSION 3.12=~3.12
|
||||
ENV NODE_VERSION 20=~20.14
|
||||
ENV NODE_ENV production
|
||||
|
||||
RUN --mount=type=cache,target=/var/cache/apk,sharing=locked,uid=65532,gid=65532 \
|
||||
--mount=type=cache,target=/var/lib/apk,sharing=locked,uid=65532,gid=65532 \
|
||||
apk update && \
|
||||
apk add \
|
||||
# add node for backstage
|
||||
nodejs-$NODE_VERSION \
|
||||
# add python for backstage techdocs
|
||||
python-$PYTHON_VERSION \
|
||||
# add tini for init process
|
||||
tini
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY package.json app-config.yaml ./
|
||||
ADD packages/backend/dist/skeleton.tar.gz packages/backend/dist/bundle.tar.gz ./
|
||||
|
||||
RUN chown -R 65532:65532 /app
|
||||
RUN chown -R 65532:65532 /tmp
|
||||
USER 65532:65532
|
||||
|
||||
COPY --from=node-builder --chown=65532:65532 /app/node_modules ./node_modules
|
||||
COPY --from=python-builder --chown=65532:65532 /home/nonroot/venv /home/nonroot/venv
|
||||
ENV PATH=/home/nonroot/venv/bin:$PATH
|
||||
|
||||
ENV NODE_OPTIONS="--no-node-snapshot"
|
||||
ENV GIT_PYTHON_REFRESH="quiet"
|
||||
|
||||
ENTRYPOINT ["tini", "--"]
|
||||
CMD ["node", "packages/backend", "--config", "app-config.yaml"]
|
||||
|
||||
@@ -4,6 +4,19 @@ DockerHub images in general did not seem ideal for Backstage as the number of vu
|
||||
|
||||
The `Dockerfile` in this directory uses a [wolfi-base](https://github.com/wolfi-dev) image from Chainguard Images. This improves the security of the application and reduces false positives in scanners.
|
||||
|
||||
## Steps taken
|
||||
|
||||
When converting, I utilized the upstream Dockerfile as a starting point.
|
||||
|
||||
- Multi-stage build - The Dockerfile has been split up into a multistage build which reduces the files, packages, executables, and directories in the final image.
|
||||
- Size savings = ~900mb
|
||||
- Reduced attack surface
|
||||
- Base Image - Swap to [wolfi-base](https://github.com/wolfi-dev) image from Chainguard Images
|
||||
- Vulnerability Savings = ~239 at the time of updating this README
|
||||
- Entrypoint - Swap from `node` to `tini` as entrypoint to ensure that the default signal handlers work and zombie processes are handled properly
|
||||
- Use `ADD` instead of `COPY` in dockerfile to reduce copied compressed files
|
||||
- When a `rm` is used to remove a compressed file it still makes its way into the final image. Using `ADD` is safe with local files.
|
||||
|
||||
## Pinning Digest
|
||||
|
||||
To reduce maintenance, the digest of the image has been removed from the `./Dockerfile` file. A complete example with the digest would be `cgr.dev/chainguard/wolfi-base:latest@sha256:3d6dece13cdb5546cd03b20e14f9af354bc1a56ab5a7b47dca3e6c1557211fcf` and it is suggested to update the `FROM` line in the `Dockerfile` to use a digest.
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
# Prometheus
|
||||
|
||||
> [!NOTE]
|
||||
> The Prometheus metrics have been marked as deprecated and will be removed at a later point. The recommendation is to use the OpenTelemetry metrics by following the [Setup OpenTelemetry](https://backstage.io/docs/tutorials/setup-opentelemetry) documentation
|
||||
|
||||
## Overview
|
||||
|
||||
This is a small tutorial that goes over how to setup your Backstage instance to output metrics in a format that can be pulled in by Prometheus.
|
||||
|
||||
@@ -32,6 +32,12 @@ auth:
|
||||
serviceTokens:
|
||||
- token: '1uh2fh19efvfh129f1f919u21f2f19jf2.access'
|
||||
subject: 'bot-user@your-company.com'
|
||||
# You can customize the header name that contains the jwt token, by default
|
||||
# cf-access-jwt-assertion is used
|
||||
jwtHeaderName: <my-header>
|
||||
# You can customize the authorization cookie name, by default
|
||||
# CF_Authorization is used
|
||||
authorizationCookieName: <MY_CAUTHORIZATION_COOKIE_NAME>
|
||||
# This picks what sign in resolver(s) you want to use.
|
||||
signIn:
|
||||
resolvers:
|
||||
|
||||
@@ -24,7 +24,7 @@ Let's start by adding the following `auth` configuration in your
|
||||
```yaml
|
||||
auth:
|
||||
providers:
|
||||
gcp-iap:
|
||||
gcpIap:
|
||||
audience: '/projects/<project number>/global/backendServices/<backend service id>'
|
||||
jwtHeader: x-custom-header # Optional: Only if you are using a custom header for the IAP JWT
|
||||
signIn:
|
||||
@@ -77,6 +77,6 @@ backend.add(import('@backstage/plugin-auth-backend-module-gcp-iap-provider'));
|
||||
|
||||
## Adding the provider to the Backstage frontend
|
||||
|
||||
See [Sign-In with Proxy Providers](../index.md#sign-in-with-proxy-providers) for pointers on how to set up the sign-in page, and to also make it work smoothly for local development. You'll use `gcp-iap` as the provider name.
|
||||
See [Sign-In with Proxy Providers](../index.md#sign-in-with-proxy-providers) for pointers on how to set up the sign-in page, and to also make it work smoothly for local development. You'll use `gcpIap` as the provider name.
|
||||
|
||||
If you [provide a custom sign in resolver](https://backstage.io/docs/auth/identity-resolver#building-custom-resolvers), you can skip the `signIn` block entirely.
|
||||
|
||||
@@ -193,7 +193,7 @@ backend.add(import('@backstage/plugin-auth-backend-module-github-provider'));
|
||||
backend.add(customAuth);
|
||||
```
|
||||
|
||||
Check out [the naming patterns article](../backend-system/architecture/07-naming-patterns.md) for what rules
|
||||
Check out [the naming patterns article](../backend-system/architecture/08-naming-patterns.md) for what rules
|
||||
apply regarding how to form valid IDs. In this example we also put the module
|
||||
declaration directly in `packages/backend/src/index.ts` but that's just for
|
||||
simplicity. You can place it anywhere you like, including in other packages, and
|
||||
|
||||
+54
-6
@@ -112,9 +112,16 @@ const app = createApp({
|
||||
});
|
||||
```
|
||||
|
||||
You can also use the `providers` prop to enable multiple sign-in methods, for example
|
||||
:::note Note
|
||||
|
||||
- allowing guest access:
|
||||
You can configure sign-in to use a redirect flow with no pop-up by adding
|
||||
`enableExperimentalRedirectFlow: true` to the root of your `app-config.yaml`
|
||||
|
||||
:::
|
||||
|
||||
### Using Multiple Providers
|
||||
|
||||
You can also use the `providers` prop to enable multiple sign-in methods, for example to allow guest access:
|
||||
|
||||
```tsx title="packages/app/src/App.tsx"
|
||||
const app = createApp({
|
||||
@@ -140,12 +147,53 @@ const app = createApp({
|
||||
});
|
||||
```
|
||||
|
||||
:::note Note
|
||||
### Conditionally Render Sign In Provider
|
||||
|
||||
You can configure sign-in to use a redirect flow with no pop-up by adding
|
||||
`enableExperimentalRedirectFlow: true` to the root of your `app-config.yaml`
|
||||
In the above example you have both Guest and GitHub sign-in options, this is helpful for non-production but in Production you will most likely not want to offer Guest access. You can easily use information from your config to help conditionally render the provider:
|
||||
|
||||
:::
|
||||
```tsx title="packages/app/src/App.tsx"
|
||||
import {
|
||||
configApiRef,
|
||||
githubAuthApiRef,
|
||||
useApi,
|
||||
} from '@backstage/core-plugin-api';
|
||||
|
||||
const app = createApp({
|
||||
components: {
|
||||
SignInPage: props => {
|
||||
const configApi = useApi(configApiRef);
|
||||
if (configApi.getString('auth.environment') === 'development') {
|
||||
return (
|
||||
<SignInPage
|
||||
{...props}
|
||||
providers={[
|
||||
'guest',
|
||||
{
|
||||
id: 'github-auth-provider',
|
||||
title: 'GitHub',
|
||||
message: 'Sign in using GitHub',
|
||||
apiRef: githubAuthApiRef,
|
||||
},
|
||||
]}
|
||||
/>
|
||||
);
|
||||
}
|
||||
return (
|
||||
<SignInPage
|
||||
{...props}
|
||||
provider={{
|
||||
id: 'google-auth-provider',
|
||||
title: 'Google',
|
||||
message: 'Sign In using Google',
|
||||
apiRef: googleAuthApiRef,
|
||||
}}
|
||||
/>
|
||||
);
|
||||
},
|
||||
},
|
||||
// ..
|
||||
});
|
||||
```
|
||||
|
||||
## Sign-In with Proxy Providers
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user