Merge branch 'backstage:master' into reconfigure

This commit is contained in:
Bogdan Nechyporenko
2022-05-31 09:08:09 +02:00
committed by GitHub
534 changed files with 38672 additions and 2717 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-tech-insights-backend': patch
---
Updated tech-insights fetch/latest endpoint to return the actual latest row based on the timestamp
+46
View File
@@ -0,0 +1,46 @@
---
'@backstage/create-app': patch
---
Register `TechDocs` addons on catalog entity pages, follow the steps below to add them manually:
```diff
// packages/app/src/components/catalog/EntityPage.tsx
+ import { TechDocsAddons } from '@backstage/plugin-techdocs-react';
+ import {
+ ReportIssue,
+ } from '@backstage/plugin-techdocs-module-addons-contrib';
+ const techdocsContent = (
+ <EntityTechdocsContent>
+ <TechDocsAddons>
+ <ReportIssue />
+ </TechDocsAddons>
+ </EntityTechdocsContent>
+ );
const defaultEntityPage = (
...
<EntityLayout.Route path="/docs" title="Docs">
+ {techdocsContent}
</EntityLayout.Route>
...
);
const serviceEntityPage = (
...
<EntityLayout.Route path="/docs" title="Docs">
+ {techdocsContent}
</EntityLayout.Route>
...
);
const websiteEntityPage = (
...
<EntityLayout.Route path="/docs" title="Docs">
+ {techdocsContent}
</EntityLayout.Route>
...
);
```
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-auth-backend': patch
---
Increased key field size for signing_keys table to account for larger signature keys
+58
View File
@@ -0,0 +1,58 @@
---
'@backstage/plugin-catalog-backend-module-bitbucket-cloud': minor
---
Add new plugin `catalog-backend-module-bitbucket-cloud` with `BitbucketCloudEntityProvider`.
This entity provider is an alternative/replacement to the `BitbucketDiscoveryProcessor` **_(for Bitbucket Cloud only!)_**.
It replaces use cases using `search=true` and should be powerful enough as a complete replacement.
If any feature for Bitbucket Cloud is missing and preventing you from switching, please raise an issue.
**Before:**
```typescript
// packages/backend/src/plugins/catalog.ts
builder.addProcessor(
BitbucketDiscoveryProcessor.fromConfig(env.config, { logger: env.logger }),
);
```
```yaml
# app-config.yaml
catalog:
locations:
- type: bitbucket-discovery
target: 'https://bitbucket.org/workspaces/workspace-name/projects/apis-*/repos/service-*?search=true&catalogPath=/catalog-info.yaml'
```
**After:**
```typescript
// packages/backend/src/plugins/catalog.ts
builder.addEntityProvider(
BitbucketCloudEntityProvider.fromConfig(env.config, {
logger: env.logger,
schedule: env.scheduler.createScheduledTaskRunner({
frequency: { minutes: 30 },
timeout: { minutes: 3 },
}),
}),
);
```
```yaml
# app-config.yaml
catalog:
providers:
bitbucketCloud:
yourProviderId: # identifies your ingested dataset
catalogPath: /catalog-info.yaml # default value
filters: # optional
projectKey: '^apis-.*$' # optional; RegExp
repoSlug: '^service-.*$' # optional; RegExp
workspace: workspace-name
```
+29
View File
@@ -0,0 +1,29 @@
---
'@backstage/create-app': patch
---
Use of `SidebarContext` has been deprecated and will be removed in a future release. Instead, `useSidebarOpenState()` should be used to consume the context and `<SidebarOpenStateProvider>` should be used to provide it.
To prepare your app, update `packages/app/src/components/Root/Root.tsx` as follows:
```diff
import {
Sidebar,
sidebarConfig,
- SidebarContext
SidebarDivider,
// ...
SidebarSpace,
+ useSidebarOpenState,
} from '@backstage/core-components';
// ...
const SidebarLogo = () => {
const classes = useSidebarLogoStyles();
- const { isOpen } = useContext(SidebarContext);
+ const { isOpen } = useSidebarOpenState();
// ...
};
```
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-scaffolder-backend': minor
---
A new scaffolder action has been added: `gerrit:publish`
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-kubernetes-backend': patch
---
cache and refresh Azure tokens to avoid excessive calls to Azure Identity
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-pagerduty': patch
---
Fix alert that was not showing after creating an incident.
+1 -1
View File
@@ -2,4 +2,4 @@
'@backstage/backend-common': patch
---
Fixed potential crash by bumping the `luxon` dependency to `^2.3.1`.
Applied the `luxon` dependency fix from the `0.13.4` patch release.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-cost-insights': patch
---
Fixed css to show large tooltips on cost overview graph
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/core-components': patch
---
Fix EntityPage tab scrolling overflow bug on Firefox
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/core-components': patch
---
Fix issue where right arrow icon was incorrectly added to side bar items without a sub-menu
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend-module-github': patch
---
Adds an edit URL to the GitHub Teams Group entities.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-github-pull-requests-board': minor
---
Add Github Pull Requests board plugin
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/backend-common': patch
---
Applied the AWS S3 reading patch from the `0.13.5` patch release.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/integration': patch
---
Gerrit Integration: Handle absolute paths in `resolveUrl` properly.
+44 -1
View File
@@ -154,5 +154,48 @@
"@backstage/plugin-user-settings": "0.4.4",
"@backstage/plugin-xcmetrics": "0.2.25"
},
"changesets": []
"changesets": [
"afraid-mangos-sip",
"beige-deers-remember",
"blue-roses-give",
"fair-grapes-joke",
"fluffy-candles-learn",
"fresh-items-punch",
"funny-suns-pay",
"gold-tables-matter",
"healthy-pets-mix",
"hungry-brooms-wash",
"itchy-avocados-hug",
"loud-jars-kick",
"loud-walls-itch",
"mean-turtles-reply",
"nervous-gorillas-approve",
"odd-baboons-buy",
"olive-rats-rest",
"plenty-garlics-shop",
"polite-spiders-pay",
"poor-years-develop",
"quick-ladybugs-try",
"real-beers-type",
"reject-failed-index-tasks",
"renovate-ad175cc",
"scaffolder-form-context",
"shiny-clocks-joke",
"short-jokes-applaud",
"silly-wombats-flash",
"sixty-plums-kick",
"slimy-elephants-attend",
"spotty-goats-look",
"tasty-snails-boil",
"techdocs-buttons-film",
"techdocs-crabs-retire",
"techdocs-paws-study",
"techdocs-swans-check",
"techdocs-vans-run",
"techdocs-ways-type",
"techdocs-wolves-carry",
"ten-rocks-smile",
"unlucky-lies-pretend",
"wicked-teachers-hide"
]
}
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-jenkins-backend': patch
---
bug fix: provide backstage token for rebuild api call
+14
View File
@@ -0,0 +1,14 @@
---
'@backstage/plugin-catalog-backend-module-gitlab': patch
---
do not create location object if file with component definition do not exists in project, that decrease count of request to gitlab with 404 status code. Now we can create processor with new flag to enable this logic:
```ts
const processor = GitLabDiscoveryProcessor.fromConfig(config, {
logger,
skipReposWithoutExactFileMatch: true,
});
```
**WARNING:** This new functionality does not support globs in the repo file path
+1 -1
View File
@@ -1,5 +1,5 @@
---
'@backstage/search-backend-node': patch
'@backstage/plugin-search-backend-node': patch
---
propagate indexing errors so they don't appear successful to the task scheduler
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/cli': patch
---
Updated dependency `run-script-webpack-plugin` to `^0.0.14`.
+6
View File
@@ -0,0 +1,6 @@
---
'@backstage/backend-tasks': patch
---
Updated dependency `cron` to `^2.0.0`.
Updated dependency `@types/cron` to `^2.0.0`.
@@ -0,0 +1,7 @@
---
'@backstage/plugin-techdocs': patch
'@backstage/plugin-user-settings': patch
'@techdocs/cli': patch
---
Updated sidebar-related logic to use `<SidebarPinStateProvider>` + `useSidebarPinState()` and/or `<SidebarOpenStateProvider>` + `useSidebarOpenState()` from `@backstage/core-components`.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-search-backend-module-elasticsearch': patch
---
Use more precise matching for query filters
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/catalog-model': patch
---
Added targetRef to common.schema.json to match the Typescript type
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/cli': patch
---
Added console warning to frontend start when the `app.baseUrl` and `backend.baseUrl` are identical
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-graphiql': patch
---
Fix for custom headers not being included in requests.
+10
View File
@@ -0,0 +1,10 @@
---
'@backstage/plugin-bitbucket-cloud-common': minor
---
Add new common library `bitbucket-cloud-common` with a client for Bitbucket Cloud.
This client can be reused across all packages and might be the future place for additional
features like managing the rate limits, etc.
The client itself was generated in parts using the `@openapitools/openapi-generator-cli`.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-techdocs': patch
---
Fix `EntityTechdocsContent` component to use objects instead of `<Route>` elements, otherwise "outlet" will be null on sub-pages and add-ons won't render.
+9
View File
@@ -0,0 +1,9 @@
---
'@backstage/plugin-techdocs': patch
---
Restructures reader style transformations to improve code readability:
- Extracts the style rules to separate files;
- Creates a hook that processes each rule;
- And creates another hook that returns a transformer responsible for injecting them into the head tag of a given element.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-techdocs': patch
---
Convert `sanitizeDOM` transformer to hook as part of code readability improvements in dom file.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-scaffolder': minor
---
Gerrit Integration: Implemented a `RepoUrlPicker` for Gerrit.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-auth-backend': patch
---
Fix improper binding of 'this' in ALB Auth provider
+7
View File
@@ -0,0 +1,7 @@
---
'@backstage/core-components': patch
---
The `SidebarPinStateContext` and `SidebarContext` have been deprecated and will be removed in a future release. Instead, use `<SidebarPinStateProvider>` + `useSidebarPinState()` and/or `<SidebarOpenStateProvider>` + `useSidebarOpenState()`.
This was done to ensure that sidebar state can be shared successfully across components exported by different packages, regardless of what version of this package is resolved and installed for each individual package.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-import': patch
---
Updated catalog import page text so they go in the correct hierarchy order
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend-module-bitbucket': minor
---
Integrate `@backstage/plugin-bitbucket-cloud-common` as replacement for the `BitbucketCloudClient`.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend-module-ldap': minor
---
Added the possibility to pass TLS configuration to ldap connection
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/backend-tasks': patch
---
Add error logging when a background task throws an error rather than silently swallowing it.
+6 -1
View File
@@ -126,4 +126,9 @@ _If you're using Backstage in your organization, please try to add your company
| [Avalia Systems](https://avalia.io) | [Olivier Liechti](https://github.com/wasadigi), [Fabio Velloso](https://github.com/fabiovelloso) | Innersource, software analytics, knowledge base for 360 software assessments, collaborative applications, hub for tracking and sharing IP assets. |
| [Albert Heijn](https://ah.technology) | [Joost Hofman](https://github.com/joosthofman), [Reindrich Geerman](https://github.com/reinst) | Single point of entry for all our engineers (Developer portal), Tech radar, catalog, templates (paved roads) and tech documentation. |
| [Wise, formerly TransferWise](https://wise.com) | [Andrew Beveridge](https://github.com/beveradb) | It's early days for us, we're trying to start small with catalog, tech docs and unified search. Future ambitious vision includes scaffolder for one-click component addition, building out integrations with CI/CD tooling, kubernetes clusters, monitoring/alerting tooling etc. and aiming for a frictionless "golden path" for engineers! 🚀 |
|[Happy Money](http://happymoney.com/)|[Akshit Lomash](mailto:alomash@happymoney.com)|We are moving from a monolith to microservices-based architecture. We are developing a developer portal based on Backstage to create a service catalog for our new services. All the services created are onboarded Backstage and engineering teams are using a cookie-cutter-based template from backstage to initiate a new service.
|[Lightspeed](http://lightspeedhq.com/)|[Marcus Crane](mailto:marcus.crane@lightspeedhq.com)|We use it within our X-Series division (https://vendhq.com) to catalog ~100+ systems and ~350 components!
|[Siemens](https://www.siemens.com/global/en.html)|[Nizar Chaouch](mailto:nizar.chaouch@siemens.com)|We are using Backstage as our Developer portal
|[The Warehouse Group](https://www.thewarehouse.co.nz)|[Matt Law](mailto:matt.law@thewarehouse.co.nz)|Backstage enables us to bootstrap our middleware environment of new services for our Dev teams in a matter of seconds. CI, CD, testing, logging, deployments are all taken care of to get them up and running in less than 60 seconds.
| [Tink](https://tink.com/) | [Sebastian Olsson](https://github.com/Sebelino), [Błażej Szum](https://github.com/blazejszumtink), [Anders Eurenius Runvald](https://github.com/anders-er-at-tink) | Internal developer portal which provides templates for creating new Java or Go microservices seamlessly. Also includes a tech radar and a visualization of our CD pipeline. |
| [Brandwatch](https://brandwatch.com)| [Stefan Buck](https://github.com/stefanbuck) | Our primary focus is on the service catalog. Backstage is replacing our homemade service catalog. The switch was quite simple due to the catalog processor API.
+3 -3
View File
@@ -1,6 +1,6 @@
dependencies:
- name: postgresql
repository: https://charts.bitnami.com/bitnami
version: 11.2.4
digest: sha256:782c8593a80e332b19f736d48f4635e424bbf0575ed9d587c0a301cccfcedce8
generated: "2022-05-19T10:46:51.441725486Z"
version: 9.8.12
digest: sha256:549b9a0cdf7b2e0ad949ebad853a467bf320928970a946fb0ef7e13e9bdb7a10
generated: "2022-05-20T08:15:48.301491565Z"
+1 -1
View File
@@ -18,7 +18,7 @@ sources:
dependencies:
- name: postgresql
condition: postgresql.enabled
version: 11.2.4
version: 9.8.12
repository: https://charts.bitnami.com/bitnami
maintainers:
@@ -82,5 +82,118 @@ describe('Catalog', () => {
.contains('Sub-page 1')
.should('be.visible');
});
it('Should render addons on docs tab homepage', () => {
cy.loginAsGuest();
cy.visit('/catalog');
cy.contains('techdocs-e2e-fixture').click();
cy.location().should(loc => {
expect(loc.pathname).to.eq(
'/catalog/default/component/techdocs-e2e-fixture',
);
});
cy.getCatalogDocsTab().click();
cy.wait(300);
cy.getTechDocsShadowRoot()
.find('h1')
.contains('Home page')
.should('be.visible');
// highlight a snippet of text
cy.getTechDocsShadowRoot()
.find('article > p')
.then($el => {
const el = $el[0];
const document = el.ownerDocument;
const range = document.createRange();
range.selectNodeContents(el);
document?.getSelection()?.removeAllRanges();
document?.getSelection()?.addRange(range);
});
cy.document().trigger('selectionchange');
// wait for new issue default debounce time
cy.wait(600);
// assert that the new issue button has a right url
cy.getTechDocsShadowRoot()
.contains('Open new Github issue')
.should(
'have.attr',
'href',
'https://github.com/backstage/backstage/issues/new?title=Documentation%20feedback%3A%20This%20is%20a%20basic%20documentation%20used%20for%20end-to-end%20tests.&body=%23%23%20Documentation%20Feedback%20%F0%9F%93%9D%0A%0A%20%23%23%23%23%20The%20highlighted%20text%3A%20%0A%0A%20%3E%20This%20is%20a%20basic%20documentation%20used%20for%20end-to-end%20tests.%0A%0A%20%23%23%23%23%20The%20comment%20on%20the%20text%3A%20%0A%20_%3Ereplace%20this%20line%20with%20your%20comment%3C_%0A%0A%20___%0ABackstage%20URL%3A%20%3Chttp%3A%2F%2Flocalhost%3A7007%2Fcatalog%2Fdefault%2Fcomponent%2Ftechdocs-e2e-fixture%2Fdocs%3E%20%0AMarkdown%20URL%3A%20%3Chttps%3A%2F%2Fgithub.com%2Fbackstage%2Fbackstage%2Fblob%2Fmaster%2Fcypress%2Ffixtures%2Fdocs%2Findex.md%3E',
);
});
it('Should render addons on docs tab sup-page', () => {
cy.loginAsGuest();
cy.visit('/catalog');
cy.contains('techdocs-e2e-fixture').click();
cy.location().should(loc => {
expect(loc.pathname).to.eq(
'/catalog/default/component/techdocs-e2e-fixture',
);
});
cy.getCatalogDocsTab().click();
cy.wait(300);
cy.getTechDocsShadowRoot()
.find('h1')
.contains('Home page')
.should('be.visible');
cy.getTechDocsShadowRoot().within(() => {
cy.getTechDocsNavigation().find('a').contains('Sub-page 1').click();
});
cy.location().should(loc => {
expect(loc.pathname).to.eq(
'/catalog/default/component/techdocs-e2e-fixture/docs/sub-page-one/',
);
});
cy.getTechDocsShadowRoot()
.find('h1')
.contains('Sub-page 1')
.should('be.visible');
// highlight a snippet of text
cy.getTechDocsShadowRoot()
.find('#section-11')
.then($el => {
const el = $el[0];
const document = el.ownerDocument;
const range = document.createRange();
range.selectNodeContents(el);
document?.getSelection()?.removeAllRanges();
document?.getSelection()?.addRange(range);
});
cy.document().trigger('selectionchange');
// wait for new issue default debounce time
cy.wait(600);
// assert that the new issue button has a right url
cy.getTechDocsShadowRoot()
.contains('Open new Github issue')
.should(
'have.attr',
'href',
'https://github.com/backstage/backstage/issues/new?title=Documentation%20feedback%3A%20Section%201.1%C2%B6&body=%23%23%20Documentation%20Feedback%20%F0%9F%93%9D%0A%0A%20%23%23%23%23%20The%20highlighted%20text%3A%20%0A%0A%20%3E%20Section%201.1%C2%B6%0A%0A%20%23%23%23%23%20The%20comment%20on%20the%20text%3A%20%0A%20_%3Ereplace%20this%20line%20with%20your%20comment%3C_%0A%0A%20___%0ABackstage%20URL%3A%20%3Chttp%3A%2F%2Flocalhost%3A7007%2Fcatalog%2Fdefault%2Fcomponent%2Ftechdocs-e2e-fixture%2Fdocs%2Fsub-page-one%2F%3E%20%0AMarkdown%20URL%3A%20%3Chttps%3A%2F%2Fgithub.com%2Fbackstage%2Fbackstage%2Fblob%2Fmaster%2Fcypress%2Ffixtures%2Fdocs%2Fsub-page-one.md%3E',
);
});
});
});
@@ -99,7 +99,7 @@ describe('TechDocs', () => {
});
describe('Rendering TechDocs Addons', () => {
it('should render a content addon', () => {
it('should render a content addon in homepage', () => {
cy.visit('/docs/default/Component/techdocs-e2e-fixture');
cy.contains('e2e Fixture Documentation');
@@ -130,6 +130,43 @@ describe('TechDocs', () => {
'https://github.com/backstage/backstage/issues/new?title=Documentation%20feedback%3A%20This%20is%20a%20basic%20documentation%20used%20for%20end-to-end%20tests.&body=%23%23%20Documentation%20Feedback%20%F0%9F%93%9D%0A%0A%20%23%23%23%23%20The%20highlighted%20text%3A%20%0A%0A%20%3E%20This%20is%20a%20basic%20documentation%20used%20for%20end-to-end%20tests.%0A%0A%20%23%23%23%23%20The%20comment%20on%20the%20text%3A%20%0A%20_%3Ereplace%20this%20line%20with%20your%20comment%3C_%0A%0A%20___%0ABackstage%20URL%3A%20%3Chttp%3A%2F%2Flocalhost%3A7007%2Fdocs%2Fdefault%2FComponent%2Ftechdocs-e2e-fixture%3E%20%0AMarkdown%20URL%3A%20%3Chttps%3A%2F%2Fgithub.com%2Fbackstage%2Fbackstage%2Fblob%2Fmaster%2Fcypress%2Ffixtures%2Fdocs%2Findex.md%3E',
);
});
it('should render a content addon in sub-pages', () => {
cy.visit('/docs/default/Component/techdocs-e2e-fixture');
cy.contains('e2e Fixture Documentation');
// open sub-page
cy.getTechDocsShadowRoot().within(() => {
cy.getTechDocsNavigation().find('a').contains('Sub-page 1').click();
});
// highlight a snippet of text
cy.getTechDocsShadowRoot()
.find('#section-11')
.then($el => {
const el = $el[0];
const document = el.ownerDocument;
const range = document.createRange();
range.selectNodeContents(el);
document?.getSelection()?.removeAllRanges();
document?.getSelection()?.addRange(range);
});
cy.document().trigger('selectionchange');
// wait for new issue default debounce time
cy.wait(600);
// assert that the new issue button has a right url
cy.getTechDocsShadowRoot()
.contains('Open new Github issue')
.should(
'have.attr',
'href',
'https://github.com/backstage/backstage/issues/new?title=Documentation%20feedback%3A%20Section%201.1%C2%B6&body=%23%23%20Documentation%20Feedback%20%F0%9F%93%9D%0A%0A%20%23%23%23%23%20The%20highlighted%20text%3A%20%0A%0A%20%3E%20Section%201.1%C2%B6%0A%0A%20%23%23%23%23%20The%20comment%20on%20the%20text%3A%20%0A%20_%3Ereplace%20this%20line%20with%20your%20comment%3C_%0A%0A%20___%0ABackstage%20URL%3A%20%3Chttp%3A%2F%2Flocalhost%3A7007%2Fdocs%2Fdefault%2FComponent%2Ftechdocs-e2e-fixture%2Fsub-page-one%2F%3E%20%0AMarkdown%20URL%3A%20%3Chttps%3A%2F%2Fgithub.com%2Fbackstage%2Fbackstage%2Fblob%2Fmaster%2Fcypress%2Ffixtures%2Fdocs%2Fsub-page-one.md%3E',
);
});
});
describe('Navigating within TechDocs', () => {

Before

Width:  |  Height:  |  Size: 284 KiB

After

Width:  |  Height:  |  Size: 284 KiB

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Before

Width:  |  Height:  |  Size: 181 KiB

After

Width:  |  Height:  |  Size: 181 KiB

+80 -65
View File
@@ -10,76 +10,23 @@ description: Backstage Search lets you find the right information you are lookin
## What is it?
Backstage Search lets you find the right information you are looking for in the
Backstage ecosystem.
Backstage Search lets you find the right information you are looking for in the Backstage ecosystem.
## Features
- A federated, faceted search, searching across all entities registered in your
Backstage instance.
- A federated, faceted search, searching across all entities registered in your Backstage instance.
- A search that lets you plug in your own search engine of choice.
- A standardized search API where you can choose to index other plugins data.
- A standardized search API where you can choose to index data from other plugins.
## Project roadmap
| Version | Description |
| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Backstage Search Pre-Alpha ✅ | Search Frontend letting you search through the entities of the software catalog. [See Pre-Alpha Use Cases.](#backstage-search-pre-alpha) |
| Backstage Search Alpha ✅ | Basic “out-of-the-box” in-memory indexing process of entities, and their metadata, registered to the Software Catalog. [See Alpha Use Cases](#backstage-search-alpha). |
| Backstage Search Beta ✅ | At least one production-ready search engine that supports the same use-cases as in the alpha. [See Beta Use Cases](#backstage-search-beta). |
| [Backstage Search 1.0 ⌛] | A stable Search API for plugin developers to add search to their plugins, and app integrators to expose that to their users. [See 1.0 Use Cases](#backstage-search-1.0). |
### Now
## Use Cases
**Backstage Search 1.0**
#### Backstage Search Pre-Alpha
The pre-alpha is intended to solve for the following user stories, but will get
there by means of a front-end only, non-extensible MVP.
- As a software engineer I should be able to navigate to a search page and
search for entities registered in the Software Catalog.
- As a software engineer I should be able to use the search input field in the
sidebar to search for entities registered in the Software Catalog.
- As a software engineer I should be able to see the number of results my search
returned.
- As a software engineer I should be able to filter on metadata (kind,
lifecycle) when Ive performed a search.
- As a software engineer I should be able to hide the filters if I dont need to
use them.
#### Backstage Search Alpha
We will consider Backstage Search to be in alpha when the above use-cases are
met, but built on top of a flexible, extensible platform.
- As an integrator, I should be able to provide all of the pre-alpha experiences
to my users if I choose, but also be able to customize the experience using a
composable set of components.
- As a plugin developer, I should have a standard way to expose my plugin's data
to Backstage Search.
- As an integrator, I should still be able to expose everything in the Software
Catalog in search, but it should be possible to customize what is searchable.
- As an integrator, although I should be able to customize all of the above, it
should be possible to have the pre-alpha user experiences covered without
having to set up and configure a search engine.
#### Backstage Search Beta
We will consider Backstage Search to be in a beta phase when the above use-cases
are met, and can be deployed using a production-ready search engine.
- As an integrator, I should be able to power my Backstage Search experience
(including querying and indexing) using a production-ready search engine like
ElasticSearch.
- As an integrator, I should be able to configure the connection to my search
engine in `app_config.yaml`.
- As an integrator, I should be able to tune the queries sent to my chosen
search engine according to my organization's needs, but a sensible default
query should be in place so that I am not required to do so.
#### Backstage Search 1.0
A stable Search API for plugin developers to add search to their plugins, and app integrators to expose that to their users.
We will consider Backstage Search to be 1.0 when the above
use-cases are met, and an ecosystem of search-enabled plugins are available and
@@ -92,9 +39,23 @@ stable.
how to customize and extend search in my Backstage instance to meet my
organization's needs.
more to come...
### Next
## Search Engines Supported
_Not specified_
### Someday/Maybe
_Not specified_
### Done
See [Done](#done) below for a list of completed roadmap items.
## Supported
The following sections show the search engines and plugins currently supported by Backstage Search.
### Search engines
See [Backstage Search Architecture](architecture.md) to get an overview of how
the search engines are used.
@@ -108,11 +69,11 @@ the search engines are used.
[Reach out to us](#get-involved) if you want to chat about support for more
search engines.
## Plugins Integrated with Search
### Plugins integrated with Backstage Search
| Plugin | Support Status |
| ------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------- |
| Catalog | ✅ |
| Software Catalog | ✅ |
| [TechDocs](./how-to-guides.md#how-to-index-techdocs-documents) | ✅ |
| [Stack Overflow](https://github.com/backstage/backstage/blob/master/plugins/stack-overflow-backend/README.md#index-stack-overflow-questions-to-search) | ✅ |
@@ -131,8 +92,62 @@ plugins integrated to search.
| Backend Plugin Module | @backstage/plugin-search-backend-module-elasticsearch |
| Backend Plugin Module | @backstage/plugin-search-backend-module-pg |
## Get Involved
## Get involved
For any questions, feedback, or to help move search forward, reach out to us in
the `#search` channel of our
the **#search** channel of our
[Discord chatroom](https://github.com/backstage/backstage#community).
## Done
**Backstage Search Pre-Alpha**
Search Frontend letting you search through the entities of the software catalog.
The pre-alpha is intended to solve for the following user stories, but will get
there by means of a front-end only, non-extensible MVP.
- As a software engineer I should be able to navigate to a search page and
search for entities registered in the Software Catalog.
- As a software engineer I should be able to use the search input field in the
sidebar to search for entities registered in the Software Catalog.
- As a software engineer I should be able to see the number of results my search
returned.
- As a software engineer I should be able to filter on metadata (kind,
lifecycle) when Ive performed a search.
- As a software engineer I should be able to hide the filters if I dont need to
use them.
**Backstage Search Alpha**
Basic “out-of-the-box” in-memory indexing process of entities, and their metadata, registered to the Software Catalog.
We will consider Backstage Search to be in alpha when the above use-cases are
met, but built on top of a flexible, extensible platform.
- As an integrator, I should be able to provide all of the pre-alpha experiences
to my users if I choose, but also be able to customize the experience using a
composable set of components.
- As a plugin developer, I should have a standard way to expose my plugin's data
to Backstage Search.
- As an integrator, I should still be able to expose everything in the Software
Catalog in search, but it should be possible to customize what is searchable.
- As an integrator, although I should be able to customize all of the above, it
should be possible to have the pre-alpha user experiences covered without
having to set up and configure a search engine.
**Backstage Search Beta**
At least one production-ready search engine that supports the same use-cases as in the alpha.
We will consider Backstage Search to be in a beta phase when the above use-cases
are met, and can be deployed using a production-ready search engine.
- As an integrator, I should be able to power my Backstage Search experience
(including querying and indexing) using a production-ready search engine like
ElasticSearch.
- As an integrator, I should be able to configure the connection to my search
engine in **app_config.yaml**.
- As an integrator, I should be able to tune the queries sent to my chosen
search engine according to my organization's needs, but a sensible default
query should be in place so that I am not required to do so.
+72 -60
View File
@@ -21,14 +21,44 @@ Today, it is one of the core products in Spotifys developer experience offeri
- Deploy TechDocs no matter how your software environment is set up.
- Discover your Service's technical documentation from the Service's page in Backstage Catalog.
- Create documentation-only sites for any purpose by just writing Markdown.
- Take advantage of the [TechDocs Addon Framework](addons.md) to add features on top of the base docs-like-code experience.
- Explore and take advantage of the large ecosystem of
[MkDocs plugins](https://www.mkdocs.org/user-guide/plugins/) to create a rich reading experience.
- Search for and find docs.
## Platforms supported
## Project roadmap
See [TechDocs Architecture](architecture.md) to get an overview of where these
providers are used.
### Now
With the Backstage 1.2 release, we have introduced the [TechDocs Addon Framework](https://backstage.io/blog/2022/05/13/techdocs-addon-framework) for augmenting the TechDocs experience at read-time.
In addition to the framework itself, we have open sourced a **ReportIssue** Addon, helping you to create a feedback loop that drives up documentation quality and foster a documentation culture at your organization.
### Next
What can we do in TechDocs to help drive up documentation quality? We have many ideas, for example, a Trust Card with associated Trust Score and automatic triggering of documentation maintenance notifications.
### Someday/Maybe
- Contribute to and deploy from a marketplace of TechDocs Addons
- Addon: MDX (allows you to use JSX in your Markdown content)
- Can we go static site generator agnostic?
- Better integration with
[Scaffolder V2](https://github.com/backstage/backstage/issues/2771) (e.g. easy to choose and apply documentation template with Software Templates)
- Possible to configure several aspects about TechDocs (e.g. URL, homepage,
theme)
### Done
See [Done](#done) below for a list of completed roadmap items.
## Supported
The following sections show the source code hosting providers and file storage providers that are currently supported by TechDocs.
See [TechDocs Architecture](architecture.md) to get an overview of where the below providers are used.
### Source code hosting providers
| Source Code Hosting Provider | Support Status |
| ---------------------------- | -------------- |
@@ -39,6 +69,8 @@ providers are used.
| GitLab | Yes ✅ |
| GitLab Enterprise | Yes ✅ |
### File storage providers
| File Storage Provider | Support Status |
| --------------------------------- | -------------- |
| Local Filesystem of Backstage app | Yes ✅ |
@@ -47,64 +79,17 @@ providers are used.
| Azure Blob Storage | Yes ✅ |
| OpenStack Swift | Community ✅ |
[Reach out to us](#feedback) if you want to request more platforms.
## Project roadmap
### **Published versions**
**Alpha release** ✅ -
[Milestone](https://github.com/backstage/backstage/milestone/16)
- Alpha of TechDocs that you can use end to end - and contribute to.
**Beta release** ✅ -
[Milestone](https://github.com/backstage/backstage/milestone/29)
- TechDocs' recommended setup supports most environments (CI systems, cloud
storage solutions, source control systems).
- [Instructions for upgrading from Alpha to Beta](how-to-guides.md#how-to-migrate-from-techdocs-alpha-to-beta)
**v1** ✅
TechDocs packages:
- '@backstage/plugin-techdocs'
- '@backstage/plugin-techdocs-backend'
- '@backstage/plugin-techdocs-node'
- '@techdocs/cli'
TechDocs promoted to v1.0! To understand how this change affects the package, please check out our [versioning policy](https://backstage.io/docs/overview/versioning-policy).
**v1.2** 🚧
With the Backstage 1.2 release, we plan to introduce the [TechDocs Addon Framework](https://github.com/backstage/backstage/issues/9636) for augmenting the TechDocs experience at read-time.
In addition to the framework itself, we'll be open sourcing a `<ReportIssue />` addon, helping you to create a feedback loop that drives up documentation quality and fosters a documentation culture at your organization.
### **Next**
- What can we do in TechDocs to drive up documentation quality?
### **Someday/Maybe**
- Contribute to and deploy from a marketplace of TechDocs Addons
- Addon: MDX (allows you to use JSX in your Markdown content)
- Can we go static site generator agnostic?
- Better integration with
[Scaffolder V2](https://github.com/backstage/backstage/issues/2771) (e.g. easy to choose and apply documentation template with Software Templates)
- Possible to configure several aspects about TechDocs (e.g. URL, homepage,
theme)
[Reach out to us](#get-involved) if you want to request more providers.
## Tech stack
| Stack | Location |
| ----------------------------------------------- | --------------------------------------------------------------- |
| Frontend Plugin | [`@backstage/plugin-techdocs`][techdocs/frontend] |
| Frontend Plugin Library | [`@backstage/plugin-techdocs-react`][techdocs/frontend-library] |
| Backend Plugin | [`@backstage/plugin-techdocs-backend`][techdocs/backend] |
| CLI (for local development and generating docs) | [`@techdocs/cli`][techdocs/cli] |
| Docker Container (for generating docs) | [`techdocs-container`][techdocs/container] |
| Stack | Location |
| ----------------------------------------------- | ------------------------------------------------------------- |
| Frontend Plugin | [@backstage/plugin-techdocs][techdocs/frontend] |
| Frontend Plugin Library | [@backstage/plugin-techdocs-react][techdocs/frontend-library] |
| Backend Plugin | [@backstage/plugin-techdocs-backend][techdocs/backend] |
| CLI (for local development and generating docs) | [@techdocs/cli][techdocs/cli] |
| Docker Container (for generating docs) | [techdocs-container][techdocs/container] |
[techdocs/frontend]: https://github.com/backstage/backstage/blob/master/plugins/techdocs
[techdocs/frontend-library]: https://github.com/backstage/backstage/blob/master/plugins/techdocs-react
@@ -112,7 +97,34 @@ In addition to the framework itself, we'll be open sourcing a `<ReportIssue />`
[techdocs/container]: https://github.com/backstage/techdocs-container
[techdocs/cli]: https://github.com/backstage/techdocs-cli
## Contact us
## Get involved
Reach out to us in the `#docs-like-code` channel of our
Reach out to us in the **#docs-like-code** channel of our
[Discord chatroom](https://github.com/backstage/backstage#community).
## Done
**Alpha release**
[Milestone](https://github.com/backstage/backstage/milestone/16)
- Alpha of TechDocs that you can use end to end - and contribute to.
**Beta release**
[Milestone](https://github.com/backstage/backstage/milestone/29)
- TechDocs' recommended setup supports most environments (CI systems, cloud
storage solutions, source control systems).
- [Instructions for upgrading from Alpha to Beta](how-to-guides.md#how-to-migrate-from-techdocs-alpha-to-beta)
**v1.0**
TechDocs promoted to v1.0! To understand how this change affects the package, check out our [versioning policy](https://backstage.io/docs/overview/versioning-policy).
TechDocs packages:
- @backstage/plugin-techdocs
- @backstage/plugin-techdocs-backend
- @backstage/plugin-techdocs-node
- @techdocs/cli
+2
View File
@@ -187,6 +187,8 @@ components: {
},
```
> Since [v1.1.0](https://github.com/backstage/backstage/releases/tag/v1.1.0-next.3), you must provide an [explicit sign-in resolver](../auth/identity-resolver.md).
That should be it. You can stop your Backstage App. When you start it again and
go to your Backstage portal in your browser, you should have your login prompt!
+1 -19
View File
@@ -15,25 +15,7 @@ plugin.
## Bitbucket Cloud
```yaml
integrations:
bitbucketCloud:
- username: ${BITBUCKET_CLOUD_USERNAME}
appPassword: ${BITBUCKET_CLOUD_PASSWORD}
```
> Note: A public Bitbucket Cloud provider is added automatically at startup for
> convenience, so you only need to list it if you want to supply credentials.
Directly under the `bitbucketCloud` key is a list of provider configurations, where
you can list the Bitbucket Cloud providers you want to fetch data from.
In the case of Bitbucket Cloud, you will have up to one entry.
This one entry will have the following elements:
- `username`: The Bitbucket Cloud username to use in API requests. If
neither a username nor token are supplied, anonymous access will be used.
- `appPassword`: The app password for the Bitbucket Cloud user.
Please see [the Bitbucket Cloud documentation](../bitbucketCloud/locations.md).
## Bitbucket Server
@@ -0,0 +1,95 @@
---
id: discovery
title: Bitbucket Cloud Discovery
sidebar_label: Discovery
# prettier-ignore
description: Automatically discovering catalog entities from repositories in Bitbucket Cloud
---
The Bitbucket Cloud integration has a special entity provider for discovering
catalog files located in [Bitbucket Cloud](https://bitbucket.org).
The provider will search your Bitbucket Cloud account and register catalog files matching the configured path
as Location entity and via following processing steps add all contained catalog entities.
This can be useful as an alternative to static locations or manually adding things to the catalog.
## Installation
You will have to add the entity provider in the catalog initialization code of your
backend. The provider is not installed by default, therefore you have to add a
dependency to `@backstage/plugin-catalog-backend-module-bitbucket-cloud` to your backend
package.
```bash
# From your Backstage root directory
yarn add --cwd packages/backend @backstage/plugin-catalog-backend-module-bitbucket-cloud
```
And then add the entity provider to your catalog builder:
```diff
// In packages/backend/src/plugins/catalog.ts
+ import { BitbucketCloudEntityProvider } from '@backstage/plugin-catalog-backend-module-bitbucket-cloud';
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
const builder = await CatalogBuilder.create(env);
+ builder.addEntityProvider(
+ BitbucketCloudEntityProvider.fromConfig(env.config, {
+ logger: env.logger,
+ schedule: env.scheduler.createScheduledTaskRunner({
+ frequency: { minutes: 30 },
+ timeout: { minutes: 3 },
+ }),
+ }),
+ );
// [...]
}
```
## Configuration
To use the entity provider, you'll need a [Bitbucket Cloud integration set up](locations.md).
Very likely a `username` and `appPassword` will be required
(you are restricted to public repositories and a very low rate limit otherwise).
Additionally, you need to configure your entity provider instance(s):
```yaml
# app-config.yaml
catalog:
providers:
bitbucketCloud:
yourProviderId: # identifies your ingested dataset
catalogPath: /catalog-info.yaml # default value
filters: # optional
projectKey: '^apis-.*$' # optional; RegExp
repoSlug: '^service-.*$' # optional; RegExp
workspace: workspace-name
```
> **Note:** It is possible but certainly not recommended to skip the provider ID level.
> If you do so, `default` will be used as provider ID.
- **catalogPath** _(optional)_:
Default: `/catalog-info.yaml`.
Path where to look for `catalog-info.yaml` files.
When started with `/`, it is an absolute path from the repo root.
It supports values as allowed by the `path` filter/modifier
[at Bitbucket Cloud's code search](https://confluence.atlassian.com/bitbucket/code-search-in-bitbucket-873876782.html#Search-Pathmodifier).
- **filters** _(optional)_:
- **projectKey** _(optional)_:
Regular expression used to filter results based on the project key.
- **repoSlug** _(optional)_:
Regular expression used to filter results based on the repo slug.
- **workspace**:
Name of your organization account/workspace.
If you want to add multiple workspaces, you need to add one provider config each.
## Alternative
_Deprecated!_ Please raise issues for use cases not covered by the entity provider.
[You can use the `BitbucketDiscoveryProcessor`.](../bitbucket/discovery.md#bitbucket-cloud)
@@ -0,0 +1,36 @@
---
id: locations
title: Bitbucket Cloud Locations
sidebar_label: Locations
# prettier-ignore
description: Integrating source code stored in Bitbucket Cloud into the Backstage catalog
---
The Bitbucket Cloud integration supports loading catalog entities from [bitbucket.org](https://bitbucket.org).
Entities can be added to
[static catalog configuration](../../features/software-catalog/configuration.md),
or registered with the
[catalog-import](https://github.com/backstage/backstage/tree/master/plugins/catalog-import)
plugin.
## Configuration
```yaml
integrations:
bitbucketCloud:
- username: ${BITBUCKET_CLOUD_USERNAME}
appPassword: ${BITBUCKET_CLOUD_PASSWORD}
```
> Note: A public Bitbucket Cloud provider is added automatically at startup for
> convenience, so you only need to list it if you want to supply credentials.
Directly under the `bitbucketCloud` key is a list of provider configurations, where
you can list the Bitbucket Cloud providers you want to fetch data from.
In the case of Bitbucket Cloud, you will have up to one entry.
This one entry will have the following elements:
- `username`: The Bitbucket Cloud username to use in API requests. If
neither a username nor token are supplied, anonymous access will be used.
- `appPassword`: The app password for the Bitbucket Cloud user.
+2
View File
@@ -50,3 +50,5 @@ of your backend.
+ GitLabDiscoveryProcessor.fromConfig(env.config, { logger: env.logger })
+ );
```
If you don't want create location object if file with component definition do not exists in project, you can set the `skipReposWithoutExactFileMatch` option. That can reduce count of request to gitlab with 404 status code.
+12 -13
View File
@@ -12,12 +12,12 @@ and the broader Backstage community.
The Backstage roadmap lays out both [“what's next”](#whats-next) and ["future
work"](#future-work). With "next" we mean features planned for release within
the ongoing quarter from January through March 2022. With "future" we mean
the ongoing quarter from April through June 2022. With "future" we mean
features on the radar, but not yet scheduled.
| [What's next](#whats-next) | [Future work](#future-work) |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| [Ease of onboarding](#ease-of-onboarding) <br/> [Search 1.0](#search-1.0) <br/> [TechDocs Addon framework](#techdocs-addon-framework) <br/> [Backend Services (initial)](#backend-services-initial) <br/> [Backstage Security Audit](#backstage-security-audit) <br/> [SIGs for contributors](#sigs-for-contributors) | Security Plan (and Strategy) <br/> Composable Homepage 1.0 <br/> GraphQL <br/> Telemetry <br/> Improved UX design |
| [What's next](#whats-next) | [Future work](#future-work) |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| [Ease of onboarding](#ease-of-onboarding) <br/> [Backstage Search 1.0](#search-1.0) <br/> [TechDocs Addon Framework](#techdocs-addon-framework) <br/> [Backend Services (initial)](#backend-services-initial) <br/> [Backstage Security Audit](#backstage-security-audit) <br/> [SIGs for contributors](#sigs-for-contributors) | Security Plan (and Strategy) <br/> Composable Homepage 1.0 <br/> GraphQL <br/> Telemetry <br/> Improved UX design |
The long-term roadmap (12 - 36 months) is not detailed in the public roadmap.
Third-party contributions are also not currently included in the roadmap. Let us
@@ -46,18 +46,17 @@ More iterations will be required in the following quarters, but this will be a
good improvement in the onboarding experience, especially for the benefit of new
adopters.
### Search 1.0
### Backstage Search 1.0
Fix the few remaining issues to get Backstage Search platform up to 1.0
([here](https://github.com/backstage/backstage/milestone/27) and
[here](https://github.com/backstage/backstage/milestone/28)).
Fix the few remaining issues to get Backstage Search platform up to 1.0. For more information, see the [Backstage Search documentation and roadmap page](https://backstage.io/docs/features/search/search-overview).
### TechDocs Addon framework
### TechDocs Addon Framework
Addons are TechDocs features that are added on top of the base docs-like-code
experience. An example would be a feature that showed comments on the page. We
plan to add an Addon framework and open source a selection of the Addons that we
use internally at Spotify. Further Addons can then be added by the Community.
Addons are TechDocs features that are added on top of the base docs-like-code experience. An example would be a feature that showed comments on the page. We plan to add an Addon framework and open source a selection of the Addons that we use internally at Spotify. We encourage the Backstage community to add further Addons.
For more information about the TechDocs Addon Framework, see the documentation page [here](https://backstage.io/docs/features/techdocs/addons)
For general information about TechDocs including roadmap, see [here](https://backstage.io/docs/features/techdocs/techdocs-overview).
### Backend Services (initial)
@@ -152,6 +152,6 @@ permission:
3. Now that youve made this change, you should find that the unregister entity menu option on the catalog entity page is disabled.
![Entity detail page showing disabled unregister entity context menu entry](../assets/permission/disabled-unregister-entity.png)
![Entity detail page showing disabled unregister entity context menu entry](../assets/permissions/disabled-unregister-entity.png)
Now that the framework is fully configured, you can craft a permission policy that works best for your organization by utilizing a provided authorization method or by [writing your own policy](./writing-a-policy.md)!
@@ -22,7 +22,7 @@ The permission framework was designed with a few key properties in mind:
- **Integrators** can author or configure policies that define which users can take certain actions upon which resources.
![](../assets/permission/permission-framework-overview.drawio.svg)
![](../assets/permissions/permission-framework-overview.drawio.svg)
1. The user triggers a request to perform some action. The request specifies the authorization details using the permission specified by the plugin (in this case, a resource read action).
@@ -105,7 +105,7 @@ The source code is available here:
Now if you start your application you should be able to reach the `/todo-list` page:
![Todo List plugin page](../../assets/permission/permission-todo-list-page.png)
![Todo List plugin page](../../assets/permissions/permission-todo-list-page.png)
---
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1,7 +1,7 @@
---
title: Adopters Community Sessions
date: May 18, 2022
category: Upcoming
category: Meetup
description: Adopters Community Session ✨. It's the monthly meetup where we all come together to listen to the latest maintainer updates, learn from each other about adopting, share exciting new demos or discuss any relevant topic like developer effectiveness, developer experience, developer portals, etc.
youtubeUrl: https://youtu.be/dEd1fl3wRv
youtubeImgUrl: https://backstage.io/img/b-sessions.png
+9
View File
@@ -0,0 +1,9 @@
---
title: Contributor Community Sessions
date: May 25, 2022
category: Meetup
description: Join the maintainers and contributors for the Contributor Community Sessions
youtubeUrl: https://youtu.be/evf_LV0KzIk
youtubeImgUrl: https://backstage.io/img/b-sessions.png
rsvpUrl: https://calendar.google.com/calendar/embed?src=c_qup9gbhn9sqpuao6trttd8mk5s@group.calendar.google.com
eventUrl: https://github.com/backstage/community/issues/46
@@ -0,0 +1,9 @@
---
title: Adopters Community Sessions
date: June 15, 2022
category: Upcoming
description: Adopters Community Session ✨. It's the monthly meetup where we all come together to listen to the latest maintainer updates, learn from each other about adopting, share exciting new demos or discuss any relevant topic like developer effectiveness, developer experience, developer portals, etc.
youtubeUrl: https://youtu.be/aKZnjnE5Wy8
youtubeImgUrl: https://backstage.io/img/b-sessions.png
rsvpUrl: https://calendar.google.com/calendar/embed?src=c_qup9gbhn9sqpuao6trttd8mk5s@group.calendar.google.com
eventUrl: https://github.com/backstage/community/issues/49
+9
View File
@@ -0,0 +1,9 @@
---
title: Contributor Community Sessions
date: June 22, 2022
category: Upcoming
description: Join the maintainers and contributors for the Contributor Community Sessions
youtubeUrl: https://youtu.be/aKZnjnE5Wy8
youtubeImgUrl: https://backstage.io/img/b-sessions.png
rsvpUrl: https://calendar.google.com/calendar/embed?src=c_qup9gbhn9sqpuao6trttd8mk5s@group.calendar.google.com
eventUrl: https://github.com/backstage/community/issues/49
+9
View File
@@ -0,0 +1,9 @@
---
title: Cloudify
author: Cloudify
authorUrl: https://cloudify.co/
category: Orchestration
description: Load blueprints from desired Cloudify Manager instance
documentation: https://github.com/Cloudify-PS/backstage-cloudify-plugin#readme
iconUrl: https://avatars.githubusercontent.com/u/6260555?s=200&v=4
npmPackageName: 'plugin-cloudify'
@@ -0,0 +1,9 @@
---
title: Github Pull Requests Board
author: DAZN
authorUrl: https://engineering.dazn.com
category: Source Control Mgmt
description: View all open GitHub pull requests owned by your team in Backstage.
documentation: https://github.com/backstage/backstage/tree/master/plugins/github-pull-requests-board
iconUrl: img/github-pull-requests-board-logo.svg
npmPackageName: '@backstage/plugin-github-pull-requests-board'
+2 -2
View File
@@ -34,7 +34,7 @@ const Background = props => {
<Block.Container style={{ justifyContent: 'flex-start' }}>
<Block.MediaFrame>
<iframe
src="https://www.youtube.com/embed/dEd1fl3wRvo"
src="https://www.youtube.com/embed/aKZnjnE5Wy8"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
@@ -45,7 +45,7 @@ const Background = props => {
<iframe
width="300"
height="500"
src="https://www.youtube.com/live_chat?v=dEd1fl3wRvo&embed_domain=backstage.io&dark_theme=1"
src="https://www.youtube.com/live_chat?v=aKZnjnE5Wy8&embed_domain=backstage.io&dark_theme=1"
></iframe>
</Block.MediaFrame>
</Block.Container>
+17 -9
View File
@@ -149,6 +149,14 @@
"integrations/bitbucket/discovery"
]
},
{
"type": "subcategory",
"label": "Bitbucket Cloud",
"ids": [
"integrations/bitbucketCloud/locations",
"integrations/bitbucketCloud/discovery"
]
},
{
"type": "subcategory",
"label": "Datadog",
@@ -260,19 +268,19 @@
"auth/glossary"
],
"Permissions": [
"permission/overview",
"permission/concepts",
"permission/getting-started",
"permission/writing-a-policy",
"permission/custom-rules",
"permissions/overview",
"permissions/concepts",
"permissions/getting-started",
"permissions/writing-a-policy",
"permissions/custom-rules",
{
"type": "subcategory",
"label": "Tutorial: using Permissions in your plugin",
"ids": [
"permission/plugin-authors/01-setup",
"permission/plugin-authors/02-adding-a-basic-permission-check",
"permission/plugin-authors/03-adding-a-resource-permission-check",
"permission/plugin-authors/04-authorizing-access-to-paginated-data"
"permissions/plugin-authors/01-setup",
"permissions/plugin-authors/02-adding-a-basic-permission-check",
"permissions/plugin-authors/03-adding-a-resource-permission-check",
"permissions/plugin-authors/04-authorizing-access-to-paginated-data"
]
}
],
@@ -0,0 +1,30 @@
<svg width="522" height="704" viewBox="0 0 522 704" fill="none" xmlns="http://www.w3.org/2000/svg">
<g filter="url(#filter0_d_421_4547)">
<path d="M311.25 0H62.25C28.0125 0 0.311257 30.9503 0.311257 68.7783L0 619.005C0 656.833 27.7012 687.783 61.9387 687.783H435.75C469.987 687.783 498 656.833 498 619.005V206.335L311.25 0ZM280.125 206.335V51.5838L420.187 206.335H280.125Z" fill="#F7FF1A"/>
</g>
<g filter="url(#filter1_d_421_4547)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M280.027 69.0546H56.0273C25.2273 69.0546 0.30735 96.8974 0.30735 130.927L0.0273438 625.911C0.0273438 659.941 24.9473 687.784 55.7473 687.784H392.027C422.827 687.784 448.027 659.941 448.027 625.911V254.673L280.027 69.0546ZM252.027 254.673V115.459L378.027 254.673H252.027ZM132.909 567.758C122.874 567.758 114.739 575.893 114.739 585.928C114.739 595.962 122.874 604.097 132.909 604.097C142.943 604.097 151.078 595.962 151.078 585.928C151.078 575.893 142.943 567.758 132.909 567.758ZM132.886 376.3C122.862 376.288 114.739 368.158 114.739 358.131C114.739 348.096 122.874 339.961 132.909 339.961C142.943 339.961 151.078 348.096 151.078 358.131C151.078 368.158 142.955 376.288 132.931 376.3L132.909 376.3L132.886 376.3ZM116.909 405.695C97.046 399.016 82.7391 380.244 82.7391 358.131C82.7391 330.423 105.201 307.961 132.909 307.961C160.616 307.961 183.078 330.423 183.078 358.131C183.078 380.244 168.771 399.016 148.909 405.695V538.363C168.771 545.042 183.078 563.814 183.078 585.928C183.078 613.635 160.616 636.097 132.909 636.097C105.201 636.097 82.7391 613.635 82.7391 585.928C82.7391 563.814 97.046 545.042 116.909 538.363V405.695ZM258.121 301.258C264.369 307.506 264.369 317.637 258.121 323.885L239.875 342.131H272.434C288.005 342.131 302.939 348.317 313.949 359.327C324.96 370.338 331.146 385.271 331.146 400.843V538.363C351.008 545.042 365.315 563.814 365.315 585.928C365.315 613.635 342.854 636.097 315.146 636.097C287.438 636.097 264.976 613.635 264.976 585.928C264.976 563.814 279.283 545.042 299.146 538.363V400.843C299.146 393.758 296.332 386.964 291.322 381.955C286.313 376.945 279.518 374.131 272.434 374.131H239.875L258.121 392.377C264.369 398.625 264.369 408.756 258.121 415.004C251.872 421.252 241.742 421.252 235.493 415.004L189.934 369.445C183.685 363.196 183.685 353.066 189.934 346.817L235.493 301.258C241.742 295.009 251.872 295.009 258.121 301.258ZM315.146 567.758C305.111 567.758 296.976 575.893 296.976 585.928C296.976 595.962 305.111 604.097 315.146 604.097C325.181 604.097 333.315 595.962 333.315 585.928C333.315 575.893 325.181 567.758 315.146 567.758Z" fill="black"/>
</g>
<defs>
<filter id="filter0_d_421_4547" x="0" y="0" width="522" height="703.783" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dx="16" dy="8"/>
<feGaussianBlur stdDeviation="4"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0.968627 0 0 0 0 1 0 0 0 0 0.101961 0 0 0 0.2 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_421_4547"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_421_4547" result="shape"/>
</filter>
<filter id="filter1_d_421_4547" x="0.0273438" y="69.0546" width="472" height="634.729" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dx="16" dy="8"/>
<feGaussianBlur stdDeviation="4"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_421_4547"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_421_4547" result="shape"/>
</filter>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

+3
View File
@@ -97,6 +97,9 @@ nav:
- Bitbucket:
- Locations: 'integrations/bitbucket/locations.md'
- Discovery: 'integrations/bitbucket/discovery.md'
- Bitbucket Cloud:
- Locations: 'integrations/bitbucketCloud/locations.md'
- Discovery: 'integrations/bitbucketCloud/discovery.md'
- Datadog:
- Installation: 'integrations/datadog-rum/installation.md'
- Gerrit:
+1 -1
View File
@@ -49,7 +49,7 @@
"@types/react": "^17",
"@types/react-dom": "^17"
},
"version": "1.2.0",
"version": "1.3.0-next.0",
"dependencies": {
"@manypkg/get-packages": "^1.1.3",
"@microsoft/api-documenter": "^7.17.11",
+7
View File
@@ -1,5 +1,12 @@
# @backstage/app-defaults
## 1.0.3-next.0
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.9.5-next.0
## 1.0.2
### Patch Changes
+3 -3
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/app-defaults",
"description": "Provides the default wiring of a Backstage App",
"version": "1.0.2",
"version": "1.0.3-next.0",
"private": false,
"publishConfig": {
"access": "public",
@@ -33,7 +33,7 @@
"start": "backstage-cli package start"
},
"dependencies": {
"@backstage/core-components": "^0.9.4",
"@backstage/core-components": "^0.9.5-next.0",
"@backstage/core-app-api": "^1.0.2",
"@backstage/core-plugin-api": "^1.0.2",
"@backstage/plugin-permission-react": "^0.4.1",
@@ -46,7 +46,7 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
"@backstage/cli": "^0.17.1",
"@backstage/cli": "^0.17.2-next.0",
"@backstage/test-utils": "^1.1.0",
"@testing-library/jest-dom": "^5.10.1",
"@testing-library/react": "^12.1.3",
+51
View File
@@ -1,5 +1,56 @@
# example-app
## 0.2.72-next.0
### Patch Changes
- Updated dependencies
- @backstage/plugin-kubernetes@0.6.6-next.0
- @backstage/plugin-cost-insights@0.11.28-next.0
- @backstage/plugin-catalog-react@1.1.1-next.0
- @backstage/plugin-catalog@1.2.1-next.0
- @backstage/cli@0.17.2-next.0
- @backstage/plugin-pagerduty@0.3.33-next.0
- @backstage/core-components@0.9.5-next.0
- @backstage/plugin-gcp-projects@0.3.25-next.0
- @backstage/plugin-techdocs-module-addons-contrib@1.0.1-next.0
- @backstage/plugin-scaffolder@1.3.0-next.0
- @backstage/plugin-techdocs@1.1.2-next.0
- @backstage/plugin-techdocs-react@1.0.1-next.0
- @backstage/plugin-airbrake@0.3.6-next.0
- @backstage/plugin-api-docs@0.8.6-next.0
- @backstage/plugin-azure-devops@0.1.22-next.0
- @backstage/plugin-badges@0.2.30-next.0
- @backstage/plugin-catalog-graph@0.2.18-next.0
- @backstage/plugin-catalog-import@0.8.9-next.0
- @backstage/plugin-circleci@0.3.6-next.0
- @backstage/plugin-cloudbuild@0.3.6-next.0
- @backstage/plugin-code-coverage@0.1.33-next.0
- @backstage/plugin-explore@0.3.37-next.0
- @backstage/plugin-github-actions@0.5.6-next.0
- @backstage/plugin-gocd@0.1.12-next.0
- @backstage/plugin-home@0.4.22-next.0
- @backstage/plugin-jenkins@0.7.5-next.0
- @backstage/plugin-kafka@0.3.6-next.0
- @backstage/plugin-lighthouse@0.3.6-next.0
- @backstage/plugin-newrelic-dashboard@0.1.14-next.0
- @backstage/plugin-org@0.5.6-next.0
- @backstage/plugin-rollbar@0.4.6-next.0
- @backstage/plugin-search@0.8.2-next.0
- @backstage/plugin-sentry@0.3.44-next.0
- @backstage/plugin-tech-insights@0.2.2-next.0
- @backstage/plugin-todo@0.2.8-next.0
- @backstage/app-defaults@1.0.3-next.0
- @backstage/integration-react@1.1.1-next.0
- @backstage/plugin-apache-airflow@0.1.14-next.0
- @backstage/plugin-gcalendar@0.3.2-next.0
- @backstage/plugin-graphiql@0.2.38-next.0
- @backstage/plugin-newrelic@0.3.24-next.0
- @backstage/plugin-shortcuts@0.2.7-next.0
- @backstage/plugin-stack-overflow@0.1.2-next.0
- @backstage/plugin-tech-radar@0.5.13-next.0
- @backstage/plugin-user-settings@0.4.5-next.0
## 0.2.71
### Patch Changes
+46 -46
View File
@@ -1,65 +1,65 @@
{
"name": "example-app",
"version": "0.2.71",
"version": "0.2.72-next.0",
"private": true,
"backstage": {
"role": "frontend"
},
"bundled": true,
"dependencies": {
"@backstage/app-defaults": "^1.0.2",
"@backstage/app-defaults": "^1.0.3-next.0",
"@backstage/catalog-model": "^1.0.2",
"@backstage/cli": "^0.17.1",
"@backstage/cli": "^0.17.2-next.0",
"@backstage/config": "^1.0.1",
"@backstage/core-app-api": "^1.0.2",
"@backstage/core-components": "^0.9.4",
"@backstage/core-components": "^0.9.5-next.0",
"@backstage/core-plugin-api": "^1.0.2",
"@backstage/integration-react": "^1.1.0",
"@backstage/plugin-airbrake": "^0.3.5",
"@backstage/plugin-api-docs": "^0.8.5",
"@backstage/plugin-azure-devops": "^0.1.21",
"@backstage/plugin-apache-airflow": "^0.1.13",
"@backstage/plugin-badges": "^0.2.29",
"@backstage/plugin-catalog": "^1.2.0",
"@backstage/integration-react": "^1.1.1-next.0",
"@backstage/plugin-airbrake": "^0.3.6-next.0",
"@backstage/plugin-api-docs": "^0.8.6-next.0",
"@backstage/plugin-azure-devops": "^0.1.22-next.0",
"@backstage/plugin-apache-airflow": "^0.1.14-next.0",
"@backstage/plugin-badges": "^0.2.30-next.0",
"@backstage/plugin-catalog": "^1.2.1-next.0",
"@backstage/plugin-catalog-common": "^1.0.2",
"@backstage/plugin-catalog-graph": "^0.2.17",
"@backstage/plugin-catalog-import": "^0.8.8",
"@backstage/plugin-catalog-react": "^1.1.0",
"@backstage/plugin-circleci": "^0.3.5",
"@backstage/plugin-cloudbuild": "^0.3.5",
"@backstage/plugin-code-coverage": "^0.1.32",
"@backstage/plugin-cost-insights": "^0.11.27",
"@backstage/plugin-explore": "^0.3.36",
"@backstage/plugin-gcalendar": "^0.3.1",
"@backstage/plugin-gcp-projects": "^0.3.24",
"@backstage/plugin-github-actions": "^0.5.5",
"@backstage/plugin-gocd": "^0.1.11",
"@backstage/plugin-graphiql": "^0.2.37",
"@backstage/plugin-home": "^0.4.21",
"@backstage/plugin-jenkins": "^0.7.4",
"@backstage/plugin-kafka": "^0.3.5",
"@backstage/plugin-kubernetes": "^0.6.5",
"@backstage/plugin-lighthouse": "^0.3.5",
"@backstage/plugin-newrelic": "^0.3.23",
"@backstage/plugin-newrelic-dashboard": "^0.1.13",
"@backstage/plugin-org": "^0.5.5",
"@backstage/plugin-pagerduty": "0.3.32",
"@backstage/plugin-catalog-graph": "^0.2.18-next.0",
"@backstage/plugin-catalog-import": "^0.8.9-next.0",
"@backstage/plugin-catalog-react": "^1.1.1-next.0",
"@backstage/plugin-circleci": "^0.3.6-next.0",
"@backstage/plugin-cloudbuild": "^0.3.6-next.0",
"@backstage/plugin-code-coverage": "^0.1.33-next.0",
"@backstage/plugin-cost-insights": "^0.11.28-next.0",
"@backstage/plugin-explore": "^0.3.37-next.0",
"@backstage/plugin-gcalendar": "^0.3.2-next.0",
"@backstage/plugin-gcp-projects": "^0.3.25-next.0",
"@backstage/plugin-github-actions": "^0.5.6-next.0",
"@backstage/plugin-gocd": "^0.1.12-next.0",
"@backstage/plugin-graphiql": "^0.2.38-next.0",
"@backstage/plugin-home": "^0.4.22-next.0",
"@backstage/plugin-jenkins": "^0.7.5-next.0",
"@backstage/plugin-kafka": "^0.3.6-next.0",
"@backstage/plugin-kubernetes": "^0.6.6-next.0",
"@backstage/plugin-lighthouse": "^0.3.6-next.0",
"@backstage/plugin-newrelic": "^0.3.24-next.0",
"@backstage/plugin-newrelic-dashboard": "^0.1.14-next.0",
"@backstage/plugin-org": "^0.5.6-next.0",
"@backstage/plugin-pagerduty": "0.3.33-next.0",
"@backstage/plugin-permission-react": "^0.4.1",
"@backstage/plugin-rollbar": "^0.4.5",
"@backstage/plugin-scaffolder": "^1.2.0",
"@backstage/plugin-search": "^0.8.1",
"@backstage/plugin-rollbar": "^0.4.6-next.0",
"@backstage/plugin-scaffolder": "^1.3.0-next.0",
"@backstage/plugin-search": "^0.8.2-next.0",
"@backstage/plugin-search-react": "^0.2.0",
"@backstage/plugin-search-common": "^0.3.4",
"@backstage/plugin-sentry": "^0.3.43",
"@backstage/plugin-shortcuts": "^0.2.6",
"@backstage/plugin-stack-overflow": "^0.1.1",
"@backstage/plugin-tech-radar": "^0.5.12",
"@backstage/plugin-techdocs": "^1.1.1",
"@backstage/plugin-techdocs-react": "^1.0.0",
"@backstage/plugin-techdocs-module-addons-contrib": "^1.0.0",
"@backstage/plugin-todo": "^0.2.7",
"@backstage/plugin-user-settings": "^0.4.4",
"@backstage/plugin-tech-insights": "^0.2.1",
"@backstage/plugin-sentry": "^0.3.44-next.0",
"@backstage/plugin-shortcuts": "^0.2.7-next.0",
"@backstage/plugin-stack-overflow": "^0.1.2-next.0",
"@backstage/plugin-tech-radar": "^0.5.13-next.0",
"@backstage/plugin-techdocs": "^1.1.2-next.0",
"@backstage/plugin-techdocs-react": "^1.0.1-next.0",
"@backstage/plugin-techdocs-module-addons-contrib": "^1.0.1-next.0",
"@backstage/plugin-todo": "^0.2.8-next.0",
"@backstage/plugin-user-settings": "^0.4.5-next.0",
"@backstage/plugin-tech-insights": "^0.2.2-next.0",
"@backstage/theme": "^0.2.15",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
+3 -3
View File
@@ -14,7 +14,7 @@
* limitations under the License.
*/
import React, { useContext, PropsWithChildren } from 'react';
import React, { PropsWithChildren } from 'react';
import { Link, makeStyles } from '@material-ui/core';
import HomeIcon from '@material-ui/icons/Home';
import ExtensionIcon from '@material-ui/icons/Extension';
@@ -39,13 +39,13 @@ import { Shortcuts } from '@backstage/plugin-shortcuts';
import {
Sidebar,
sidebarConfig,
SidebarContext,
SidebarDivider,
SidebarGroup,
SidebarItem,
SidebarPage,
SidebarScrollWrapper,
SidebarSpace,
useSidebarOpenState,
} from '@backstage/core-components';
import { MyGroupsSidebarItem } from '@backstage/plugin-org';
import GroupIcon from '@material-ui/icons/People';
@@ -68,7 +68,7 @@ const useSidebarLogoStyles = makeStyles({
const SidebarLogo = () => {
const classes = useSidebarLogoStyles();
const { isOpen } = useContext(SidebarContext);
const { isOpen } = useSidebarOpenState();
return (
<div className={classes.root}>
@@ -140,6 +140,12 @@ import { EntityGoCdContent, isGoCdAvailable } from '@backstage/plugin-gocd';
import React, { ReactNode, useMemo, useState } from 'react';
import { TechDocsAddons } from '@backstage/plugin-techdocs-react';
import {
TextSize,
ReportIssue,
} from '@backstage/plugin-techdocs-module-addons-contrib';
const customEntityFilterKind = ['Component', 'API', 'System'];
const EntityLayoutWrapper = (props: { children?: ReactNode }) => {
@@ -168,6 +174,15 @@ const EntityLayoutWrapper = (props: { children?: ReactNode }) => {
);
};
const techdocsContent = (
<EntityTechdocsContent>
<TechDocsAddons>
<TextSize />
<ReportIssue />
</TechDocsAddons>
</EntityTechdocsContent>
);
/**
* NOTE: This page is designed to work on small screens such as mobile devices.
* This is based on Material UI Grid. If breakpoints are used, each grid item must set the `xs` prop to a column size or to `true`,
@@ -398,7 +413,7 @@ const serviceEntityPage = (
</EntityLayout.Route>
<EntityLayout.Route path="/docs" title="Docs">
<EntityTechdocsContent />
{techdocsContent}
</EntityLayout.Route>
<EntityLayout.Route
@@ -465,8 +480,9 @@ const websiteEntityPage = (
</EntityLayout.Route>
<EntityLayout.Route path="/docs" title="Docs">
<EntityTechdocsContent />
{techdocsContent}
</EntityLayout.Route>
<EntityLayout.Route
if={isNewRelicDashboardAvailable}
path="/newrelic-dashboard"
@@ -512,7 +528,7 @@ const defaultEntityPage = (
</EntityLayout.Route>
<EntityLayout.Route path="/docs" title="Docs">
<EntityTechdocsContent />
{techdocsContent}
</EntityLayout.Route>
<EntityLayout.Route path="/todos" title="TODOs">
@@ -21,7 +21,7 @@ import {
Header,
Lifecycle,
Page,
SidebarPinStateContext,
useSidebarPinState,
} from '@backstage/core-components';
import { useApi } from '@backstage/core-plugin-api';
import { CatalogSearchResultListItem } from '@backstage/plugin-catalog';
@@ -40,7 +40,7 @@ import {
import { useSearch } from '@backstage/plugin-search-react';
import { TechDocsSearchResultListItem } from '@backstage/plugin-techdocs';
import { Grid, List, makeStyles, Paper, Theme } from '@material-ui/core';
import React, { useContext } from 'react';
import React from 'react';
const useStyles = makeStyles((theme: Theme) => ({
bar: {
@@ -59,7 +59,7 @@ const useStyles = makeStyles((theme: Theme) => ({
const SearchPage = () => {
const classes = useStyles();
const { isMobile } = useContext(SidebarPinStateContext);
const { isMobile } = useSidebarPinState();
const { types } = useSearch();
const catalogApi = useApi(catalogApiRef);
+21
View File
@@ -1,5 +1,26 @@
# @backstage/backend-common
## 0.13.6-next.0
### Patch Changes
- f72a6b8c62: Applied the `luxon` dependency fix from the `0.13.4` patch release.
- 5b22a8c97f: Applied the AWS S3 reading patch from the `0.13.5` patch release.
- Updated dependencies
- @backstage/integration@1.2.1-next.0
## 0.13.5
### Patch Changes
- 667d2ed6f8: Fix a bug in the URL Reading towards AWS S3 where it would hang indefinitely.
## 0.13.4
### Patch Changes
- 739be2b079: Fixed potential crash by bumping the `luxon` dependency to `^2.3.1`.
## 0.13.3
### Patch Changes
+4 -4
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-common",
"description": "Common functionality library for Backstage backends",
"version": "0.13.3",
"version": "0.13.6-next.0",
"main": "src/index.ts",
"types": "src/index.ts",
"private": false,
@@ -38,7 +38,7 @@
"@backstage/config": "^1.0.1",
"@backstage/config-loader": "^1.1.1",
"@backstage/errors": "^1.0.0",
"@backstage/integration": "^1.2.0",
"@backstage/integration": "^1.2.1-next.0",
"@backstage/types": "^1.0.0",
"@google-cloud/storage": "^5.8.0",
"@manypkg/get-packages": "^1.1.3",
@@ -91,8 +91,8 @@
}
},
"devDependencies": {
"@backstage/backend-test-utils": "^0.1.24",
"@backstage/cli": "^0.17.1",
"@backstage/backend-test-utils": "^0.1.25-next.0",
"@backstage/cli": "^0.17.2-next.0",
"@types/archiver": "^5.1.0",
"@types/base64-stream": "^1.0.2",
"@types/compression": "^1.7.0",
@@ -18,6 +18,9 @@ import { ConfigReader } from '@backstage/config';
import { JsonObject } from '@backstage/types';
import { getVoidLogger } from '../logging';
import { DefaultReadTreeResponseFactory } from './tree';
import { rest } from 'msw';
import { setupServer } from 'msw/node';
import { setupRequestMockHandlers } from '@backstage/backend-test-utils';
import { AwsS3UrlReader, parseUrl } from './AwsS3UrlReader';
import {
AwsS3Integration,
@@ -111,6 +114,9 @@ describe('parseUrl', () => {
});
describe('AwsS3UrlReader', () => {
const worker = setupServer();
setupRequestMockHandlers(worker);
const createReader = (config: JsonObject): UrlReaderPredicateTuple[] => {
return AwsS3UrlReader.factory({
config: new ConfigReader(config),
@@ -119,10 +125,6 @@ describe('AwsS3UrlReader', () => {
});
};
afterEach(() => {
AWSMock.restore();
});
it('creates a dummy reader without the awsS3 field', () => {
const entries = createReader({
integrations: {},
@@ -209,40 +211,34 @@ describe('AwsS3UrlReader', () => {
});
describe('read', () => {
let awsS3UrlReader: AwsS3UrlReader;
const [{ reader }] = createReader({
integrations: {
awsS3: [
{
host: 'amazonaws.com',
accessKeyId: 'fake-access-key',
secretAccessKey: 'fake-secret-key',
},
],
},
});
beforeAll(() => {
AWSMock.setSDKInstance(aws);
AWSMock.mock(
'S3',
'getObject',
Buffer.from(
require('fs').readFileSync(
path.resolve(
__dirname,
'__fixtures__/awsS3/awsS3-mock-object.yaml',
beforeEach(() => {
worker.use(
rest.get(
'https://test-bucket.s3.amazonaws.com/awsS3-mock-object.yaml',
(_, res, ctx) =>
res(
ctx.status(200),
ctx.set('ETag', '123abc'),
ctx.body('site_name: Test'),
),
),
),
);
const s3 = new aws.S3();
awsS3UrlReader = new AwsS3UrlReader(
new AwsS3Integration(
readAwsS3IntegrationConfig(
new ConfigReader({
host: 'amazonaws.com',
accessKeyId: 'fake-access-key',
secretAccessKey: 'fake-secret-key',
}),
),
),
{ s3, treeResponseFactory },
);
});
it('returns contents of an object in a bucket', async () => {
const response = await awsS3UrlReader.read(
const response = await reader.read(
'https://test-bucket.s3.us-east-2.amazonaws.com/awsS3-mock-object.yaml',
);
expect(response.toString().trim()).toBe('site_name: Test');
@@ -250,7 +246,7 @@ describe('AwsS3UrlReader', () => {
it('rejects unknown targets', async () => {
await expect(
awsS3UrlReader.read(
reader.read(
'https://test-bucket.s3.us-east-2.NOTamazonaws.com/file.yaml',
),
).rejects.toThrow(
@@ -262,59 +258,53 @@ describe('AwsS3UrlReader', () => {
});
describe('readUrl', () => {
let awsS3UrlReader: AwsS3UrlReader;
const [{ reader }] = createReader({
integrations: {
awsS3: [
{
host: 'amazonaws.com',
accessKeyId: 'fake-access-key',
secretAccessKey: 'fake-secret-key',
},
],
},
});
beforeEach(() => {
AWSMock.setSDKInstance(aws);
AWSMock.mock(
'S3',
'getObject',
Buffer.from(
require('fs').readFileSync(
path.resolve(
__dirname,
'__fixtures__/awsS3/awsS3-mock-object.yaml',
worker.use(
rest.get(
'https://test-bucket.s3.amazonaws.com/awsS3-mock-object.yaml',
(_, res, ctx) =>
res(
ctx.status(200),
ctx.set('ETag', '123abc'),
ctx.body('site_name: Test'),
),
),
),
);
const s3 = new aws.S3();
awsS3UrlReader = new AwsS3UrlReader(
new AwsS3Integration(
readAwsS3IntegrationConfig(
new ConfigReader({
host: 'amazonaws.com',
accessKeyId: 'fake-access-key',
secretAccessKey: 'fake-secret-key',
}),
),
),
{ s3, treeResponseFactory },
);
});
it('returns contents of an object in a bucket via buffer', async () => {
const response = await awsS3UrlReader.readUrl(
const response = await reader.readUrl!(
'https://test-bucket.s3.us-east-2.amazonaws.com/awsS3-mock-object.yaml',
);
expect(response.etag).toBe('123abc');
const buffer = await response.buffer();
expect(buffer.toString().trim()).toBe('site_name: Test');
});
it('returns contents of an object in a bucket via stream', async () => {
const response = await awsS3UrlReader.readUrl(
const response = await reader.readUrl!(
'https://test-bucket.s3.us-east-2.amazonaws.com/awsS3-mock-object.yaml',
);
expect(response.etag).toBe('123abc');
const fromStream = await getRawBody(response.stream!());
expect(fromStream.toString().trim()).toBe('site_name: Test');
});
it('rejects unknown targets', async () => {
await expect(
awsS3UrlReader.readUrl(
reader.readUrl!(
'https://test-bucket.s3.us-east-2.NOTamazonaws.com/file.yaml',
),
).rejects.toThrow(
@@ -325,45 +315,73 @@ describe('AwsS3UrlReader', () => {
});
});
describe('readUrl with etag', () => {
let awsS3UrlReader: AwsS3UrlReader;
describe('readUrl towards custom host', () => {
const [{ reader }] = createReader({
integrations: {
awsS3: [
{
host: 'localhost:4566',
accessKeyId: 'fake-access-key',
secretAccessKey: 'fake-secret-key',
endpoint: 'http://localhost:4566',
s3ForcePathStyle: true,
},
],
},
});
beforeAll(() => {
AWSMock.setSDKInstance(aws);
AWSMock.mock('S3', 'getObject', (_, callback) => {
const error: aws.AWSError = {
code: 'NotModified',
message: 'Not Modified',
statusCode: 304,
name: 'oops',
time: new Date('2019-01-01T00:00:00.000Z'),
};
callback(error, undefined);
});
const s3 = new aws.S3();
awsS3UrlReader = new AwsS3UrlReader(
new AwsS3Integration(
readAwsS3IntegrationConfig(
new ConfigReader({
host: 'amazonaws.com',
accessKeyId: 'fake-access-key',
secretAccessKey: 'fake-secret-key',
}),
),
beforeEach(() => {
worker.use(
rest.get(
'http://localhost:4566/test-bucket/awsS3-mock-object.yaml',
(_, res, ctx) =>
res(
ctx.status(200),
ctx.set('ETag', '123abc'),
ctx.body('site_name: Test'),
),
),
);
});
it('returns contents of an object in a bucket via buffer', async () => {
const response = await reader.readUrl!(
'http://localhost:4566/test-bucket/awsS3-mock-object.yaml',
);
expect(response.etag).toBe('123abc');
const buffer = await response.buffer();
expect(buffer.toString().trim()).toBe('site_name: Test');
});
});
describe('readUrl with etag', () => {
const [{ reader }] = createReader({
integrations: {
awsS3: [
{
host: 'amazonaws.com',
accessKeyId: 'fake-access-key',
secretAccessKey: 'fake-secret-key',
},
],
},
});
beforeEach(() => {
worker.use(
rest.get(
'https://test-bucket.s3.amazonaws.com/awsS3-mock-object.yaml',
(_, res, ctx) => res(ctx.status(304)),
),
{ s3, treeResponseFactory },
);
});
it('returns contents of an object in a bucket', async () => {
await expect(
awsS3UrlReader.readUrl(
reader.readUrl!(
'https://test-bucket.s3.us-east-2.amazonaws.com/awsS3-mock-object.yaml',
{
etag: 'abc123',
etag: '123abc',
},
),
).rejects.toThrow(NotModifiedError);
@@ -424,47 +442,4 @@ describe('AwsS3UrlReader', () => {
expect(body.toString().trim()).toBe('site_name: Test');
});
});
describe('readNonAwsHost', () => {
let awsS3UrlReader: AwsS3UrlReader;
beforeAll(() => {
AWSMock.setSDKInstance(aws);
AWSMock.mock(
'S3',
'getObject',
Buffer.from(
require('fs').readFileSync(
path.resolve(
__dirname,
'__fixtures__/awsS3/awsS3-mock-object.yaml',
),
),
),
);
const s3 = new aws.S3();
awsS3UrlReader = new AwsS3UrlReader(
new AwsS3Integration(
readAwsS3IntegrationConfig(
new ConfigReader({
host: 'localhost:4566',
accessKeyId: 'fake-access-key',
secretAccessKey: 'fake-secret-key',
endpoint: 'http://localhost:4566',
s3ForcePathStyle: true,
}),
),
),
{ s3, treeResponseFactory },
);
});
it('returns contents of an object in a bucket', async () => {
const response = await awsS3UrlReader.read(
'http://localhost:4566/test-bucket/awsS3-mock-object.yaml',
);
expect(response.toString().trim()).toBe('site_name: Test');
});
});
});
@@ -214,10 +214,38 @@ export class AwsS3UrlReader implements UrlReader {
const request = this.deps.s3.getObject(params);
options?.signal?.addEventListener('abort', () => request.abort());
const etag = (await request.promise()).ETag;
return ReadUrlResponseFactory.fromReadable(request.createReadStream(), {
etag,
// Since we're consuming the read stream we need to consume headers and errors via events.
const etagPromise = new Promise<string | undefined>((resolve, reject) => {
request.on('httpHeaders', (status, headers) => {
if (status < 400) {
if (status === 200) {
resolve(headers.etag);
} else if (status !== 304 /* not modified */) {
reject(
new Error(
`S3 readUrl request received unexpected status '${status}' in response`,
),
);
}
}
});
request.on('error', error => reject(error));
request.on('complete', () =>
reject(
new Error('S3 readUrl request completed without receiving headers'),
),
);
});
const stream = request.createReadStream();
stream.on('error', () => {
// The AWS SDK forwards request errors to the stream, so we need to
// ignore those errors here or the process will crash.
});
return ReadUrlResponseFactory.fromReadable(stream, {
etag: await etagPromise,
});
} catch (e) {
if (e.statusCode === 304) {
+8
View File
@@ -1,5 +1,13 @@
# @backstage/backend-tasks
## 0.3.2-next.0
### Patch Changes
- fde10d24f6: Allow tasks that fail to retry on a loop emitting a warning log every time it fails with the amount of attempts it has
- Updated dependencies
- @backstage/backend-common@0.13.6-next.0
## 0.3.1
### Patch Changes
+6 -6
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-tasks",
"description": "Common distributed task management library for Backstage backends",
"version": "0.3.1",
"version": "0.3.2-next.0",
"main": "src/index.ts",
"types": "src/index.ts",
"private": false,
@@ -33,12 +33,12 @@
"start": "backstage-cli package start"
},
"dependencies": {
"@backstage/backend-common": "^0.13.3",
"@backstage/backend-common": "^0.13.6-next.0",
"@backstage/config": "^1.0.1",
"@backstage/errors": "^1.0.0",
"@backstage/types": "^1.0.0",
"@types/luxon": "^2.0.4",
"cron": "^1.8.2",
"cron": "^2.0.0",
"knex": "^1.0.2",
"lodash": "^4.17.21",
"luxon": "^2.0.2",
@@ -48,9 +48,9 @@
"zod": "^3.9.5"
},
"devDependencies": {
"@backstage/backend-test-utils": "^0.1.24",
"@backstage/cli": "^0.17.1",
"@types/cron": "^1.7.3",
"@backstage/backend-test-utils": "^0.1.25-next.0",
"@backstage/cli": "^0.17.2-next.0",
"@types/cron": "^2.0.0",
"wait-for-expect": "^3.0.2"
},
"files": [
@@ -123,7 +123,7 @@ export class LocalTaskWorker {
let dt: number;
if (isCron) {
const nextRun = +new CronTime(settings.cadence).sendAt().toDate();
const nextRun = +new CronTime(settings.cadence).sendAt().toJSDate();
dt = nextRun - Date.now();
} else {
dt =
@@ -57,7 +57,12 @@ export class PluginTaskSchedulerImpl implements PluginTaskScheduler {
if (scope === 'global') {
const knex = await this.databaseFactory();
const worker = new TaskWorker(task.id, task.fn, knex, this.logger);
const worker = new TaskWorker(
task.id,
task.fn,
knex,
this.logger.child({ task: task.id }),
);
await worker.start(
{
@@ -119,6 +119,31 @@ describe('TaskWorker', () => {
60_000,
);
it.each(databases.eachSupportedId())(
'logs error when the task throws, %p',
async databaseId => {
const knex = await databases.init(databaseId);
await migrateBackendTasks(knex);
jest.spyOn(logger, 'error');
const fn = jest.fn().mockRejectedValue(new Error('failed'));
const settings: TaskSettingsV2 = {
version: 2,
initialDelayDuration: undefined,
cadence: '* * * * * *',
timeoutAfterDuration: Duration.fromMillis(60000).toISO(),
};
const checkFrequency = Duration.fromObject({ milliseconds: 100 });
const worker = new TaskWorker('task1', fn, knex, logger, checkFrequency);
worker.start(settings);
await waitForExpect(() => {
expect(logger.error).toBeCalled();
});
},
60_000,
);
it.each(databases.eachSupportedId())(
'runs tasks more than once even when the task throws, %p',
async databaseId => {
@@ -145,6 +145,7 @@ export class TaskWorker {
await this.fn(taskAbortController.signal);
taskAbortController.abort(); // releases resources
} catch (e) {
this.logger.error(e);
await this.tryReleaseTask(ticket, taskSettings);
return { result: 'failed' };
} finally {
@@ -174,8 +175,9 @@ export class TaskWorker {
} else if (isCron) {
const time = new CronTime(settings.cadence)
.sendAt()
.add({ seconds: -1 }) // immediately, if "* * * * * *"
.toISOString();
.minus({ seconds: 1 }) // immediately, if "* * * * * *"
.toUTC()
.toISO();
startAt = this.knex.client.config.client.includes('sqlite3')
? this.knex.raw('datetime(?)', [time])
: this.knex.raw(`?`, [time]);
@@ -278,7 +280,7 @@ export class TaskWorker {
let nextRun: Knex.Raw;
if (isCron) {
const time = new CronTime(settings.cadence).sendAt().toISOString();
const time = new CronTime(settings.cadence).sendAt().toUTC().toISO();
this.logger.debug(`task: ${this.taskId} will next occur around ${time}`);
nextRun = this.knex.client.config.client.includes('sqlite3')
? this.knex.raw('datetime(?)', [time])
+8
View File
@@ -1,5 +1,13 @@
# @backstage/backend-test-utils
## 0.1.25-next.0
### Patch Changes
- Updated dependencies
- @backstage/cli@0.17.2-next.0
- @backstage/backend-common@0.13.6-next.0
## 0.1.24
### Patch Changes
+4 -4
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-test-utils",
"description": "Test helpers library for Backstage backends",
"version": "0.1.24",
"version": "0.1.25-next.0",
"main": "src/index.ts",
"types": "src/index.ts",
"private": false,
@@ -34,8 +34,8 @@
"start": "backstage-cli package start"
},
"dependencies": {
"@backstage/backend-common": "^0.13.3",
"@backstage/cli": "^0.17.1",
"@backstage/backend-common": "^0.13.6-next.0",
"@backstage/cli": "^0.17.2-next.0",
"@backstage/config": "^1.0.1",
"better-sqlite3": "^7.5.0",
"knex": "^1.0.2",
@@ -46,7 +46,7 @@
"uuid": "^8.0.0"
},
"devDependencies": {
"@backstage/cli": "^0.17.1"
"@backstage/cli": "^0.17.2-next.0"
},
"files": [
"dist"
+36
View File
@@ -1,5 +1,41 @@
# example-backend
## 0.2.72-next.0
### Patch Changes
- Updated dependencies
- @backstage/backend-tasks@0.3.2-next.0
- @backstage/plugin-scaffolder-backend@1.3.0-next.0
- @backstage/plugin-kubernetes-backend@0.6.0-next.0
- @backstage/backend-common@0.13.6-next.0
- @backstage/plugin-auth-backend@0.14.1-next.0
- @backstage/integration@1.2.1-next.0
- @backstage/plugin-search-backend-node@0.6.2-next.0
- @backstage/plugin-catalog-backend@1.2.0-next.0
- @backstage/plugin-auth-node@0.2.2-next.0
- @backstage/plugin-techdocs-backend@1.1.2-next.0
- example-app@0.2.72-next.0
- @backstage/plugin-app-backend@0.3.33-next.0
- @backstage/plugin-azure-devops-backend@0.3.12-next.0
- @backstage/plugin-badges-backend@0.1.27-next.0
- @backstage/plugin-code-coverage-backend@0.1.31-next.0
- @backstage/plugin-graphql-backend@0.1.23-next.0
- @backstage/plugin-jenkins-backend@0.1.23-next.0
- @backstage/plugin-kafka-backend@0.2.26-next.0
- @backstage/plugin-permission-backend@0.5.8-next.0
- @backstage/plugin-permission-node@0.6.2-next.0
- @backstage/plugin-proxy-backend@0.2.27-next.0
- @backstage/plugin-rollbar-backend@0.1.30-next.0
- @backstage/plugin-scaffolder-backend-module-rails@0.4.1-next.0
- @backstage/plugin-search-backend@0.5.3-next.0
- @backstage/plugin-search-backend-module-elasticsearch@0.1.5-next.0
- @backstage/plugin-search-backend-module-pg@0.3.4-next.0
- @backstage/plugin-tech-insights-backend@0.4.1-next.0
- @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.17-next.0
- @backstage/plugin-tech-insights-node@0.3.1-next.0
- @backstage/plugin-todo-backend@0.1.30-next.0
## 0.2.71
### Patch Changes
+31 -31
View File
@@ -1,6 +1,6 @@
{
"name": "example-backend",
"version": "0.2.71",
"version": "0.2.72-next.0",
"main": "dist/index.cjs.js",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -26,39 +26,39 @@
"build-image": "docker build ../.. -f Dockerfile --tag example-backend"
},
"dependencies": {
"@backstage/backend-common": "^0.13.3",
"@backstage/backend-tasks": "^0.3.1",
"@backstage/backend-common": "^0.13.6-next.0",
"@backstage/backend-tasks": "^0.3.2-next.0",
"@backstage/catalog-client": "^1.0.2",
"@backstage/catalog-model": "^1.0.2",
"@backstage/config": "^1.0.1",
"@backstage/integration": "^1.2.0",
"@backstage/plugin-app-backend": "^0.3.32",
"@backstage/plugin-auth-backend": "^0.14.0",
"@backstage/plugin-auth-node": "^0.2.1",
"@backstage/plugin-azure-devops-backend": "^0.3.11",
"@backstage/plugin-badges-backend": "^0.1.26",
"@backstage/plugin-catalog-backend": "^1.1.2",
"@backstage/plugin-code-coverage-backend": "^0.1.30",
"@backstage/plugin-graphql-backend": "^0.1.22",
"@backstage/plugin-jenkins-backend": "^0.1.22",
"@backstage/plugin-kubernetes-backend": "^0.5.1",
"@backstage/plugin-kafka-backend": "^0.2.25",
"@backstage/plugin-permission-backend": "^0.5.7",
"@backstage/integration": "^1.2.1-next.0",
"@backstage/plugin-app-backend": "^0.3.33-next.0",
"@backstage/plugin-auth-backend": "^0.14.1-next.0",
"@backstage/plugin-auth-node": "^0.2.2-next.0",
"@backstage/plugin-azure-devops-backend": "^0.3.12-next.0",
"@backstage/plugin-badges-backend": "^0.1.27-next.0",
"@backstage/plugin-catalog-backend": "^1.2.0-next.0",
"@backstage/plugin-code-coverage-backend": "^0.1.31-next.0",
"@backstage/plugin-graphql-backend": "^0.1.23-next.0",
"@backstage/plugin-jenkins-backend": "^0.1.23-next.0",
"@backstage/plugin-kubernetes-backend": "^0.6.0-next.0",
"@backstage/plugin-kafka-backend": "^0.2.26-next.0",
"@backstage/plugin-permission-backend": "^0.5.8-next.0",
"@backstage/plugin-permission-common": "^0.6.1",
"@backstage/plugin-permission-node": "^0.6.1",
"@backstage/plugin-proxy-backend": "^0.2.26",
"@backstage/plugin-rollbar-backend": "^0.1.29",
"@backstage/plugin-scaffolder-backend": "^1.2.0",
"@backstage/plugin-scaffolder-backend-module-rails": "^0.4.0",
"@backstage/plugin-search-backend": "^0.5.2",
"@backstage/plugin-search-backend-node": "^0.6.1",
"@backstage/plugin-search-backend-module-elasticsearch": "^0.1.4",
"@backstage/plugin-search-backend-module-pg": "^0.3.3",
"@backstage/plugin-techdocs-backend": "^1.1.1",
"@backstage/plugin-tech-insights-backend": "^0.4.0",
"@backstage/plugin-tech-insights-node": "^0.3.0",
"@backstage/plugin-tech-insights-backend-module-jsonfc": "^0.1.16",
"@backstage/plugin-todo-backend": "^0.1.29",
"@backstage/plugin-permission-node": "^0.6.2-next.0",
"@backstage/plugin-proxy-backend": "^0.2.27-next.0",
"@backstage/plugin-rollbar-backend": "^0.1.30-next.0",
"@backstage/plugin-scaffolder-backend": "^1.3.0-next.0",
"@backstage/plugin-scaffolder-backend-module-rails": "^0.4.1-next.0",
"@backstage/plugin-search-backend": "^0.5.3-next.0",
"@backstage/plugin-search-backend-node": "^0.6.2-next.0",
"@backstage/plugin-search-backend-module-elasticsearch": "^0.1.5-next.0",
"@backstage/plugin-search-backend-module-pg": "^0.3.4-next.0",
"@backstage/plugin-techdocs-backend": "^1.1.2-next.0",
"@backstage/plugin-tech-insights-backend": "^0.4.1-next.0",
"@backstage/plugin-tech-insights-node": "^0.3.1-next.0",
"@backstage/plugin-tech-insights-backend-module-jsonfc": "^0.1.17-next.0",
"@backstage/plugin-todo-backend": "^0.1.30-next.0",
"@gitbeaker/node": "^35.1.0",
"@octokit/rest": "^18.5.3",
"better-sqlite3": "^7.5.0",
@@ -75,7 +75,7 @@
"winston": "^3.2.1"
},
"devDependencies": {
"@backstage/cli": "^0.17.1",
"@backstage/cli": "^0.17.2-next.0",
"@types/dockerode": "^3.3.0",
"@types/express": "^4.17.6",
"@types/express-serve-static-core": "^4.17.5",
+21 -1
View File
@@ -44,7 +44,27 @@ export default async function createPlugin(
// It is here for demo purposes only.
github: providers.github.create({
signIn: {
resolver: providers.github.resolvers.usernameMatchingUserEntityName(),
async resolver({ result: { fullProfile } }, ctx) {
const userId = fullProfile.username;
if (!userId) {
throw new Error(
`GitHub user profile does not contain a username`,
);
}
const userEntityRef = stringifyEntityRef({
kind: 'User',
name: userId,
namespace: DEFAULT_NAMESPACE,
});
return ctx.issueToken({
claims: {
sub: userEntityRef,
ent: [userEntityRef],
},
});
},
},
}),
gitlab: providers.gitlab.create({
+1 -1
View File
@@ -38,7 +38,7 @@
"cross-fetch": "^3.1.5"
},
"devDependencies": {
"@backstage/cli": "^0.17.1",
"@backstage/cli": "^0.17.2-next.0",
"@types/jest": "^26.0.7",
"msw": "^0.35.0"
},
+1 -1
View File
@@ -43,7 +43,7 @@
"uuid": "^8.0.0"
},
"devDependencies": {
"@backstage/cli": "^0.17.1",
"@backstage/cli": "^0.17.2-next.0",
"@types/jest": "^26.0.7",
"@types/json-schema": "^7.0.5",
"@types/lodash": "^4.14.151",
@@ -43,6 +43,11 @@
},
"target": {
"$ref": "#reference"
},
"targetRef": {
"type": "string",
"minLength": 1,
"description": "The entity ref of the target of this relation."
}
}
},

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