Merge branch 'backstage:master' into reconfigure
@@ -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
|
||||
@@ -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>
|
||||
...
|
||||
);
|
||||
```
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-auth-backend': patch
|
||||
---
|
||||
|
||||
Increased key field size for signing_keys table to account for larger signature keys
|
||||
@@ -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
|
||||
```
|
||||
@@ -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();
|
||||
|
||||
// ...
|
||||
};
|
||||
```
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-scaffolder-backend': minor
|
||||
---
|
||||
|
||||
A new scaffolder action has been added: `gerrit:publish`
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-kubernetes-backend': patch
|
||||
---
|
||||
|
||||
cache and refresh Azure tokens to avoid excessive calls to Azure Identity
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-pagerduty': patch
|
||||
---
|
||||
|
||||
Fix alert that was not showing after creating an incident.
|
||||
@@ -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.
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-cost-insights': patch
|
||||
---
|
||||
|
||||
Fixed css to show large tooltips on cost overview graph
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/core-components': patch
|
||||
---
|
||||
|
||||
Fix EntityPage tab scrolling overflow bug on Firefox
|
||||
@@ -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
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-catalog-backend-module-github': patch
|
||||
---
|
||||
|
||||
Adds an edit URL to the GitHub Teams Group entities.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-github-pull-requests-board': minor
|
||||
---
|
||||
|
||||
Add Github Pull Requests board plugin
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/backend-common': patch
|
||||
---
|
||||
|
||||
Applied the AWS S3 reading patch from the `0.13.5` patch release.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/integration': patch
|
||||
---
|
||||
|
||||
Gerrit Integration: Handle absolute paths in `resolveUrl` properly.
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-jenkins-backend': patch
|
||||
---
|
||||
|
||||
bug fix: provide backstage token for rebuild api call
|
||||
@@ -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,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
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/cli': patch
|
||||
---
|
||||
|
||||
Updated dependency `run-script-webpack-plugin` to `^0.0.14`.
|
||||
@@ -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`.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-search-backend-module-elasticsearch': patch
|
||||
---
|
||||
|
||||
Use more precise matching for query filters
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/catalog-model': patch
|
||||
---
|
||||
|
||||
Added targetRef to common.schema.json to match the Typescript type
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/cli': patch
|
||||
---
|
||||
|
||||
Added console warning to frontend start when the `app.baseUrl` and `backend.baseUrl` are identical
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-graphiql': patch
|
||||
---
|
||||
|
||||
Fix for custom headers not being included in requests.
|
||||
@@ -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`.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-techdocs': patch
|
||||
---
|
||||
|
||||
Convert `sanitizeDOM` transformer to hook as part of code readability improvements in dom file.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-scaffolder': minor
|
||||
---
|
||||
|
||||
Gerrit Integration: Implemented a `RepoUrlPicker` for Gerrit.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-auth-backend': patch
|
||||
---
|
||||
|
||||
Fix improper binding of 'this' in ALB Auth provider
|
||||
@@ -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.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-catalog-import': patch
|
||||
---
|
||||
|
||||
Updated catalog import page text so they go in the correct hierarchy order
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-catalog-backend-module-bitbucket': minor
|
||||
---
|
||||
|
||||
Integrate `@backstage/plugin-bitbucket-cloud-common` as replacement for the `BitbucketCloudClient`.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-catalog-backend-module-ldap': minor
|
||||
---
|
||||
|
||||
Added the possibility to pass TLS configuration to ldap connection
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/backend-tasks': patch
|
||||
---
|
||||
|
||||
Add error logging when a background task throws an error rather than silently swallowing it.
|
||||
@@ -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.
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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 |
@@ -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 I’ve performed a search.
|
||||
- As a software engineer I should be able to hide the filters if I don’t 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 I’ve performed a search.
|
||||
- As a software engineer I should be able to hide the filters if I don’t 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.
|
||||
|
||||
@@ -21,14 +21,44 @@ Today, it is one of the core products in Spotify’s 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
|
||||
|
||||
@@ -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!
|
||||
|
||||
|
||||
@@ -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.
|
||||
@@ -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,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 you’ve made this change, you should find that the unregister entity menu option on the catalog entity page is disabled.
|
||||
|
||||

|
||||

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

|
||||

|
||||
|
||||
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:
|
||||
|
||||

|
||||

|
||||
|
||||
---
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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'
|
||||
@@ -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>
|
||||
|
||||
@@ -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 |
@@ -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:
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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({
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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."
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||