Skip to main content

v1.30.0

These are the release notes for the v1.30.0 release of Backstage.

A huge thanks to the whole team of maintainers and contributors as well as the amazing Backstage Community for the hard work in getting this release developed and done.

Highlights

New Frontend System - Plugin Adoption

This release marks another big milestone for the New Frontend System. We encourage all plugin owners to add support for the new frontend system to their plugins.

At the end of last year in the 1.21 release, we shipped the New Frontend System Alpha. It marked a more stable release of the new system, but we knew there was still much more work left to be done. Since then we have received valuable feedback and identified key areas of improvement. In particular around the creation of new extension kinds as well as overriding and testing of extensions.

Over the summer months we’ve been working hard towards addressing this feedback and getting the New Frontend System in shape for us to be confident in encouraging broader adoption by plugins. For a summary of the changes you can check out the 1.30 migration documentation, or can see the ongoing progress in the meta issue. With this release comes some new features, deprecations and breaking changes in the @backstage/frontend-app-api, @backstage/frontend-plugin-api, and @backstage/core-compat-api packages.```

Breaking:

  • All types of route references in the New Frontend System are now optional. This means that all usages of useRouteRef in the new system might return undefined, and your code must be able to act accordingly. Code that uses the old system (which will be the vast majority of code at this point) is not affected by this.

New:

  • Blueprints and createExtensionBlueprint as a replacement for extension creators. You will find that old extension creators are marked as deprecated, and point to the corresponding blueprints which have a superior developer experience!
  • Ability to override individual extensions using extension.override(...), as well as overriding extensions in a plugin using a combination of plugin.withOverrides([...]) and plugin.getExtension(id) to replace individual extensions or add new ones.
  • createExtensionTester supports .get and .query to directly access extension data and streamline tests decoupled from React, as well as a .reactElement shorthand for accessing any output React elements.
  • A new set of utilities that can patch support for the new frontend system for a plugin that otherwise only supports the old one. The new convertLegacyPlugin is used to convert a plugin instance, while convertLegacyPageExtension with friends can convert extensions from the old system.

Deprecations:

  • createPlugin has been renamed to createFrontendPlugin
  • createExtension with object keys for inputs and outputs has been deprecated in favor of the array form.
  • configSchema in createExtension has been replaced with config.schema which is a better alternative to declaring config for extensions without having to use createSchemaFromZod.
  • Existing dataRefs should now embed the ID using the .with method.
  • The render method on createExtensionTester has been deprecated in favor of composing .reactElement with renderInTestApp.

BREAKING: Backend System deprecations and removals

  • Almost all service factories in @backstage/backend-app-api were marked deprecated some time back - those are now removed. Please import them from their new homes in @backstage/backend-defaults/<service> instead.
  • In our effort to migrate to the new backend system some backend-plugins createRouter exports have been marked as deprecated. Please make sure to update your backends accordingly as createRouter will eventually be removed from all plugin exports.
  • Several deprecated methods and types have been removed from backend related packages. Most of these are either renamed and re-exported from other packages, see the CHANGELOG for the individual package for more information.

Most notably the long deprecated UrlReader exports have been renamed:

  • 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.

BREAKING: Auth Sign In Resolver Priority

Sign-in resolvers configured via .signIn.resolvers in your app-config 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 ones, which you can then override through configuration, simplifying deploying the same code in multiple environments.

BREAKING: @backstage/cli

The lockfile (yarn.lock) dependency analysis and mutations have been removed from several commands. This means that versions:bump will no longer attempt to deduplicate after bumping and modifying the lockfile.

The versions:check command has also been removed as its only purpose was to verify and mutate the lockfile. We recommend using the yarn dedupe command instead, or the yarn-deduplicate package if you're using Yarn classic, as a replacement. This change was made in order for us to support other Package Managers in the future and remove the coupling with yarn.

BREAKING: @backstage/backend-test-utils

  • setupRequestMockHandlers is removed; use registerMswTestHooks instead.
  • MockDirectoryOptions is removed; use CreateMockDirectoryOptions instead.
  • Stopped exporting the deprecated and internal isDockerDisabledForTests helper.
  • Removed get method from ServiceFactoryTester which is replaced by getSubject

Scaffolder Internationalization

Thanks to @mario-mui we now have i18n support for another core feature! Contributed in #25827

Dynamic Backend Feature Loaders

You can now use createBackendFeatureLoader to dynamically load features in the backend, for example based on runtime configuration, and many other exciting possibilities. Check out the docs!

Security Fixes

The AWS ALB auth provider now has a configuration option signer, which should be set to the ARN of your ALB instance. We strongly recommend that you set this configuration value, since it will help strengthen your installation.

Example:

 auth:
providers:
awsalb:
issuer: ...
# put your actual ARN here
+ signer: 'arn:aws:elasticloadbalancing:us-east-2:123456789012:loadbalancer/app/my-load-balancer/1234567890123456'
region: ...
signIn:
resolvers:
- resolver: ...

Upgrade path

We recommend that you keep your Backstage project up to date with this latest release. For more guidance on how to upgrade, check out the documentation for keeping Backstage updated.

Below you can find a list of links and references to help you learn about and start using this new release.

Sign up for our newsletter if you want to be informed about what is happening in the world of Backstage.