Merge branch 'backstage:master' into relax-github-transforms

This commit is contained in:
Jack Grigg
2023-08-10 10:44:47 +10:00
committed by GitHub
811 changed files with 23490 additions and 3755 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/core-app-api': patch
---
Fixed a bug that could cause `navigate` analytics events to be misattributed to the plugin mounted on the root route (e.g. the `home` plugin at `/`) when the route that was navigated to wasn't associated with a routable extension.
+43
View File
@@ -0,0 +1,43 @@
---
'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch
'@backstage/plugin-catalog-backend-module-bitbucket-server': patch
'@backstage/plugin-catalog-backend-module-bitbucket-cloud': patch
'@backstage/plugin-search-backend-module-elasticsearch': patch
'@backstage/plugin-catalog-backend-module-puppetdb': patch
'@backstage/plugin-catalog-backend-module-msgraph': patch
'@backstage/plugin-search-backend-module-techdocs': patch
'@backstage/plugin-catalog-backend-module-gerrit': patch
'@backstage/plugin-catalog-backend-module-github': patch
'@backstage/plugin-catalog-backend-module-gitlab': patch
'@backstage/plugin-events-backend-module-aws-sqs': patch
'@backstage/plugin-search-backend-module-catalog': patch
'@backstage/plugin-search-backend-module-explore': patch
'@backstage/plugin-catalog-backend-module-azure': patch
'@backstage/plugin-events-backend-module-github': patch
'@backstage/plugin-events-backend-module-gitlab': patch
'@backstage/plugin-catalog-backend-module-aws': patch
'@backstage/plugin-catalog-backend-module-gcp': patch
'@backstage/plugin-search-backend-module-pg': patch
'@backstage/plugin-azure-devops-backend': patch
'@backstage/plugin-kubernetes-backend': patch
'@backstage/plugin-lighthouse-backend': patch
'@backstage/plugin-permission-backend': patch
'@backstage/plugin-scaffolder-backend': patch
'@backstage/backend-defaults': patch
'@backstage/plugin-airbrake-backend': patch
'@backstage/plugin-devtools-backend': patch
'@backstage/plugin-periskop-backend': patch
'@backstage/plugin-techdocs-backend': patch
'@backstage/backend-common': patch
'@backstage/plugin-catalog-backend': patch
'@backstage/plugin-badges-backend': patch
'@backstage/plugin-bazaar-backend': patch
'@backstage/plugin-events-backend': patch
'@backstage/plugin-search-backend': patch
'@backstage/plugin-kafka-backend': patch
'@backstage/plugin-proxy-backend': patch
'@backstage/plugin-todo-backend': patch
'@backstage/plugin-app-backend': patch
---
Use `coreServices.rootConfig` instead of `coreService.config`
+7
View File
@@ -0,0 +1,7 @@
---
'@backstage/plugin-search-backend-module-techdocs': patch
'@backstage/plugin-search-backend-module-catalog': patch
'@backstage/plugin-search-backend-module-explore': patch
---
Ensure that all services are dependency injected into the module instead of taken from options
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/backend-app-api': patch
---
Do not throw in backend.stop, if start failed
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-graph': patch
---
Propagate entity spec to EntityNode so that spec info such as type can be used for graph node customization
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-kubernetes-backend': patch
---
Fixed a bug where the proxy was not rewriting WebSocket request paths properly.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-playlist': patch
---
Displaying an alert popup each time the Playlist is created or deleted
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-scaffolder': patch
---
Fix the get entities query in the `MyGroupsPicker` to query the `kind=Group` entities.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/create-app': patch
---
Bumped create-app version.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/create-app': patch
---
Bumped create-app version.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/create-app': patch
---
Bumped create-app version.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-graph': patch
---
Added maximum depth parameter to the catalogGraphParams in CatalogGraphCard.
+7
View File
@@ -0,0 +1,7 @@
---
'@backstage/config-loader': minor
---
Loading invalid TypeScript configuration schemas will now throw an error rather than silently being ignored.
In particular this includes defining any additional types other than `Config` in the schema file, or use of unsupported types such as `Record` or `Partial`.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-auth-backend': patch
---
Updated `frameHandler` to return `undefined` when using the redirect flow instead of returning `postMessageReponse` which was causing errors
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-scaffolder-backend': patch
---
Added examples for the `fs:delete` and `fs:rename` actions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-graphql-voyager': patch
---
Fix typo in install instructions.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-explore-backend': patch
---
Moved the config example from the "Tools as Code" section to the "Tools as Config" section of the README
+91
View File
@@ -0,0 +1,91 @@
---
'@backstage/plugin-scaffolder-backend-module-confluence-to-markdown': patch
'@backstage/plugin-scaffolder-backend-module-cookiecutter': patch
'@backstage/plugin-events-backend-module-bitbucket-cloud': patch
'@backstage/plugin-search-backend-module-elasticsearch': patch
'@backstage/plugin-catalog-backend-module-unprocessed': patch
'@backstage/plugin-scaffolder-backend-module-sentry': patch
'@backstage/plugin-scaffolder-backend-module-yeoman': patch
'@backstage/plugin-scaffolder-backend-module-rails': patch
'@backstage/plugin-search-backend-module-techdocs': patch
'@backstage/plugin-cicd-statistics-module-gitlab': patch
'@backstage/plugin-events-backend-module-aws-sqs': patch
'@backstage/plugin-search-backend-module-catalog': patch
'@backstage/plugin-search-backend-module-explore': patch
'@backstage/plugin-events-backend-module-gerrit': patch
'@backstage/plugin-events-backend-module-github': patch
'@backstage/plugin-events-backend-module-gitlab': patch
'@backstage/plugin-events-backend-module-azure': patch
'@backstage/plugin-events-backend-test-utils': patch
'@backstage/plugin-search-backend-module-pg': patch
'@backstage/plugin-entity-feedback-backend': patch
'@backstage/backend-openapi-utils': patch
'@backstage/plugin-bitbucket-cloud-common': patch
'@backstage/plugin-entity-feedback-common': patch
'@backstage/plugin-code-coverage-backend': patch
'@backstage/plugin-user-settings-backend': patch
'@backstage/plugin-analytics-module-ga4': patch
'@backstage/plugin-azure-devops-backend': patch
'@backstage/plugin-analytics-module-ga': patch
'@backstage/plugin-git-release-manager': patch
'@backstage/plugin-search-backend-node': patch
'@backstage/integration-react': patch
'@backstage/plugin-github-deployments': patch
'@backstage/plugin-microsoft-calendar': patch
'@backstage/plugin-newrelic-dashboard': patch
'@backstage/plugin-permission-backend': patch
'@backstage/plugin-entity-validation': patch
'@backstage/plugin-sonarqube-backend': patch
'@backstage/plugin-airbrake-backend': patch
'@backstage/plugin-devtools-backend': patch
'@backstage/plugin-linguist-backend': patch
'@backstage/plugin-periskop-backend': patch
'@backstage/plugin-playlist-backend': patch
'@backstage/plugin-apollo-explorer': patch
'@backstage/plugin-devtools-common': patch
'@backstage/plugin-entity-feedback': patch
'@backstage/plugin-explore-backend': patch
'@backstage/plugin-graphql-voyager': patch
'@backstage/plugin-jenkins-backend': patch
'@backstage/plugin-linguist-common': patch
'@backstage/plugin-playlist-common': patch
'@backstage/plugin-scaffolder-node': patch
'@backstage/plugin-apache-airflow': patch
'@backstage/plugin-bazaar-backend': patch
'@backstage/plugin-events-backend': patch
'@backstage/plugin-jenkins-common': patch
'@backstage/plugin-octopus-deploy': patch
'@backstage/plugin-search-backend': patch
'@backstage/plugin-stack-overflow': patch
'@backstage/plugin-catalog-graph': patch
'@backstage/plugin-code-coverage': patch
'@backstage/plugin-config-schema': patch
'@backstage/plugin-github-issues': patch
'@backstage/plugin-nomad-backend': patch
'@backstage/plugin-tech-insights': patch
'@backstage/plugin-catalog-node': patch
'@backstage/plugin-code-climate': patch
'@backstage/plugin-events-node': patch
'@backstage/plugin-firehydrant': patch
'@backstage/cli-node': patch
'@backstage/plugin-auth-node': patch
'@backstage/plugin-codescene': patch
'@backstage/plugin-dynatrace': patch
'@backstage/plugin-gcalendar': patch
'@backstage/plugin-org-react': patch
'@backstage/plugin-shortcuts': patch
'@backstage/plugin-xcmetrics': patch
'@backstage/plugin-airbrake': patch
'@backstage/plugin-periskop': patch
'@backstage/plugin-playlist': patch
'@backstage/plugin-bitrise': patch
'@backstage/plugin-allure': patch
'@backstage/plugin-bazaar': patch
'@backstage/plugin-ilert': patch
'@backstage/plugin-kafka': patch
'@backstage/plugin-nomad': patch
'@backstage/plugin-adr': patch
'@backstage/plugin-org': patch
---
Add package repository and homepage metadata
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend-module-gitlab': patch
---
Added option to skip forked repos in GitlabDiscoveryEntityProvider
+14
View File
@@ -0,0 +1,14 @@
---
'@backstage/plugin-devtools-backend': patch
---
Add DevTools configuration to enable dependency listing to be filtered with custom prefixes. For instance, in your `app-config.yaml`:
```yaml
devTools:
info:
packagePrefixes:
- @backstage/
- @roadiehq/backstage-
- @spotify/backstage-
```
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-linguist-common': patch
---
Exported new LanguageType type alias
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-linguist-backend': patch
---
Fixed bug in LinguistBackendClient.ts file where if the linguistJsOptions is specified and sent over to the linguist-js package it would get changed (another attribute would be added) causing future entities of the batch to fail with an error
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-sonarqube': patch
---
Remove sonarQube card disable class
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-app-node': minor
---
Added the `app` plugin node library, initially providing an extension point that can be used to configure a static fallback handler.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend': minor
---
Support configuring applicable kinds for `AnnotateScmSlugEntityProcessor`
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/cli': patch
---
Reload the frontend when app config changes
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-home-react': patch
---
Make `title` optional when defining the `createCardExtension`
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-scaffolder-backend': patch
---
Adds examples to a few scaffolder actions.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/backend-test-utils': minor
---
**BREAKING**: Renamed `mockServices.config` to `mockServices.rootConfig`.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/backend-app-api': minor
---
**BREAKING**: Renamed `configServiceFactory` to `rootConfigServiceFactory`.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/backend-plugin-api': minor
---
**BREAKING**: Renamed `coreServices.config` to `coreServices.rootConfig`.
+17
View File
@@ -0,0 +1,17 @@
---
'@backstage/plugin-catalog-backend-module-bitbucket-server': patch
'@backstage/plugin-catalog-backend-module-bitbucket-cloud': patch
'@backstage/plugin-catalog-backend-module-puppetdb': patch
'@backstage/plugin-catalog-backend-module-msgraph': patch
'@backstage/plugin-catalog-backend-module-gerrit': patch
'@backstage/plugin-catalog-backend-module-github': patch
'@backstage/plugin-catalog-backend-module-gitlab': patch
'@backstage/plugin-events-backend-module-aws-sqs': patch
'@backstage/plugin-catalog-backend-module-azure': patch
'@backstage/plugin-catalog-backend-module-aws': patch
'@backstage/backend-common': patch
'@backstage/plugin-jenkins-backend': patch
'@backstage/plugin-proxy-backend': patch
---
Fixed invalid configuration schema. The configuration schema may be more strict as a result.
+8
View File
@@ -0,0 +1,8 @@
---
'@backstage/core-components': patch
'@backstage/plugin-splunk-on-call': patch
'@backstage/plugin-xcmetrics': patch
'@backstage/plugin-catalog': patch
---
Prefer simple `theme.spacing` without string interpolation
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-scaffolder-backend-module-confluence-to-markdown': patch
---
Use `fetchContents` directly instead of a `fetchPlainAction`
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend-module-unprocessed': minor
---
**BREAKING**: Fixing typo in exported module. You will have to rename the import to the correct spelling. `UnprocessedEntites` -> `UnprocessedEntities`
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-auth-backend': patch
---
Updated config schema to match what was being used in code
+72 -2
View File
@@ -228,7 +228,77 @@
"@backstage/plugin-user-settings-backend": "0.1.11",
"@backstage/plugin-vault": "0.1.14",
"@backstage/plugin-vault-backend": "0.3.3",
"@backstage/plugin-xcmetrics": "0.2.40"
"@backstage/plugin-xcmetrics": "0.2.40",
"@backstage/plugin-analytics-module-newrelic-browser": "0.0.0",
"@backstage/plugin-catalog-backend-module-gcp": "0.0.0",
"@backstage/plugin-app-node": "0.0.0"
},
"changesets": []
"changesets": [
"analytics-millenial-whoop",
"angry-beers-relate",
"beige-files-reflect",
"brown-taxis-develop",
"chatty-foxes-buy",
"chatty-seahorses-juggle",
"chilly-keys-count",
"cold-numbers-sleep",
"create-app-1690284535",
"create-app-1690892926",
"create-app-1691503547",
"cuddly-colts-repeat",
"dirty-chefs-listen",
"fluffy-pens-prove",
"funny-dancers-deliver",
"gold-steaks-thank",
"gorgeous-months-doubt",
"hot-cats-rush",
"hungry-shrimps-care",
"khaki-flies-draw",
"kind-cougars-allow",
"large-badgers-switch",
"large-experts-poke",
"large-vans-cross",
"lazy-pugs-wash",
"little-penguins-build",
"loud-garlics-press",
"mean-squids-relax",
"metal-buttons-search",
"mighty-lions-search-2",
"mighty-lions-search-3",
"mighty-lions-search",
"neat-coins-raise",
"neat-lamps-press",
"odd-avocados-buy",
"pink-squids-nail",
"popular-fans-camp",
"quiet-starfishes-kick",
"rare-pens-exist",
"rich-zoos-occur",
"rotten-dolls-sing",
"rotten-rabbits-move",
"rude-feet-sparkle",
"search-donuts-wash",
"selfish-coats-shout",
"serious-bats-repair",
"serious-papayas-shout",
"serious-singers-vanish",
"seven-cougars-smash",
"sharp-months-think",
"slimy-kids-jam",
"smart-pandas-applaud",
"sour-hats-kick",
"stale-wombats-talk",
"strange-shrimps-mix",
"strong-bobcats-unite",
"stupid-berries-run",
"ten-lies-cheat",
"ten-otters-appear",
"tender-fireants-cheer",
"thin-yaks-hang",
"tidy-cobras-scream",
"tough-dolphins-care",
"tough-lies-float",
"unlucky-bags-pump",
"wild-timers-sparkle"
]
}
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-home': patch
---
Now, user can provide a language (optional) as input to receive a greeting in that specific language. Example: `<WelcomeTitle language={['English', 'Spanish']} />`
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/cli': patch
---
Enable to print the config schema not merged with the `--no-merge` flag
+6
View File
@@ -0,0 +1,6 @@
---
'@backstage/cli': patch
'@backstage/plugin-scaffolder-backend': patch
---
Updated dependency `esbuild` to `^0.19.0`.
+6
View File
@@ -0,0 +1,6 @@
---
'@backstage/backend-plugin-api': minor
'@backstage/backend-defaults': minor
---
**BREAKING**: Removing shared environments concept from the new experimental backend system.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/backend-plugin-api': patch
---
Added new experimental `featureDiscoveryServiceRef`, available as an `/alpha` export.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-proxy-backend': minor
---
Defining proxy endpoints directly under the root `proxy` configuration key is deprecated. Endpoints should now be declared under `proxy.endpoints` instead. The `skipInvalidProxies` and `reviveConsumedRequestBodies` can now also be configured through static configuration.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-analytics-module-newrelic-browser': patch
---
Introduced the New Relic Browser analytics module. Check out the plugins [README.md](https://github.com/backstage/backstage/tree/master/plugins/analytics-module-newrelic-browser) for more details!
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-search-backend-node': patch
---
Fix Lunr search engine highlight by ignoring invalid metadata positions.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend-module-gitlab': patch
---
Filter Gitlab archived projects through APIs
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/backend-app-api': patch
---
Added new experimental `featureDiscoveryServiceFactory`, available as an `/alpha` export.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/backend-tasks': patch
---
Make `readTaskScheduleDefinitionFromConfig` properly handle bad inputs
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-app-backend': patch
---
Migrated the alpha `appBackend` export to use static configuration and extension points rather than accepting options.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend': minor
---
Added OpenTelemetry spans for catalog processing
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-react': patch
---
Allow specifying screen size when catalog filters are hidden in drawer
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend-module-aws': patch
---
Added option to configure AWS `accountId` in `AwsS3EntityProvider`
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-linguist-backend': minor
---
Adds a processor to the linguist backend which can automatically add language tags to entities
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/backend-test-utils': patch
---
Add needed constants and constructs to support PostgreSQL version 14 as test database
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-home': patch
---
Make sure the widget name is never empty in the `AddWidgetDialog`. If the title was set to "", the entry would contain an empty string. Use the name as a fallback
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-kubernetes': patch
---
Fix container memory limits
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-scaffolder-node': patch
---
Export `TemplateExample` from the `createTemplateAction` type.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-scaffolder-react': patch
---
Fixed bug in Workflow component by passing a prop `templateName` down to Stepper component.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-devtools': patch
---
Fix readme typo
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-search-backend': patch
---
Add missing `configSchema` to package.json
+7
View File
@@ -0,0 +1,7 @@
---
'@backstage/plugin-scaffolder-backend-module-confluence-to-markdown': patch
'@backstage/plugin-scaffolder-backend-module-cookiecutter': patch
'@backstage/plugin-scaffolder-backend-module-rails': patch
---
Import helpers from the node package instead of the backend package
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend-module-gcp': minor
---
Added GCP catalog plugin with GKE provider
+6
View File
@@ -0,0 +1,6 @@
---
'@backstage/plugin-scaffolder-backend': patch
'@backstage/plugin-scaffolder-node': patch
---
Deprecated `executeShellCommand`, `RunCommandOptions`, and `fetchContents` from `@backstage/plugin-scaffolder-backend`, since they are useful for Scaffolder modules (who should not be importing from the plugin package itself). You should now import these from `@backstage/plugin-scaffolder-backend-node` instead. `RunCommandOptions` was renamed in the Node package as `ExecuteShellCommandOptions`, for consistency.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog': patch
---
Fixed an issue causing `EntitySwitch` to unmount its children once entity refresh was invoked
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-auth-backend': patch
---
Add frontend visibility to provider objects in `auth` config.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-microsoft-calendar': patch
---
README update - example of apiRef definition and fixed component name
+88 -88
View File
@@ -4,91 +4,91 @@
# The last matching pattern takes precedence.
# https://help.github.com/articles/about-codeowners/
* @backstage/maintainers
yarn.lock @backstage/maintainers @backstage-service
*/yarn.lock @backstage/maintainers @backstage-service
/.changeset/*.md
/cypress/src/integration/plugins/techdocs.spec.ts @backstage/techdocs-maintainers
/docs/assets/search @backstage/discoverability-maintainers
/docs/features/search @backstage/discoverability-maintainers
/docs/features/techdocs @backstage/techdocs-maintainers
/docs/plugins/integrating-search-into-plugins.md @backstage/discoverability-maintainers
/packages/cli/src/commands/onboard @backstage/sharks
/packages/techdocs-cli @backstage/techdocs-maintainers
/packages/techdocs-cli-embedded-app @backstage/techdocs-maintainers
/plugins/adr @backstage/maintainers @kuangp
/plugins/adr-* @backstage/maintainers @kuangp
/plugins/allure @backstage/maintainers @deepak-bhardwaj-ps
/plugins/apache-airflow @backstage/maintainers @cmpadden
/plugins/api-docs @backstage/maintainers @backstage/sda-se-reviewers
/plugins/azure-devops @backstage/maintainers @marleypowell @awanlin
/plugins/azure-devops-backend @backstage/maintainers @marleypowell @awanlin
/plugins/azure-devops-common @backstage/maintainers @marleypowell @awanlin
/plugins/bitbucket-cloud-common @backstage/maintainers @pjungermann
/plugins/bitrise @backstage/maintainers @backstage/sda-se-reviewers
/plugins/catalog @backstage/maintainers @backstage/catalog-maintainers
/plugins/catalog-* @backstage/maintainers @backstage/catalog-maintainers
/plugins/catalog-backend-module-aws @backstage/maintainers @backstage/catalog-maintainers @pjungermann
/plugins/catalog-backend-module-bitbucket-cloud @backstage/maintainers @backstage/catalog-maintainers @pjungermann
/plugins/catalog-backend-module-msgraph @backstage/maintainers @backstage/catalog-maintainers @pjungermann
/plugins/catalog-backend-module-puppetdb @backstage/maintainers @backstage/catalog-maintainers @tdabasinskas
/plugins/catalog-graph @backstage/maintainers @backstage/catalog-maintainers @backstage/sda-se-reviewers
/plugins/circleci @backstage/maintainers @adamdmharvey
/plugins/cloudbuild @backstage/maintainers @trivago/ebarrios
/plugins/code-coverage @backstage/maintainers @alde @nissayeva
/plugins/code-coverage-backend @backstage/maintainers @alde @nissayeva
/plugins/cost-insights @backstage/maintainers @backstage/silver-lining
/plugins/cost-insights-* @backstage/maintainers @backstage/silver-lining
/plugins/devtools @backstage/maintainers @awanlin
/plugins/devtools-backend @backstage/maintainers @awanlin
/plugins/devtools-common @backstage/maintainers @awanlin
/plugins/entity-feedback @backstage/maintainers @kuangp
/plugins/entity-feedback-* @backstage/maintainers @kuangp
/plugins/events-backend @backstage/maintainers @pjungermann
/plugins/events-backend-module-aws-sqs @backstage/maintainers @pjungermann
/plugins/events-backend-module-azure @backstage/maintainers @pjungermann
/plugins/events-backend-module-bitbucket-cloud @backstage/maintainers @pjungermann
/plugins/events-backend-module-gerrit @backstage/maintainers @pjungermann
/plugins/events-backend-module-github @backstage/maintainers @pjungermann
/plugins/events-backend-module-gitlab @backstage/maintainers @pjungermann
/plugins/events-backend-test-utils @backstage/maintainers @pjungermann
/plugins/events-node @backstage/maintainers @pjungermann
/plugins/explore @backstage/maintainers @backstage/sda-se-reviewers
/plugins/explore-react @backstage/maintainers @backstage/sda-se-reviewers
/plugins/fossa @backstage/maintainers @backstage/sda-se-reviewers
/plugins/gcalendar @backstage/maintainers @szubster @ptychu @kielosz @alexrybch
/plugins/git-release-manager @backstage/maintainers @erikengervall
/plugins/home @backstage/discoverability-maintainers
/plugins/home-* @backstage/discoverability-maintainers
/plugins/ilert @backstage/maintainers @yacut
/plugins/jenkins @backstage/maintainers @timja
/plugins/jenkins-backend @backstage/maintainers @timja
/plugins/kafka @backstage/maintainers @nirga @andrewthauer
/plugins/kafka-backend @backstage/maintainers @nirga @andrewthauer
/plugins/kubernetes @backstage/maintainers @backstage/kubernetes-maintainers
/plugins/kubernetes-* @backstage/maintainers @backstage/kubernetes-maintainers
/plugins/linguist @backstage/maintainers @awanlin
/plugins/linguist-backend @backstage/maintainers @awanlin
/plugins/linguist-common @backstage/maintainers @awanlin
/plugins/microsoft-calendar @backstage/maintainers @abhay-soni-developer @NishkarshRaj
/plugins/newrelic-dashboard @backstage/maintainers @mufaddal7
/plugins/permission-* @backstage/permission-maintainers
/plugins/playlist @backstage/maintainers @kuangp
/plugins/playlist-* @backstage/maintainers @kuangp
/plugins/puppetdb @backstage/maintainers @tdabasinskas
/plugins/rollbar @backstage/maintainers @andrewthauer
/plugins/rollbar-backend @backstage/maintainers @andrewthauer
/plugins/scaffolder-backend-module-rails @backstage/maintainers @angeliski
/plugins/scaffolder-backend-module-yeoman @backstage/maintainers @pawelmitka
/plugins/search @backstage/discoverability-maintainers
/plugins/search-* @backstage/discoverability-maintainers
/plugins/sonarqube @backstage/maintainers @backstage/sda-se-reviewers
/plugins/stack-overflow @backstage/discoverability-maintainers
/plugins/stack-overflow-backend @backstage/discoverability-maintainers
/plugins/techdocs @backstage/techdocs-maintainers
/plugins/techdocs-* @backstage/techdocs-maintainers
/plugins/user-settings-backend @backstage/maintainers @backstage/sda-se-reviewers
/tech-insights-backend @backstage/maintainers @xantier @iain-b
/tech-insights-backend-module-jsonfc @backstage/maintainers @xantier @iain-b
/tech-insights-tech-insights-common @backstage/maintainers @xantier @iain-b
/tech-insights-tech-insights-node @backstage/maintainers @xantier @iain-b
* @backstage/maintainers
*/yarn.lock @backstage/maintainers @backstage-service
/cypress/src/integration/plugins/techdocs.spec.ts @backstage/techdocs-maintainers
/docs/assets/search @backstage/discoverability-maintainers
/docs/features/search @backstage/discoverability-maintainers
/docs/features/techdocs @backstage/techdocs-maintainers
/docs/plugins/integrating-search-into-plugins.md @backstage/discoverability-maintainers
/packages/cli/src/commands/onboard @backstage/sharks
/packages/techdocs-cli @backstage/techdocs-maintainers
/packages/techdocs-cli-embedded-app @backstage/techdocs-maintainers
/plugins/adr @backstage/maintainers @kuangp
/plugins/adr-* @backstage/maintainers @kuangp
/plugins/allure @backstage/maintainers @deepak-bhardwaj-ps
/plugins/analytics-module-newrelic-browser @backstage/maintainers @jmezach
/plugins/apache-airflow @backstage/maintainers @cmpadden
/plugins/api-docs @backstage/maintainers @backstage/sda-se-reviewers
/plugins/azure-devops @backstage/maintainers @marleypowell @awanlin
/plugins/azure-devops-backend @backstage/maintainers @marleypowell @awanlin
/plugins/azure-devops-common @backstage/maintainers @marleypowell @awanlin
/plugins/bitbucket-cloud-common @backstage/maintainers @pjungermann
/plugins/bitrise @backstage/maintainers @backstage/sda-se-reviewers
/plugins/catalog @backstage/maintainers @backstage/catalog-maintainers
/plugins/catalog-* @backstage/maintainers @backstage/catalog-maintainers
/plugins/catalog-backend-module-aws @backstage/maintainers @backstage/catalog-maintainers @pjungermann
/plugins/catalog-backend-module-bitbucket-cloud @backstage/maintainers @backstage/catalog-maintainers @pjungermann
/plugins/catalog-backend-module-msgraph @backstage/maintainers @backstage/catalog-maintainers @pjungermann
/plugins/catalog-backend-module-puppetdb @backstage/maintainers @backstage/catalog-maintainers @tdabasinskas
/plugins/catalog-graph @backstage/maintainers @backstage/catalog-maintainers @backstage/sda-se-reviewers
/plugins/circleci @backstage/maintainers @adamdmharvey
/plugins/cloudbuild @backstage/maintainers @trivago/ebarrios
/plugins/code-coverage @backstage/maintainers @alde @nissayeva
/plugins/code-coverage-backend @backstage/maintainers @alde @nissayeva
/plugins/cost-insights @backstage/maintainers @backstage/silver-lining
/plugins/cost-insights-* @backstage/maintainers @backstage/silver-lining
/plugins/devtools @backstage/maintainers @awanlin
/plugins/devtools-backend @backstage/maintainers @awanlin
/plugins/devtools-common @backstage/maintainers @awanlin
/plugins/entity-feedback @backstage/maintainers @kuangp
/plugins/entity-feedback-* @backstage/maintainers @kuangp
/plugins/events-backend @backstage/maintainers @pjungermann
/plugins/events-backend-module-aws-sqs @backstage/maintainers @pjungermann
/plugins/events-backend-module-azure @backstage/maintainers @pjungermann
/plugins/events-backend-module-bitbucket-cloud @backstage/maintainers @pjungermann
/plugins/events-backend-module-gerrit @backstage/maintainers @pjungermann
/plugins/events-backend-module-github @backstage/maintainers @pjungermann
/plugins/events-backend-module-gitlab @backstage/maintainers @pjungermann
/plugins/events-backend-test-utils @backstage/maintainers @pjungermann
/plugins/events-node @backstage/maintainers @pjungermann
/plugins/explore @backstage/maintainers @backstage/sda-se-reviewers
/plugins/explore-react @backstage/maintainers @backstage/sda-se-reviewers
/plugins/fossa @backstage/maintainers @backstage/sda-se-reviewers
/plugins/gcalendar @backstage/maintainers @szubster @ptychu @kielosz @alexrybch
/plugins/git-release-manager @backstage/maintainers @erikengervall
/plugins/home @backstage/discoverability-maintainers
/plugins/home-* @backstage/discoverability-maintainers
/plugins/ilert @backstage/maintainers @yacut
/plugins/jenkins @backstage/maintainers @timja
/plugins/jenkins-backend @backstage/maintainers @timja
/plugins/kafka @backstage/maintainers @nirga @andrewthauer
/plugins/kafka-backend @backstage/maintainers @nirga @andrewthauer
/plugins/kubernetes @backstage/maintainers @backstage/kubernetes-maintainers
/plugins/kubernetes-* @backstage/maintainers @backstage/kubernetes-maintainers
/plugins/linguist @backstage/maintainers @awanlin
/plugins/linguist-backend @backstage/maintainers @awanlin
/plugins/linguist-common @backstage/maintainers @awanlin
/plugins/microsoft-calendar @backstage/maintainers @abhay-soni-developer @NishkarshRaj
/plugins/newrelic-dashboard @backstage/maintainers @mufaddal7
/plugins/permission-* @backstage/permission-maintainers
/plugins/playlist @backstage/maintainers @kuangp
/plugins/playlist-* @backstage/maintainers @kuangp
/plugins/puppetdb @backstage/maintainers @tdabasinskas
/plugins/rollbar @backstage/maintainers @andrewthauer
/plugins/rollbar-backend @backstage/maintainers @andrewthauer
/plugins/scaffolder-backend-module-rails @backstage/maintainers @angeliski
/plugins/scaffolder-backend-module-yeoman @backstage/maintainers @pawelmitka
/plugins/search @backstage/discoverability-maintainers
/plugins/search-* @backstage/discoverability-maintainers
/plugins/sonarqube @backstage/maintainers @backstage/sda-se-reviewers
/plugins/stack-overflow @backstage/discoverability-maintainers
/plugins/stack-overflow-backend @backstage/discoverability-maintainers
/plugins/techdocs @backstage/techdocs-maintainers
/plugins/techdocs-* @backstage/techdocs-maintainers
/plugins/user-settings-backend @backstage/maintainers @backstage/sda-se-reviewers
/tech-insights-backend @backstage/maintainers @xantier @iain-b
/tech-insights-backend-module-jsonfc @backstage/maintainers @xantier @iain-b
/tech-insights-tech-insights-common @backstage/maintainers @xantier @iain-b
/tech-insights-tech-insights-node @backstage/maintainers @xantier @iain-b
yarn.lock @backstage/maintainers @backstage-service
+4
View File
@@ -123,6 +123,8 @@ FireHydrant
Firekube
Firestore
Fiverr
Flightcontrol
flightcontrol
Francesco
Frontside
gerrit
@@ -213,6 +215,7 @@ middleware
minikube
Minikube
Minio
misattributed
misconfiguration
misconfigured
mkdocs
@@ -404,6 +407,7 @@ unbreak
Unconference
unicode
unmanaged
unmount
unregister
unregistering
unregistration
+1 -1
View File
@@ -56,7 +56,7 @@ jobs:
run: ls microsite/build && ls microsite/build/storybook
- name: Deploy both microsite and storybook to gh-pages
uses: JamesIves/github-pages-deploy-action@v4.4.2
uses: JamesIves/github-pages-deploy-action@v4.4.3
with:
branch: gh-pages
folder: microsite/build
+3
View File
@@ -254,3 +254,6 @@ _You can do this by using the [Adopter form](https://info.backstage.spotify.com/
| [Celonis](https://celonis.com) | [@georgeyord](https://github.com/georgeyord), [@LauraMoraB](https://github.com/LauraMoraB), [@mariosant](https://github.com/mariosant), [@Rbillon59](https://github.com/Rbillon59) | Internal developer and product portal implementation. |
| [Rabobank](https://www.rabobank.com) | [Willem Dekker](https://github.com/wdekker), [Sridhar Gnanasekaran](https://github.com/srid99), [Ruben Ernst](https://github.com/Ruben-E) | At Rabobank, our mission is to make life better for engineers. After exploring various options in the market, we've discovered that Backstage provides the perfect foundation for creating a platform that meets our engineers' needs and helps us achieve our goals. We want to make our engineers happy by offering standardized services, freeing them up to focus on delivering value. Our vision is to create a one-stop platform where engineers can find everything related to software and services. In practice, we're excited about using all the cool features in Backstage, and we're even planning to build our own plugins. |
| [JB Hi-Fi](https://www.jbhifi.com.au) | [@bahman](https://github.com/bahman-jb/) | We use Backstage as a central place for all of our components/apis across multiple teams. It helps us to quickly identify the ownership of a component/api, find the related links and have a quick access to CI/CD pipelines. |
| [Zenklub](https://www.zenklub.com.br) | [@zenklub](https://github.com/zenklub), [@gioufop](https://github.com/gioufop) | Developer portal, services catalog and centralization of metrics from Grafana Stack and AWS. Furthermore, centralization of documentation and infra details like Tools, Network services and so on. |
| [Platzi](https://platzi.com/) | [@juancarestre](https://github.com/juancarestre/), [Engineering at Platzi](https://github.com/PlatziDev/) | Backstage allow our developers to get easily engaged with all the internal components, technical documentations and software templates. All new developers reduce its onboarding time via Backstage, and after a couple of integrations it allowed us to create new components with in a couple of clicks. |
| [idealo](https://idealo.de) | [Wanis Fahmy](https://github.com/wanisfahmyDE), [Sajjad Pervaiz](https://github.com/sjvaiz), [Tim Heurich](https://github.com/theurichde) | Backstage is our Internal developer portal. Along with other plugins, We use the software catalog, TechDocs and explore plugins to manage, discover and document our software components and platform products. |
+1
View File
@@ -42,6 +42,7 @@ Scope: Discoverability within Backstage, including the home page, information ar
| Emma Indal | Spotify | BUX | [emmaindal](http://github.com/emmaindal) | emmaindal#7503 |
| Raghunandan Balachandran | Spotify | BUX | [soapraj](http://github.com/soapraj) | raghunandanb#1114 |
| Renan Mendes Carvalho | Spotify | BUX | [aitherios](http://github.com/aitherios) | aitherios#0593 |
| Bailey Brooks | Spotify | BUX | [bailey](http://github.com/bailey) | \_bailey4 |
### Helm Charts
+2
View File
@@ -10,6 +10,8 @@
[![Codecov](https://img.shields.io/codecov/c/github/backstage/backstage)](https://codecov.io/gh/backstage/backstage)
[![](https://img.shields.io/github/v/release/backstage/backstage)](https://github.com/backstage/backstage/releases)
[![Uffizzi](https://img.shields.io/endpoint?url=https%3A%2F%2Fapp.uffizzi.com%2Fapi%2Fv1%2Fpublic%2Fshields%2Fgithub.com%2Fbackstage%2Fbackstage)](https://app.uffizzi.com/ephemeral-environments/backstage/backstage)
[![OpenSSF Best Practices](https://bestpractices.coreinfrastructure.org/projects/7678/badge)](https://bestpractices.coreinfrastructure.org/projects/7678)
[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/backstage/backstage/badge)](https://securityscorecards.dev/viewer/?uri=github.com/backstage/backstage)
> 🏖️ The week beginning the 26th of June, some of the maintainers will be taking a well earned Summer Holiday break. We will be slower to respond to issues and PRs during this time. Releases will continue to be shipped weekly. Normal service will resume on the 24th of July. 🏝️
+68 -65
View File
@@ -20,6 +20,8 @@ app:
- url: https://discord.gg/backstage-687207715902193673
title: '#backstage'
packageName: example-app
backend:
# Used for enabling authentication, secret is shared by all backend plugins
# See https://backstage.io/docs/auth/service-to-service-auth for
@@ -49,80 +51,81 @@ backend:
# See README.md in the proxy-backend plugin for information on the configuration format
proxy:
'/circleci/api':
target: https://circleci.com/api/v1.1
headers:
Circle-Token: ${CIRCLECI_AUTH_TOKEN}
endpoints:
'/circleci/api':
target: https://circleci.com/api/v1.1
headers:
Circle-Token: ${CIRCLECI_AUTH_TOKEN}
'/jenkins/api':
target: http://localhost:8080
headers:
Authorization: ${JENKINS_BASIC_AUTH_HEADER}
'/jenkins/api':
target: http://localhost:8080
headers:
Authorization: ${JENKINS_BASIC_AUTH_HEADER}
'/travisci/api':
target: https://api.travis-ci.com
changeOrigin: true
headers:
Authorization: ${TRAVISCI_AUTH_TOKEN}
travis-api-version: '3'
'/travisci/api':
target: https://api.travis-ci.com
changeOrigin: true
headers:
Authorization: ${TRAVISCI_AUTH_TOKEN}
travis-api-version: '3'
'/newrelic/apm/api':
target: https://api.newrelic.com/v2
headers:
X-Api-Key: ${NEW_RELIC_REST_API_KEY}
'/newrelic/apm/api':
target: https://api.newrelic.com/v2
headers:
X-Api-Key: ${NEW_RELIC_REST_API_KEY}
'/newrelic/api':
target: https://api.newrelic.com
headers:
X-Api-Key: ${NEW_RELIC_USER_KEY}
'/newrelic/api':
target: https://api.newrelic.com
headers:
X-Api-Key: ${NEW_RELIC_USER_KEY}
'/pagerduty':
target: https://api.pagerduty.com
headers:
Authorization: Token token=${PAGERDUTY_TOKEN}
'/pagerduty':
target: https://api.pagerduty.com
headers:
Authorization: Token token=${PAGERDUTY_TOKEN}
'/buildkite/api':
target: https://api.buildkite.com/v2/
headers:
Authorization: ${BUILDKITE_TOKEN}
'/buildkite/api':
target: https://api.buildkite.com/v2/
headers:
Authorization: ${BUILDKITE_TOKEN}
'/sentry/api':
target: https://sentry.io/api/
allowedMethods: ['GET']
headers:
Authorization: ${SENTRY_TOKEN}
'/sentry/api':
target: https://sentry.io/api/
allowedMethods: ['GET']
headers:
Authorization: ${SENTRY_TOKEN}
'/ilert':
target: https://api.ilert.com
allowedMethods: ['GET', 'POST', 'PUT']
allowedHeaders: ['Authorization']
headers:
Authorization: ${ILERT_AUTH_HEADER}
'/ilert':
target: https://api.ilert.com
allowedMethods: ['GET', 'POST', 'PUT']
allowedHeaders: ['Authorization']
headers:
Authorization: ${ILERT_AUTH_HEADER}
'/airflow':
target: https://your.airflow.instance.com/api/v1
headers:
Authorization: ${AIRFLOW_BASIC_AUTH_HEADER}
'/airflow':
target: https://your.airflow.instance.com/api/v1
headers:
Authorization: ${AIRFLOW_BASIC_AUTH_HEADER}
'/gocd':
target: https://your.gocd.instance.com/go/api
allowedMethods: ['GET']
allowedHeaders: ['Authorization']
headers:
Authorization: Basic ${GOCD_AUTH_CREDENTIALS}
'/gocd':
target: https://your.gocd.instance.com/go/api
allowedMethods: ['GET']
allowedHeaders: ['Authorization']
headers:
Authorization: Basic ${GOCD_AUTH_CREDENTIALS}
'/dynatrace':
target: https://your.dynatrace.instance.com/api/v2
headers:
Authorization: 'Api-Token ${DYNATRACE_ACCESS_TOKEN}'
'/dynatrace':
target: https://your.dynatrace.instance.com/api/v2
headers:
Authorization: 'Api-Token ${DYNATRACE_ACCESS_TOKEN}'
'/stackstorm':
target: https://your.stackstorm.instance.com/api
headers:
St2-Api-Key: ${ST2_API_KEY}
'/stackstorm':
target: https://your.stackstorm.instance.com/api
headers:
St2-Api-Key: ${ST2_API_KEY}
'/puppetdb':
target: https://your.puppetdb.instance.com
'/puppetdb':
target: https://your.puppetdb.instance.com
organization:
name: My Company
@@ -211,7 +214,7 @@ integrations:
# clientEmail: 'example@example.com'
# privateKey: ${GCS_PRIVATE_KEY}
awsS3:
- host: amazonaws.com
- endpoint: ${AWS_S3_ENDPOINT}
accessKeyId: ${AWS_ACCESS_KEY_ID}
secretAccessKey: ${AWS_SECRET_ACCESS_KEY}
@@ -352,8 +355,6 @@ auth:
metadataUrl: ${AUTH_OIDC_METADATA_URL}
clientId: ${AUTH_OIDC_CLIENT_ID}
clientSecret: ${AUTH_OIDC_CLIENT_SECRET}
authorizationUrl: ${AUTH_OIDC_AUTH_URL}
tokenUrl: ${AUTH_OIDC_TOKEN_URL}
tokenEndpointAuthMethod: ${AUTH_OIDC_TOKEN_ENDPOINT_AUTH_METHOD} # default='client_secret_basic'
tokenSignedResponseAlg: ${AUTH_OIDC_TOKEN_SIGNED_RESPONSE_ALG} # default='RS256'
scope: ${AUTH_OIDC_SCOPE} # default='openid profile email'
@@ -434,8 +435,10 @@ costInsights:
kind: 'PINTS_OF_ICE_CREAM'
unit: 'ice cream pint'
rate: 5.5
pagerduty:
pagerDuty:
eventsBaseUrl: 'https://events.pagerduty.com/v2'
jenkins:
instances:
- name: default
+23 -16
View File
@@ -58,6 +58,7 @@ When using ALB authentication Backstage will only be loaded once the user has su
import React from 'react';
import { UserIdentity } from '@backstage/core-components';
import { SignInPageProps } from '@backstage/core-app-api';
import { useApi, configApiRef } from '@backstage/core-plugin-api';
const SampleSignInComponent: any = (props: SignInPageProps) => {
const [error, setError] = React.useState<string | undefined>();
@@ -90,8 +91,8 @@ const SampleSignInComponent: any = (props: SignInPageProps) => {
},
}),
);
} catch (err) {
setError(err.message);
} catch (err: any) {
setError(err.message as string);
}
}
}, [config]);
@@ -135,12 +136,14 @@ export default async function createPlugin({
database,
config,
discovery,
tokenManager,
}: PluginEnvironment): Promise<Router> {
return await createRouter({
logger,
config,
database,
discovery,
tokenManager,
providerFactories: {
awsalb: providers.awsAlb.create({
authHandler: async ({ fullProfile }) => {
@@ -168,25 +171,29 @@ export default async function createPlugin({
};
},
signIn: {
resolver: async ({ profile: { email } }, ctx) => {
const [id] = email?.split('@') ?? '';
// Fetch from an external system that returns entity claims like:
// ['user:default/breanna.davison', ...]
const userEntityRef = stringifyEntityRef({
resolver: async ({ profile }, ctx) => {
if (!profile.email) {
throw new Error('Profile contained no email');
}
const [id] = profile.email.split('@');
if (!id) {
throw new Error('Invalid email format');
}
const userRef = stringifyEntityRef({
kind: 'User',
namespace: DEFAULT_NAMESPACE,
name: id,
namespace: DEFAULT_NAMESPACE,
});
// Resolve group membership from the Backstage catalog
const fullEnt =
await ctx.catalogIdentityClient.resolveCatalogMembership({
entityRefs: [id].concat([userEntityRef]),
logger: ctx.logger,
});
const token = await ctx.tokenIssuer.issueToken({
claims: { sub: userEntityRef, ent: fullEnt },
const { token } = await ctx.issueToken({
claims: {
sub: userRef,
ent: [userRef],
},
});
return { id, token };
},
},
+6 -2
View File
@@ -41,14 +41,18 @@ auth:
secret: ${AUTH_SESSION_SECRET}
```
The Auth0 provider is a structure with three configuration keys:
The Auth0 provider is a structure with these configuration keys:
- `clientId`: The Application client ID, found on the Auth0 Application page
- `clientSecret`: The Application client secret, found on the Auth0 Application
page
- `domain`: The Application domain, found on the Auth0 Application page
Because Auth0 requires a session you need to give the session a secret key.
It additionally relies on the following configuration to function:
- `session.secret`: The session secret is a key used for signing and/or encrypting cookies set by the application to maintain session state. In this case, 'your session secret' should be replaced with a long, complex, and unique string that only your application knows.
Auth0 requires a session, so you need to give the session a secret key.
## Optional Configuration
+5 -1
View File
@@ -20,8 +20,10 @@ The provider configuration can be added to your `app-config.yaml` under the root
```yaml title="app-config.yaml"
auth:
environment: development
providers:
oauth2Proxy: {}
oauth2Proxy:
development: {}
```
Right now no configuration options are supported, but the empty object is needed
@@ -58,6 +60,8 @@ providerFactories: {
},
```
[An example on how to sign a user in without a matching user](https://github.com/backstage/backstage/blob/master/packages/backend/src/plugins/auth.ts)
## Adding the provider to the Backstage frontend
It is recommended to use the `ProxiedSignInPage` for this provider, which is
+1 -1
View File
@@ -59,7 +59,7 @@ Just like plugins, modules also have access to services and can depend on their
A detailed explanation of the package architecture can be found in the
[Backstage Architecture
Overview](../../overview/architecture-overview.md#package-architecture). The
Overview](../../overview/architecture-overview/#package-architecture). The
most important packages to consider for this system are the following:
- `plugin-<pluginId>-backend` houses the implementation of the backend plugins
@@ -37,4 +37,4 @@ At a high level, when you call `createBackend`, it will create a new backend ins
Underneath the hood, `createBackend` calls `createSpecializedBackend` from `@backstage/backend-app-api` which is responsible for actually creating the backend instance, but with no services or no features. You can think of `createBackend` more of a 'batteries included' approach, and `createSpecializedBackend` a little more low level.
As mentioned previously there's also the ability to create multiple of these backends in your project so that you can split apart your backend and deploy different backends that can scale independently of each other. For instance you might choose to deploy a backend with only the catalog plugin enabled, and one with just the scaffolder plugin enabled. We've provided some tools to be able to share services and defaults across your backend system, and you can find out more about that in the [shared environments docs](../building-backends/01-index.md#shared-environments).
As mentioned previously there's also the ability to create multiple of these backends in your project so that you can split apart your backend and deploy different backends that can scale independently of each other. For instance you might choose to deploy a backend with only the catalog plugin enabled, and one with just the scaffolder plugin enabled.
@@ -61,11 +61,11 @@ All of these services can be replaced with your own implementations if you need
For example, let's say we want to customize the core configuration service to enable remote configuration loading. That would look something like this:
```ts
import { configServiceFactory } from '@backstage/backend-app-api';
import { rootConfigServiceFactory } from '@backstage/backend-app-api';
const backend = createBackend({
services: [
configServiceFactory({
rootConfigServiceFactory({
remote: { reloadIntervalSeconds: 60 },
}),
],
@@ -148,35 +148,3 @@ backend.start();
```
We've now split the backend into two separate deployments, but we still need to make sure that they can communicate with each other. This is the hard and somewhat tedious part, as Backstage currently doesn't provide an out of the box solution that solves this. You'll need to manually configure the two backends with custom implementations of the `DiscoveryService` and have them return the correct URLs for each other. Likewise, you'll also need to provide a custom implementation of the `DiscoveryApi` in the frontend, unless you surface the two backends via a proxy that handles the routing instead.
### Shared Environments
To make it a bit easier to manage multiple backends, it's possible to create a shared environment that can be used across multiple backends. You would typically house it in a separate package that can be referenced by backends in your monorepo, or published to a package registry for broader use.
A shared environment contains a set of service implementations that should be used across all backends. These services will override the default ones, but if a service is provided directly to the backend, it will override the one in the shared environment.
A shared environment is defined using `createSharedEnvironment`. In this example we place it in a new and separate package called `backend-env`:
```ts
// packages/backend-env/src/index.ts
import { createSharedEnvironment } from '@backstage/backend-plugin-api';
import { customDiscoveryServiceFactory } from './customDiscoveryServiceFactory';
export const env = createSharedEnvironment({
services: [
customDiscoveryServiceFactory(), // custom DiscoveryService implementation
],
});
```
And passed on to backends using the `env` option:
```ts
// packages/backend-b/src/index.ts, imports omitted
import { env } from '@internal/backend-env';
const backend = createBackend({ env });
backend.add(scaffolderPlugin());
backend.start();
```
@@ -37,7 +37,7 @@ describe('myPlugin', () => {
const { server } = await startTestBackend({
features: [myPlugin()],
services: [mockServices.config.factory({ data: fakeConfig })],
services: [mockServices.rootConfig.factory({ data: fakeConfig })],
});
const response = await request(server).get('/api/example/get-value');
@@ -183,11 +183,11 @@ There's additional configuration that you can optionally pass to setup the `conf
You can configure these additional options by adding an override for the core service when calling `createBackend` like follows:
```ts
import { configServiceFactory } from '@backstage/backend-app-api';
import { rootConfigServiceFactory } from '@backstage/backend-app-api';
const backend = createBackend({
services: [
configServiceFactory({
rootConfigServiceFactory({
argv: [
'--config',
'/backstage/app-config.development.yaml',
+78
View File
@@ -0,0 +1,78 @@
---
id: flightcontrol
title: Deploying with Flightcontrol
sidebar_label: AWS Fargate via Flightcontrol
description: Deploying Backstage to AWS Fargate via Flightcontrol
---
This guide explains how to deploy Backstage to [Flightcontrol](https://www.flightcontrol.dev?ref=backstage), a platform that fully automates deployments to Amazon Web Services (AWS). Flightcontrol supports git-driven and image registry deployments.
Before you begin, make sure you have a [Flightcontrol account](https://app.flightcontrol.dev/signup?ref=backstage) and a [Github account](https://github.com/login) to follow this guide.
# Deployment Via Dashboard
1. Create a new project from the Flightcontrol Dashboard
2. Select the GitHub repo for your Backstage project
3. Select `GUI` as the config type:
4. Then, choose `+ Add Web Server (Fargate)` under Services before entering the following server information:
| Field Name | Value |
| ----------------- | ----------------- |
| Build Type | Custom Dockerfile |
| Health Check Path | /catalog |
| Port | 7007 |
5. Click `Create Project` and complete any required steps (like linking your AWS account).
# Deployment via Code
1. Create a new project from the Flightcontrol Dashboard
2. Select the GitHub repo for your Backstage project
3. Select the `flightcontrol.json` Config Type.
```json filename="flightcontrol.json"
{
"$schema": "https://app.flightcontrol.dev/schema.json",
"environments": [
{
"id": "backstage",
"name": "Backstage",
"region": "us-west-2",
"source": {
"branch": "main"
},
"services": [
{
"id": "backstage",
"name": "Backstage",
"type": "fargate",
"buildType": "docker",
"dockerfilePath": "Dockerfile",
"dockerContext": ".",
"healthCheckPath": "/catalog",
"cpu": 0.5,
"memory": 1,
"domain": "backstage.yourapp.com",
"port": 7007,
"minInstances": 1,
"maxInstances": 1
}
]
}
]
}
```
# Databases and Redis
If you need a database or Redis for your Backstage plugins, you can easily add those to your Flightcontrol deployment. For more information, see [the flightcontrol docs](https://www.flightcontrol.dev/docs/guides/flightcontrol/using-code?ref=backstage#redis).
## Troubleshooting
- [Flightcontrol Documentation](https://www.flightcontrol.dev/docs?ref=backstage)
- [Troubleshooting](https://www.flightcontrol.dev/docs/troubleshooting?ref=backstage)
+48 -8
View File
@@ -110,7 +110,7 @@ cluster. Valid values are:
| `google` | This will use a user's Google access token from the [Google auth provider](https://backstage.io/docs/auth/google/provider) to access the Kubernetes API on GKE clusters. |
| `googleServiceAccount` | This will use the Google Cloud service account credentials to access resources in clusters |
| `oidc` | This will use [Oidc Tokens](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#openid-connect-tokens) to authenticate to the Kubernetes API. When this is used the `oidcTokenProvider` field should also be set. Please note the cluster must support OIDC, at the time of writing AKS clusters do not support OIDC. |
| `serviceAccount` | This will use a Kubernetes [service account](https://kubernetes.io/docs/reference/access-authn-authz/service-accounts-admin/) to access the Kubernetes API. When this is used the `serviceAccountToken` field should also be set. |
| `serviceAccount` | This will use a Kubernetes [service account](https://kubernetes.io/docs/reference/access-authn-authz/service-accounts-admin/) to access the Kubernetes API. When this is used the `serviceAccountToken` field should also be set, or else Backstage should be running in-cluster. |
Check the [Kubernetes Authentication][4] section for additional explanation.
@@ -127,14 +127,54 @@ CPU/Memory for pods returned by the API server. Defaults to `false`.
##### `clusters.\*.serviceAccountToken` (optional)
The service account token to be used when using the `serviceAccount` auth
provider. You could get the service account token with:
provider. Note that, unless you have an effective credential rotation procedure
in place or have a single Kubernetes cluster running both Backstage and all your
services, this auth provider is probably not ideal for production.
```sh
kubectl -n <NAMESPACE> get secret $(kubectl -n <NAMESPACE> get sa <SERVICE_ACCOUNT_NAME> -o=json \
| jq -r '.secrets[0].name') -o=json \
| jq -r '.data["token"]' \
| base64 --decode
```
Assuming you have already created a service account named `SERVICE_ACCOUNT_NAME`
in namespace `NAMESPACE` and it has adequate
[permissions](#role-based-access-control), here are some sample procedures to
procure a long-lived service account token for use with this provider:
- On versions of Kubernetes [prior to
1.24](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.24.md#no-really-you-must-read-this-before-you-upgrade-1),
you could get an (automatically-generated) token for a service account with:
```sh
kubectl -n <NAMESPACE> get secret $(kubectl -n <NAMESPACE> get sa <SERVICE_ACCOUNT_NAME> -o=json \
| jq -r '.secrets[0].name') -o=json \
| jq -r '.data["token"]' \
| base64 --decode
```
- For Kubernetes 1.24+, as described in [this
guide](https://kubernetes.io/docs/concepts/configuration/secret/#service-account-token-secrets),
you can obtain a long-lived token by creating a secret:
```sh
kubectl apply -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
name: <SECRET_NAME>
namespace: <NAMESPACE>
annotations:
kubernetes.io/service-account.name: <SERVICE_ACCOUNT_NAME>
type: kubernetes.io/service-account-token
EOF
```
waiting for the token controller to populate a token, and retrieving it with:
```sh
kubectl -n <NAMESPACE> get secret <SECRET_NAME> -o go-template='{{.data.token | base64decode}}'
```
If a cluster has `authProvider: serviceAccount` and the `serviceAccountToken`
field is omitted, Backstage will ignore the configured URL and certificate data,
instead attempting to access the Kubernetes API via an in-cluster client as in
[this
example](https://github.com/kubernetes-client/javascript/blob/master/examples/in-cluster.js).
##### `clusters.\*.oidcTokenProvider` (optional)
+3 -3
View File
@@ -51,7 +51,7 @@ The TechDocs plugin has supported integrations to Search, meaning that it
provides a default collator factory ready to be used.
The purpose of this guide is to walk you through how to register the
[DefaultTechDocsCollatorFactory](https://github.com/backstage/backstage/blob/de294ce5c410c9eb56da6870a1fab795268f60e3/plugins/techdocs-backend/src/search/DefaultTechDocsCollatorFactory.ts)
[DefaultTechDocsCollatorFactory](https://github.com/backstage/backstage/blob/1adc2c7/plugins/search-backend-module-techdocs/src/collators/DefaultTechDocsCollatorFactory.ts)
in your App, so that you can get TechDocs documents indexed.
If you have been through the
@@ -61,10 +61,10 @@ so, you can go ahead and follow this guide - if not, start by going through the
getting started guide.
1. Import the `DefaultTechDocsCollatorFactory` from
`@backstage/plugin-techdocs-backend`.
`@backstage/plugin-search-backend-module-techdocs`.
```typescript
import { DefaultTechDocsCollatorFactory } from '@backstage/plugin-techdocs-backend';
import { DefaultTechDocsCollatorFactory } from '@backstage/plugin-search-backend-module-techdocs';
```
2. If there isn't an existing schedule you'd like to run the collator on, be
@@ -64,7 +64,7 @@ The recommended approach would be to represent information in catalog-info files
**Naming strategies:**
- Ldap: Internal ldap usernames as entity names. e.g., owner: user:myuser or user: my-team-name.
- Ldap: Internal ldap usernames as entity names. e.g., owner: user:my-user or user: my-team-name.
**Ownership strategies:**
@@ -207,5 +207,8 @@ scaffolder backend:
| Azure Pipeline Actions | [scaffolder-backend-module-azure-pipelines](https://www.npmjs.com/package/@parfuemerie-douglas/scaffolder-backend-module-azure-pipelines) | [Parfümerie Douglas](https://github.com/Parfuemerie-Douglas) |
| Azure Repository Actions | [scaffolder-backend-module-azure-repositories](https://www.npmjs.com/package/@parfuemerie-douglas/scaffolder-backend-module-azure-repositories) | [Parfümerie Douglas](https://github.com/Parfuemerie-Douglas) |
| Snyk Import Project | [plugin-scaffolder-backend-module-snyk](https://www.npmjs.com/package/@ma11hewthomas/plugin-scaffolder-backend-module-snyk) | [Matthew Thomas](https://github.com/Ma11hewThomas) |
| JSON Merge Actions | [plugin-scaffolder-json-merge-actions](https://www.npmjs.com/package/@mdude2314/backstage-plugin-scaffolder-json-merge-actions) | [Drew Hill](https://github.com/arhill05) |
| NPM Actions | [plugin-scaffolder-npm-actions](https://www.npmjs.com/package/@mdude2314/backstage-plugin-scaffolder-npm-actions) | [Drew Hill](https://github.com/arhill05) |
| Slack Actions | [plugin-scaffolder-backend-module-slack](https://www.npmjs.com/package/@mdude2314/backstage-plugin-scaffolder-backend-module-slack) | [Drew Hill](https://github.com/arhill05) |
Have fun! 🚀
+1
View File
@@ -23,6 +23,7 @@ catalog:
host: gitlab-host # Identifies one of the hosts set up in the integrations
branch: main # Optional. Used to discover on a specific branch
fallbackBranch: main # Optional. Fallback to be used if there is no default branch configured at the Gitlab repository. It is only used, if `branch` is undefined. Uses `master` as default
skipForkedRepos: false # Optional. If the project is a fork, skip repository
group: example-group # Optional. Group and subgroup (if needed) to look for repositories. If not present the whole instance will be scanned
entityFilename: catalog-info.yaml # Optional. Defaults to `catalog-info.yaml`
projectPattern: '[\s\S]*' # Optional. Filters found projects based on provided patter. Defaults to `[\s\S]*`, which means to not filter anything
+1 -1
View File
@@ -66,7 +66,7 @@ By default all internal users are allowed to create and delete entities. If this
## Scaffolder
By default, Scaffolding jobs execute directly on the host machine, including any actions defined in the template. Because the Scaffolder templates are considered a more sensitive area it is recommended to control access to create and update templates to trusted parties. Template execution is intended to be secure regardless of input, but we still recommend this additional layer of protection. The string templating is executed in a [node VM sandbox](https://github.com/patriksimek/vm2) to mitigate the possibility of remote code execution attacks.
By default, Scaffolding jobs execute directly on the host machine, including any actions defined in the template. Because the Scaffolder templates are considered a more sensitive area it is recommended to control access to create and update templates to trusted parties. Template execution is intended to be secure regardless of input, but we still recommend this additional layer of protection. The string templating is executed in a [node VM sandbox](https://github.com/laverdet/isolated-vm) to mitigate the possibility of remote code execution attacks.
The Scaffolder often has elevated permissions to for example create repositories in a Github organization. The integrator should therefore be cautious of Scaffolder Templates that for example delete or update existing resources as the user input is typically user defined and can therefore delete or modify resources maliciously or by mistake.
+1 -1
View File
@@ -32,7 +32,7 @@ their own release cadence and versioning policy.
## Main Release Line
Release cadence: Monthly
Release cadence: Monthly, specifically on the Tuesday before the third Wednesday of each month. The first release took place in March 2022.
The main release line in versioned with a major, minor and patch version but
does **not** adhere to [semver](https://semver.org). The version format is
+6 -4
View File
@@ -34,10 +34,11 @@ is a concrete implementation of [AnalyticsApi][analytics-api-type], common
integrations are packaged and provided as plugins. Find your analytics tool of
choice below.
| Analytics Tool | Support Status |
| ------------------------- | -------------- |
| [Google Analytics][ga] | Yes ✅ |
| [Google Analytics 4][ga4] | Yes ✅ |
| Analytics Tool | Support Status |
| ------------------------------------- | -------------- |
| [Google Analytics][ga] | Yes ✅ |
| [Google Analytics 4][ga4] | Yes ✅ |
| [New Relic Browser][newrelic-browser] | Community ✅ |
To suggest an integration, please [open an issue][add-tool] for the analytics
tool your organization uses. Or jump to [Writing Integrations][int-howto] to
@@ -45,6 +46,7 @@ learn how to contribute the integration yourself!
[ga]: https://github.com/backstage/backstage/blob/master/plugins/analytics-module-ga/README.md
[ga4]: https://github.com/backstage/backstage/blob/master/plugins/analytics-module-ga4/README.md
[newrelic-browser]: https://github.com/backstage/backstage/blob/master/plugins/analytics-module-newrelic-browser/README.md
[add-tool]: https://github.com/backstage/backstage/issues/new?assignees=&labels=plugin&template=plugin_template.md&title=%5BAnalytics+Module%5D+THE+ANALYTICS+TOOL+TO+INTEGRATE
[int-howto]: #writing-integrations
[analytics-api-type]: https://backstage.io/docs/reference/core-plugin-api.analyticsapi
+1 -1
View File
@@ -36,7 +36,7 @@ Example:
```yaml
# in app-config.yaml
proxy:
simple-example: http://simple.example.com:8080
/simple-example: http://simple.example.com:8080
'/larger-example/v1':
target: http://larger.example.com:8080/svc.v1
headers:
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -26,7 +26,6 @@ When we set out on this project, we had a few primary goals. First, we intended
- Make it easier to create and maintain backend installations.
- Align how plugins provide points of customization and how those customizations are installed.
- Make it much easier to maintain plugins, in particular keeping the API stable.
- Simplify the process of splitting plugins out into separate deployments with shared environments.
- Improve the local development and testing experience.
Prioritizing simplicity is often a guiding principle that we use for designs that span multiple ownership roles. We decide on which parts of the system that we think are the most important to have as simple as possible, or, viewed from the opposite end, where in the system we put necessary complexity. In this case, we optimized for keeping the backend setup as simple as possible, followed by modules and plugins, then libraries, and lastly the framework itself. What this guidance means in practice is that when there is complexity that needs to be added to implement a certain feature, we place as much of it as possible within the framework itself, then libraries, plugins and modules, and if absolutely needed, the backend setup.
@@ -0,0 +1,51 @@
---
# prettier-ignore
title: "Five common traits of successful Backstage adopters"
author: Taras Mankovski, CXO, Frontside
---
![backstage header](assets/2023-07-28/header.png)
At [Frontside](https://frontside.com/), our goal is to help cloud-native teams create cohesive development experiences. We've been at the Backstage party since the beginning helping companies adopt and extend Backstage to fit the needs of their unique ecosystems.
Through our experience, we've uncovered five common traits of organizations that have improved developer experience through successful Backstage implementation and adoption. In this blog, we'll dive into these traits with some thoughts on how you can follow their blueprint.
{/* truncate */}
## **1) They take a product-centric approach**
The biggest factor for successful adopters of Backstage is their approach. There is a high correlation of success within organizations that approach building a developer portal like they're building a product. Some organizations will jump straight into solutioning instead of taking their time to identify what the problems are, how they affect users, and how those issues can be addressed.
The team building out Backstage should assess or work from existing insights on the core challenges that developers are facing in their organization — both qualitative and quantitative data counts here — and connect those issues to a product roadmap with initial use cases and adoption milestones marked. By doing their research in advance, successful orgs have a clear vision of what they want to accomplish with their Backstage instance. They know exactly what goals need to be met and have pressure-tested potential issues and barriers.
If you've already started your Backstage adoption journey but haven't mapped a Product Requirements Document (or PRD), don't panic! There is always time to do the foundational knowledge-building necessary to deploy something successful.
## **2) They tie Backstage to a larger platform journey**
Platform engineering has emerged in response to the growing complexity of cloud-native software architecture. Backstage has a huge role to play in implementing a platform strategy but its part of a larger story. Having buy-in from both higher ups and the teams tasked with platform goals is an essential step in successful Backstage adoption. Without the support at the top, it can be difficult to implement platforming as a priority within your organization.
And by "the top", we don't necessarily mean your CTO needs to rubber stamp your Backstage POC. But it's important that higher-level Platform goals have been set among VPs and directors with the understanding that a well-constructed developer portal can be the catalyst to achieving not only better developer experience but broader cultural shifts.
Having this kind of executive buy-in means more than just getting stakeholders on board with a portal build or clearing pathways towards Backstage adoption; it also means ensuring they understand the realities of your organization's journey.
## **3) They prioritize developer experience**
Having a dedicated developer experience or DevOps team tasked not only with building out a Backstage instance — but with leading adoption — is another big factor to success.
Competing platforms are very common at big companies, with many teams doing different things or serving different parts of a business. But developer experience teams usually have a very clear mandate and are often one of the only commonalities between these competing teams. This team should have the bandwidth available to oversee the adoption process from start to finish, and partner with the right folks (research, design, internal comms and marketing) to create an effective adoption plan tailored specifically for a company's needs.
If you don't have established developer experience resources in place, then the questions the team leading the Backstage work needs to ask are "what are the common problems to be solved at a platform level?" and "once we've proved our initial use cases, how are we internally evangelizing this amongst our competing teams?"
## **4) They collaborate with other platform teams**
A developer experience team can not single-handedly transform an organization's development structures, processes, and culture. It requires collaboration with teams responsible for other aspects of the platform. Successful adopters collaborate with other teams to bring them along on the journey of improving developer experience. They use Backstage as an opportunity to foster their inner-source contribution practice by allowing multiple platform teams to contribute plugins to their portal.
The developer experience team takes on the role of host in that collaborative process. They support other teams in integrating their features into the portal, provide guidance on best practices, and advocate for the needs of developers.
## **5) They engage, learn, and grow with the community**
One of the key benefits of building a developer platform based off an open source framework is leveraging the contributions and best practices from the community. The Backstage community is the largest gathering of developer experience practitioners in the world. There are now [thousands of adopters](https://github.com/backstage/backstage/blob/63aa3a65ec05f638ba76c06878d6635194620b34/ADOPTERS.md#L4) with a wealth of experience and best practices to learn from — and they are excited to share!
By participating in the community, developer experience leaders can learn from their peers at other companies about strategies that work and can keep up with the latest features of the ever-evolving Backstage platform. They're aware of what solutions exist within the open source framework and plugin marketplace as well as what they may need to build in-house.
In short, successful Backstage adopters engage within the Backstage community and their peer group to find solutions that fit their common challenges as well as their unique needs.
Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

+1 -1
View File
@@ -5,6 +5,6 @@ authorUrl: https://redhat.com
category: Discovery
description: Synchronize 3scale content into the Backstage catalog.
documentation: https://janus-idp.io/plugins/3scale
iconUrl: http://janus-idp.io/images/plugins/3scale.svg
iconUrl: https://janus-idp.io/images/plugins/3scale.svg
npmPackageName: '@janus-idp/backstage-plugin-3scale-backend'
addedDate: '2023-05-15'
@@ -5,6 +5,6 @@ authorUrl: https://redhat.com
category: Image
description: View container image details from JFrog Artifactory in Backstage.
documentation: https://janus-idp.io/plugins/jfrog-artifactory
iconUrl: http://janus-idp.io/images/plugins/jfrog-artifactory.svg
iconUrl: https://janus-idp.io/images/plugins/jfrog-artifactory.svg
npmPackageName: '@janus-idp/backstage-plugin-jfrog-artifactory'
addedDate: '2023-05-15'
+1 -1
View File
@@ -5,6 +5,6 @@ authorUrl: https://redhat.com
category: Authentication/Authorization
description: Load users and groups from Keycloak, enabling use of multiple authentication providers to be applied to Backstage entities.
documentation: https://janus-idp.io/plugins/keycloak
iconUrl: http://janus-idp.io/images/plugins/keycloak.svg
iconUrl: https://janus-idp.io/images/plugins/keycloak.svg
npmPackageName: '@janus-idp/backstage-plugin-keycloak-backend'
addedDate: '2023-05-15'

Some files were not shown because too many files have changed in this diff Show More