Merge branch 'backstage:master' into daan/sort-flags

This commit is contained in:
daan
2023-05-02 09:40:59 -07:00
committed by GitHub
639 changed files with 18724 additions and 4027 deletions
+10
View File
@@ -0,0 +1,10 @@
---
'@backstage/plugin-tech-insights': patch
---
Added the possibility to customize the check description in the scorecard component.
- The `CheckResultRenderer` type now exposes an optional `description` method that allows to overwrite the description with a different string or a React component for a provided check result.
Until now only the `BooleanCheck` element could be overridden, but from now on it's also possible to override the description for a check.
As an example, the description could change depending on the check result. Refer to the [README](https://github.com/backstage/backstage/blob/master/plugins/tech-insights/README.md#adding-custom-rendering-components) file for more details
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/backend-test-utils': patch
---
Added `POSTGRES_11` and `POSTGRES_12` as supported test database IDs.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-scaffolder': patch
---
Fix case GitLab workspace is a nested subgroup
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-github-pull-requests-board': patch
---
The `EntityTeamPullRequestsContent` and `EntityTeamPullRequestsCard` support the ability to view the labels/tags added to each PR
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-search': patch
---
Fixed 404 Error when fetching search results due to URL encoding changes
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/backend-common': patch
---
Remove the direct dependency on deprecated "request" library
+7
View File
@@ -0,0 +1,7 @@
---
'@backstage/plugin-kubernetes-backend': minor
---
Allow fetching pod metrics limited by a `labelSelector`.
This is used by the Kubernetes tab on a components' page and leads to much smaller responses being received from Kubernetes, especially with larger Kubernetes clusters.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-explore': patch
---
Make sure that the first support button row does not break across lines
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/create-app': patch
---
Bumped create-app version.
+10
View File
@@ -0,0 +1,10 @@
---
'@backstage/app-defaults': patch
---
Added a System Icon for resource entities.
This can be obtained using:
```ts
useApp().getSystemIcon('kind:resource');
```
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/backend-openapi-utils': patch
---
Adjusted README accordingly after the generated output now has a `.generated.ts` extension
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-kubernetes': patch
---
Omit managed fields in the Kubernetes resource YAML display.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend': patch
---
Adjusted the OpenAPI schema file name according to the new structure
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/integration': patch
---
Fixed a bug where the wrong credentials would be selected when using multiple GitHub app integrations.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/core-app-api': minor
---
The analytics' `navigate` event will now include the route parameters as attributes of the navigate event
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/repo-tools': minor
---
Generated OpenAPI files now have a `.generated.ts` file name and a warning header at the top, to highlight that they should not be edited by hand.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-jenkins-backend': patch
---
Fix handling of slashes in branch names
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-graph': patch
---
Expose all `EntityRelationsGraphProps` to Catalog Graph Page
+10
View File
@@ -0,0 +1,10 @@
---
'@backstage/plugin-search-react': minor
'@backstage/plugin-search': minor
---
Add close button & improve search input.
MUI's Paper wrapping the SearchBar in the SearchPage was removed, we recommend users update their apps accordingly.
SearchBarBase's TextField's label support added & aria-label uses label string if present, tests relying on the default placeholder value should still work unless custom placeholder was given.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-analytics-module-ga4': minor
---
Plugin provides Backstage Analytics API for Google Analytics 4. Once installed and configured, analytics events will be sent to GA4 as your users navigate and use your Backstage instance
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-home': patch
---
Bump to using the later v5 versions of `@rjsf/*`
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend-module-github': patch
---
Fixed bug in queryWithPaging that caused secondary rate limit errors in GitHub with organizations having more than 1000 repositories. This change makes one request per second to avoid concurrency issues.
+33
View File
@@ -0,0 +1,33 @@
---
'@backstage/plugin-kubernetes': minor
---
Added Pod logs components for Kubernetes plugin
**BREAKING**: `kubernetesProxyApi` for custom plugins built with components from the Kubernetes plugin apis, `kubernetesProxyApi` should be added to the plugin's API list.
```
...
export const kubernetesPlugin = createPlugin({
id: 'kubernetes',
apis: [
...
createApiFactory({
api: kubernetesProxyApiRef,
deps: {
kubernetesApi: kubernetesApiRef,
},
factory: ({ kubernetesApi }) =>
new KubernetesProxyClient({
kubernetesApi,
}),
}),
```
**BREAKING**: `KubernetesDrawer` is now called `KubernetesStructuredMetadataTableDrawer` so that we can do more than just show `StructuredMetadataTable`
`import { KubernetesDrawer } from "@backstage/plugin-kubernetes"`
should now be:
`import { KubernetesStructuredMetadataTableDrawer } from "@backstage/plugin-kubernetes"`
+48 -2
View File
@@ -219,7 +219,53 @@
"@backstage/plugin-user-settings-backend": "0.1.8",
"@backstage/plugin-vault": "0.1.11",
"@backstage/plugin-vault-backend": "0.3.0",
"@backstage/plugin-xcmetrics": "0.2.37"
"@backstage/plugin-xcmetrics": "0.2.37",
"@backstage/plugin-analytics-module-ga4": "0.0.0"
},
"changesets": []
"changesets": [
"afraid-shirts-train",
"backend-like-a-tattoo",
"beige-tigers-matter",
"brown-eyes-yell",
"calm-wolves-taste",
"chilly-fireants-type",
"clean-lobsters-brake",
"cold-drinks-exercise",
"create-app-1682437922",
"curvy-months-appear",
"dry-boats-sniff",
"dull-wombats-stare",
"eighty-olives-live",
"fifty-laws-count",
"five-tigers-whisper",
"fresh-moons-unite",
"funny-trains-sniff",
"good-lions-approve",
"green-cheetahs-cover",
"healthy-ladybugs-chew",
"honest-countries-deny",
"hungry-foxes-divide",
"lazy-keys-work",
"mighty-bears-glow",
"mighty-cows-greet",
"modern-pumpkins-join",
"moody-lizards-beam",
"nine-ties-smoke",
"olive-turkeys-switch",
"polite-dingos-train",
"pretty-gifts-greet",
"quick-flies-guess",
"red-cheetahs-invite",
"rotten-chefs-jog",
"serious-hornets-remember",
"six-mails-shout",
"slimy-turkeys-return",
"soft-readers-exist",
"swift-fishes-run",
"tame-games-rule",
"thick-parents-pump",
"tough-moles-whisper",
"unlucky-plants-give",
"warm-lamps-tease"
]
}
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/core-app-api': patch
---
Added `FrontendHostDiscovery` for config driven discovery implementation
+6
View File
@@ -0,0 +1,6 @@
---
'@backstage/plugin-octopus-deploy': minor
---
Added support for Octopus Deploy spaces. The octopus.com/project-id annotation can now (optionally) be prefixed by a space identifier, for example. Spaces-1/Projects-102.
Also note that some of this plugins exported API's have changed to accommodate this change, changing from separate arguments to a single object.
+10
View File
@@ -0,0 +1,10 @@
---
'@backstage/plugin-scaffolder-react': patch
'@backstage/plugin-scaffolder': patch
---
Improvements to the `scaffolder/next` buttons UX:
- Added padding around the "Create" button in the `Stepper` component
- Added a button bar that includes the "Cancel" and "Start Over" buttons to the `OngoingTask` component. The state of these buttons match their existing counter parts in the Context Menu
- Added a "Show Button Bar"/"Hide Button Bar" item to the `ContextMenu` component
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-circleci': patch
---
Hide empty time field data for queued builds which haven't started yet
+22
View File
@@ -0,0 +1,22 @@
---
'@backstage/plugin-permission-node': patch
---
`createPermissionIntegrationRouter` now accepts rules and permissions for multiple resource types. Example:
```typescript
createPermissionIntegrationRouter({
resources: [
{
resourceType: 'resourceType-1',
permissions: permissionsResourceType1,
rules: rulesResourceType1,
},
{
resourceType: 'resourceType-2',
permissions: permissionsResourceType2,
rules: rulesResourceType2,
},
],
});
```
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/backend-common': patch
---
Added `HostDiscovery` to supersede deprecated `SingleHostDiscovery` (deprecated due to name)
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-scaffolder-backend': patch
---
Bump minimum required version of `vm2` to be 3.9.17
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/create-app': patch
---
Pin some octokit dependencies to avoid failing typescript build under `tsc:full`
+6
View File
@@ -0,0 +1,6 @@
---
'@backstage/plugin-scaffolder-backend': patch
'@backstage/plugin-scaffolder-node': patch
---
Update typing for `RouterOptions::actions` and `ScaffolderActionsExtensionPoint::addActions` to allow any kind of action being assigned to it.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-tech-radar': patch
---
Added the ability to display a timeline to each entry in the details box
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/core-components': patch
---
Start capturing sidebar click events in analytics by default.
+2 -6
View File
@@ -8,10 +8,6 @@ jobs:
deploy-microsite-and-storybook:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [16.x]
env:
CI: true
NODE_OPTIONS: --max-old-space-size=8192
@@ -20,10 +16,10 @@ jobs:
steps:
- uses: actions/checkout@v3
- name: use node.js ${{ matrix.node-version }}
- name: use node.js 18.x
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
node-version: 18.x
registry-url: https://registry.npmjs.org/ # Needed for auth
# We avoid caching in this workflow, as we're running an install of both the top-level
+3 -7
View File
@@ -9,10 +9,6 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [16.x]
env:
CI: true
NODE_OPTIONS: --max-old-space-size=4096
@@ -20,15 +16,15 @@ jobs:
steps:
- uses: actions/checkout@v3
- name: use node.js ${{ matrix.node-version }}
- name: use node.js 18.x
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
node-version: 18.x
registry-url: https://registry.npmjs.org/ # Needed for auth
- name: yarn install
uses: backstage/actions/yarn-install@v0.6.3
with:
cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }}
cache-prefix: ${{ runner.os }}-v18.x
# No verification done here, only build & publish. If the master branch
# is broken we will see that from those builds, but we still want to push nightly
@@ -10,22 +10,18 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [16.x]
steps:
- uses: actions/checkout@v3
- name: use node.js ${{ matrix.node-version }}
- name: use node.js 18.x
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
node-version: 18.x
registry-url: https://registry.npmjs.org/ # Needed for auth
- name: yarn install
uses: backstage/actions/yarn-install@v0.6.3
with:
cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }}
cache-prefix: ${{ runner.os }}-v18.x
- name: Create Snyk report
uses: snyk/actions/node@master
@@ -8,10 +8,14 @@ on:
paths-ignore:
- 'lighthouserc.js'
- '.github/workflows/verify_accessibility_core.yml'
- 'plugins/catalog/**'
- 'plugins/techdocs/**'
- 'plugins/scaffolder/**'
- 'plugins/search/**'
- 'plugins/catalog/src/**'
- 'plugins/catalog-react/src/**'
- 'plugins/techdocs/src/**'
- 'plugins/techdocs-react/src/**'
- 'plugins/scaffolder/src/**'
- 'plugins/scaffolder-react/src/**'
- 'plugins/search/src/**'
- 'plugins/search-react/src/**'
jobs:
noop:
+8 -5
View File
@@ -6,11 +6,14 @@ on:
paths:
- 'lighthouserc.js'
- '.github/workflows/verify_accessibility_core.yml'
- 'plugins/catalog/**'
- 'plugins/techdocs/**'
- 'plugins/scaffolder/**'
- 'plugins/search/**'
- 'plugins/catalog/src/**'
- 'plugins/catalog-react/src/**'
- 'plugins/techdocs/src/**'
- 'plugins/techdocs-react/src/**'
- 'plugins/scaffolder/src/**'
- 'plugins/scaffolder-react/src/**'
- 'plugins/search/src/**'
- 'plugins/search-react/src/**'
jobs:
lhci:
name: Accessibility
@@ -13,10 +13,6 @@ jobs:
noop:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [16.x]
name: Microsite
steps:
- run: echo NOOP
+2 -6
View File
@@ -11,10 +11,6 @@ jobs:
build-microsite:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [16.x]
env:
CI: true
NODE_OPTIONS: --max-old-space-size=8192
@@ -24,10 +20,10 @@ jobs:
steps:
- uses: actions/checkout@v3
- name: use node.js ${{ matrix.node-version }}
- name: use node.js 18.x
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
node-version: 18.x
# Skip caching of microsite dependencies, it keeps the global cache size
# smaller, which make Windows builds a lot faster for the rest of the project.
@@ -22,10 +22,6 @@ jobs:
noop:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [16.x]
name: Storybook
steps:
- run: echo NOOP
+1
View File
@@ -243,3 +243,4 @@ _You can do this by using the [Adopter form](https://info.backstage.spotify.com/
| [Chartboost](https://www.chartboost.com)| [@brucearctor](https://github.com/brucearctor), [@ArtemChekunov](https://github.com/ArtemChekunov) | We are building our internal develper portal on top of Backstage.|
| [Quantum Metric](https://www.quantummetric.com/) | [Eric Irwin](https://www.linkedin.com/in/ericirwin1124/) | Backstage is used within our Developer Experience Platform (DXP) in order to increase self-service, standardization and discoverability across our Engineering teams. |
| [VodafoneZiggo](https://www.vodafoneziggo.nl/) | [Peter Macdonald](https://github.com/Parsifal-M) | We use Backstage as our go-to platform for managing our internal tools and services. With Backstage, we can easily discover and access all the services we need to do our work, whether it's deploying code, managing infrastructure, or accessing documentation. We appreciate the standardized, consistent interface and the ability to easily create custom plugins to integrate with our existing workflows. Overall, Backstage is streamlining our internal operations and helps us work more efficiently as a team. |
| [Volvo Cars](https://www.volvocars.com) | [Martin Wänerskär](https://github.com/martin-wanerskar) | Internal developer portal with intent to unify infrastructure tooling, services, and developer documentation under a single, easy-to-use interface. |
+10 -5
View File
@@ -37,8 +37,11 @@ app:
We can access the `baseUrl` using `config.getString('app.baseUrl')`. Because of
this syntax, configuration keys are not allowed to contain dots. In fact,
configuration keys are validated using the following RegEx:
`/^[a-z][a-z0-9]*(?:[-_][a-z][a-z0-9]*)*$/i`.
configuration keys are validated using the following regular expression:
`/^[a-z][a-z0-9]*(?:[-_][a-z][a-z0-9]*)*$/i`. This basically means that keys
must only contain the letters `a` through `z` and digits, in groups separated by
dashes or underscores. Additionally, the very first character of each such group
must be a letter, not a digit.
Another option of accessing the `baseUrl` value is to create a sub-view of the
configuration, `config.getConfig('app').getString('baseUrl')`. When reading out
@@ -62,8 +65,9 @@ each sub-view to be handled individually.
```ts
for (const itemKey of config.keys('my-plugin.items')) {
const itemConfig = config.getConfig(`my-plugin.items`).getConfig(key);
const item = createItemFromConfig(itemConfig);
const itemConfig = config.getConfig(`my-plugin.items`).getConfig(itemKey);
const title = itemConfig.getString('title');
// ...
}
```
@@ -76,7 +80,8 @@ much more detailed and relevant error messages. For example, if
`itemConfig.getString('title')` fails in the above example because a boolean was
supplied, the user will receive an error message with the full path, e.g.
`my-plugin.items.b.title`, as well as the name of the config file with the bad
value.
value. Conversely, if you try to access missing fields in raw JSON, you tend to
end up with very technical and hard-to-understand type errors from javascript.
Note that no matter what method is used for reading out nested config, the same
merging rules apply. You will always get the same value for any way of accessing
@@ -0,0 +1,175 @@
---
id: authorizing-parameters-steps-and-actions
title: 'Authorizing parameters, steps and actions'
description: How to authorize part of a template
---
The scaffolder plugin integrates with the Backstage [permission framework](../../permissions/overview.md), which allows you to control access to certain parameters and steps in your templates based on the user executing the template.
### Authorizing parameters and steps
To mark specific parameters or steps as requiring permission, add the `backstage:permissions` property to the parameter or step with one or more tags. For example:
```yaml
apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata:
name: my_custom_template
parameters:
- title: Provide some simple information
properties:
title:
title: Title
type: string
- title: Extra information
properties:
description:
title: Description
type: string
backstage:permissions:
tags:
- secret
steps:
- id: step1
name: First log
action: debug:log
input:
message: hello
- id: step2
name: Log message
action: debug:log
input:
message: hello
backstage:permissions:
tags:
- secret
```
In this example, the `description` parameter and the `step2` step are marked with the `secret` tag.
To conditionally authorize parameters and steps based on the user executing the template, [edit your permission policy](../../permissions/writing-a-policy.md), by targeting `templateParameterReadPermission` and `templateStepReadPermission` permissions, which are provided by the scaffolder plugin. For example:
```ts title="packages/backend/src/plugins/permission.ts"
/* highlight-add-start */
import {
templateParameterReadPermission,
templateStepReadPermission,
} from '@backstage/plugin-scaffolder-common/alpha';
import {
createScaffolderActionConditionalDecision,
scaffolderTemplateConditions,
} from '@backstage/plugin-scaffolder-backend/alpha';
/* highlight-add-end */
class ExamplePermissionPolicy implements PermissionPolicy {
async handle(
request: PolicyQuery,
user?: BackstageIdentityResponse,
): Promise<PolicyDecision> {
/* highlight-add-start */
if (
isPermission(request.permission, templateParameterReadPermission) ||
isPermission(request.permission, templateStepReadPermission)
) {
if (user?.identity.userEntityRef === 'user:default/spiderman')
return createScaffolderTemplateConditionalDecision(request.permission, {
not: scaffolderTemplateConditions.hasTag({ tag: 'secret' }),
});
}
/* highlight-add-end */
return {
result: AuthorizeResult.ALLOW,
};
}
}
```
In this example, the user `spiderman` is not authorized to read parameters or steps marked with the `secret` tag.
By combining this feature with restricting the ingestion of templates in the Catalog as recommended in our threat model, you can create a solid system to restrict certain actions.
### Authorizing actions
Similar to parameters and steps, the scaffolder plugin exposes permissions to restrict access to certain actions. This can be useful if you want to secure your templates.
To restrict access to a particular action, you can modify your permission policy as follows:
```ts title="packages/backend/src/plugins/permission.ts"
/* highlight-add-start */
import { actionExecutePermission } from '@backstage/plugin-scaffolder-common/alpha';
import {
createScaffolderActionConditionalDecision,
scaffolderActionConditions,
} from '@backstage/plugin-scaffolder-backend/alpha';
/* highlight-add-end */
class ExamplePermissionPolicy implements PermissionPolicy {
async handle(
request: PolicyQuery,
user?: BackstageIdentityResponse,
): Promise<PolicyDecision> {
/* highlight-add-start */
if (isPermission(request.permission, actionExecutePermission)) {
if (user?.identity.userEntityRef === 'user:default/spiderman') {
return createScaffolderActionConditionalDecision(request.permission, {
not: scaffolderActionConditions.hasActionId({
actionId: 'debug:log',
}),
});
}
}
/* highlight-add-end */
return {
result: AuthorizeResult.ALLOW,
};
}
}
```
With this permission policy, the user `spiderman` won't be able to execute the debug:log action.
You can also restrict the input provided to the action by combining multiple rules.
In the example below, `spiderman` won't be able to execute debug:log when passing `{ "message": "not-this!" }` as action input:
```ts title="packages/backend/src/plugins/permission.ts"
/* highlight-add-start */
import { actionExecutePermission } from '@backstage/plugin-scaffolder-common/alpha';
import {
createScaffolderActionConditionalDecision,
scaffolderActionConditions,
} from '@backstage/plugin-scaffolder-backend/alpha';
/* highlight-add-end */
class ExamplePermissionPolicy implements PermissionPolicy {
async handle(
request: PolicyQuery,
user?: BackstageIdentityResponse,
): Promise<PolicyDecision> {
/* highlight-add-start */
if (isPermission(request.permission, actionExecutePermission)) {
if (user?.identity.userEntityRef === 'user:default/spiderman') {
return createScaffolderActionConditionalDecision(request.permission, {
not: {
allOf: [
scaffolderActionConditions.hasActionId({ actionId: 'debug:log' }),
scaffolderActionConditions.hasProperty({
key: 'message',
value: 'not-this!',
}),
],
},
});
}
}
/* highlight-add-end */
return {
result: AuthorizeResult.ALLOW,
};
}
}
```
Although the rules exported by the scaffolder are simple, combining them can help you achieve more complex cases.
+9 -14
View File
@@ -400,15 +400,10 @@ As you've seen there are many ways that you can customize your Backstage app. Th
For this example we'll show you how you can expand the sidebar with a sub-menu:
1. Open the `Root.tsx` file located in `packages/app/src/components/Root` as this is where the sidebar code lives
2. Then we want to add the following imports for the icons:
2. Then we want to add the following import for `useApp`:
```tsx title="packages/app/src/components/Root/Root.tsx"
import ApiIcon from '@material-ui/icons/Extension';
import ComponentIcon from '@material-ui/icons/Memory';
import DomainIcon from '@material-ui/icons/Apartment';
import ResourceIcon from '@material-ui/icons/Work';
import SystemIcon from '@material-ui/icons/Category';
import UserIcon from '@material-ui/icons/Person';
import { useApp } from '@backstage/core-plugin-api';
```
3. Then update the `@backstage/core-components` import like this:
@@ -441,39 +436,39 @@ For this example we'll show you how you can expand the sidebar with a sub-menu:
<SidebarSubmenuItem
title="Domains"
to="catalog?filters[kind]=domain"
icon={DomainIcon}
icon={useApp().getSystemIcon('kind:domain')}
/>
<SidebarSubmenuItem
title="Systems"
to="catalog?filters[kind]=system"
icon={SystemIcon}
icon={useApp().getSystemIcon('kind:system')}
/>
<SidebarSubmenuItem
title="Components"
to="catalog?filters[kind]=component"
icon={ComponentIcon}
icon={useApp().getSystemIcon('kind:component')}
/>
<SidebarSubmenuItem
title="APIs"
to="catalog?filters[kind]=api"
icon={ApiIcon}
icon={useApp().getSystemIcon('kind:api')}
/>
<SidebarDivider />
<SidebarSubmenuItem
title="Resources"
to="catalog?filters[kind]=resource"
icon={ResourceIcon}
icon={useApp().getSystemIcon('kind:resource')}
/>
<SidebarDivider />
<SidebarSubmenuItem
title="Groups"
to="catalog?filters[kind]=group"
icon={GroupIcon}
icon={useApp().getSystemIcon('kind:group')}
/>
<SidebarSubmenuItem
title="Users"
to="catalog?filters[kind]=user"
icon={UserIcon}
icon={useApp().getSystemIcon('kind:user')}
/>
</SidebarSubmenu>
</SidebarItem>
+2
View File
@@ -38,6 +38,8 @@ In a typical Backstage setup, there is no boundary between plugins that run on t
The `UrlReader` facility is of particular interest for a secure Backstage configuration. In particular the `backend.reading.allow` configuration lists the hosts that you trust the backend to be able to read content from on behalf of users. It is extremely important that this list does not, for example, allow access to instance metadata endpoints of cloud providers, or other endpoints that your Backstage instance may have access to which contain sensitive information. In general it is recommended to keep the list minimal and only allow reading from required endpoints. The same concerns apply to custom implementations of the `UrlReader` interface, if you need to implement these through code.
Note that the `UrlReader` system operates with a service context and is not integrated with the Backstage permission system or other external access control mechanisms. This means users of your Backstage instance may be able to read external content which that individual should not have access to. For example, the `$text` placeholder in a `catalog-info.yaml` can be used to read contents from a source such as a GitHub repository that the user does not have direct access too. If this is a concern it is recommended to either disable or replace the resolvers in the catalog placeholder processor and similar features in any other plugin.
## Authentication
Backstage provides authentication of users through the `auth` plugin, which primarily acts as an authorization server for different OAuth 2.0 provider integrations. These integrations can both serve the purpose of signing users into Backstage, as well as providing delegated access to external resources, and are all subject to the common concerns of implementing secure OAuth 2.0 authorization servers. All auth provider integrations are disabled by default, and need to be enabled through configuration in order to be used. For each Backstage installation it is recommended to only enable the minimal set of providers that are in use by that instance.
+1 -1
View File
@@ -54,7 +54,7 @@ installed, may be captured.
| Action | Subject | Other Notes |
| ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `navigate` | The URL of the page that was navigated to. | |
| `navigate` | The URL of the page that was navigated to. | The parameters of the current route will be included as attributes |
| `click` | The text of the link that was clicked on. | The `to` attribute represents the URL clicked to. |
| `create` | The `name` of the software being created; if no `name` property is requested by the given Software Template, then the string `new {templateName}` is used instead. | The context holds an `entityRef`, set to the template's ref (e.g. `template:default/template-name`). |
| `search` | The search term entered in any search bar component. | The context holds `searchTypes`, representing `types` constraining the search. The `value` represents the total number of search results for the query. This may not be visible if the permission framework is being used. |
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+1 -2
View File
@@ -46,7 +46,6 @@ module.exports = {
startServerReadyTimeout: 600000,
numberOfRuns: 1,
puppeteerScript: './.lighthouseci/scripts/guest-auth.js',
startServerReadyPattern: 'Listening on :7007',
},
assert: {
assertions: {
@@ -54,7 +53,7 @@ module.exports = {
'categories:pwa': 'off',
'categories:best-practices': 'off',
'categories:seo': 'off',
'categories:accessibility': ['error', { minScore: 0.85 }],
'categories:accessibility': ['error', { minScore: 0.95 }],
},
},
},
@@ -13,7 +13,7 @@ Its the first open source infrastructure platform by Spotify that allows you
![img](assets/blog_1.png)
<!--truncate-->
{/* truncate */}
## As simple as writing a plugin.
@@ -9,7 +9,7 @@ authorImageURL: https://pbs.twimg.com/profile_images/121166861/6919c047c0d0edaac
Two days ago, we released the open source version of [Backstage](https://backstage.io/), our homegrown developer portal. And we learned a thing or two via the feedback we received. So, I wanted to take this opportunity to further explain what were trying to do with Backstage — and more importantly, what we want to give to the greater engineering community beyond Spotify.
<!--truncate-->
{/* truncate */}
## Whats the big infrastructure problem?
@@ -9,7 +9,7 @@ authorImageURL: https://pbs.twimg.com/profile_images/1224058798958088192/JPxS8uz
Were proud to announce that our first internal plugin at Spotify has been open-sourced as part of Backstage. This plugin works with the newly open-sourced [lighthouse-audit-service](https://github.com/spotify/lighthouse-audit-service) to run and track Lighthouse audits for your websites.
<!--truncate-->
{/* truncate */}
## What is Lighthouse?
@@ -11,7 +11,7 @@ We want users to be able to create their own version of Backstage quickly and ea
In this blog post well look at what a Backstage app is and how to create one using our [CLI](https://www.npmjs.com/package/@backstage/cli).
<!--truncate-->
{/* truncate */}
## What is a Backstage app?
@@ -9,7 +9,7 @@ authorImageURL: https://avatars0.githubusercontent.com/bih
Just a few weeks ago, we released our internal plugin for [Lighthouse website audits] as our first open source plugin, so the whole community could use it. Today, were excited to add a new plugin to that list — say hello to the [Tech Radar plugin]!
<!--truncate-->
{/* truncate */}
## What is Tech Radar?
@@ -9,7 +9,7 @@ authorImageURL: https://avatars2.githubusercontent.com/u/46946747
One of the great things about the open source community is once you put your work out there, you really never know where it might end up. Thats certainly the case here.
<!--truncate-->
{/* truncate */}
When Weaveworks decided to build an X-ray diagnostics app to help fight COVID-19, they pulled together a lot of different open source resources — from projects big and small, built by both familiar tech partners and some brand new ones, too.
@@ -12,7 +12,7 @@ We released the open source version of Backstage a little less than two months a
![img](assets/20-05-20/Service_Catalog_MVP.png)
<!--truncate-->
{/* truncate */}
## Progress so far
@@ -9,7 +9,7 @@ image: https://backstage.io/blog/assets/6/header.png
![img](assets/6/header.png)
<!--truncate-->
{/* truncate */}
## You asked, we listened
@@ -9,7 +9,7 @@ authorImageURL: https://avatars1.githubusercontent.com/u/1236238?s=460&v=4
Getting authentication right is important. It helps keep your platform safe, its one of the first things users will interact with, and there are many different authentication providers to support. To this end, we chose to use [Passport](http://www.passportjs.org/) to provide an easy-to-use, out-of-the-box experience that can be extended to your own, pre-existing authentication providers (known as strategies). The Auth APIs in Backstage serve two purposes: identify the user and provide a way for plugins to request access to third-party services on behalf of the user. Weve already implemented Google and GitHub authentication to provide examples and to get you started.
<!--truncate-->
{/* truncate */}
## What is Passport?
@@ -10,7 +10,7 @@ authorURL: https://twitter.com/stalund
<source src="/blog/assets/2020-08-05/feature.mp4" type="video/mp4" />
</video>
<!--truncate-->
{/* truncate */}
## Balancing autonomy and standardization
@@ -7,10 +7,16 @@ authorURL: https://github.com/garyniemen
Since we [open sourced Backstage](https://backstage.io/blog/2020/03/16/announcing-backstage), one of the most requested features has been for a technical documentation plugin. Well, good news. The first open source version of TechDocs is here. Now lets start collaborating and making it better, together.
<iframe width="780" height="440" src="https://www.youtube.com/embed/mOLCgdPw1iA" frameBorder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowFullScreen>
</iframe>
<iframe
width="780"
height="440"
src="https://www.youtube.com/embed/mOLCgdPw1iA"
frameBorder="0"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
allowFullScreen
></iframe>
<!--truncate-->
{/* truncate */}
Internally, we call it TechDocs. Its the most used plugin at Spotify by far — accounting for about 20% of our Backstage traffic (even though it is just one of 130+ plugins). Its popularity is evidence of something simple: We made documentation so easy to create, find, and use — people actually use it.
@@ -8,7 +8,7 @@ authorURL: https://twitter.com/stalund
![cncf](assets/cncf-sandbox/cncf.png)
<!--truncate-->
{/* truncate */}
Backstage garnered quite a bit of interest from developers and organizations when it was first announced, and community interest continues to grow as plugins and new features are added with the open source community. We released the open source version of Backstage early. That was intentional. Because even though weve been using Backstage internally for years, we wanted the open source version to be developed with input and contributions from the community. And thats exactly the product thats going into the [CNCF Sandbox](https://www.cncf.io/sandbox-projects/) today.
@@ -8,7 +8,7 @@ authorURL: http://twitter.com/katherinemzhou
We are excited to launch the Backstage Design System, which includes a [Figma UI kit](https://www.figma.com/community/file/850673348101741100), a rich set of [reusable code components](http://backstage.io/storybook) on Storybook, and [Guidelines](https://backstage.io/docs/dls/design) for designers and developers as they build plugins for Backstage.
<!--truncate-->
{/* truncate */}
## Not just the way it looks
@@ -12,7 +12,7 @@ Now you may be thinking, “Yeah, sure, that sounds nice and all, but how does B
![plugins](https://backstage.io/img/cards-plugins.png)
<!--truncate-->
{/* truncate */}
Think of plugins as a mini version of an infrastructure tool or service — just the parts you need, made quick and easy. The advantage of using a Backstage plugin instead of a tools dedicated UI is that all your infrastructure is packaged into a “single pane of glass” instead of being spread out like independently built “islands”. Once you grow your infrastructure portfolio, the complexity really starts to add up. The Backstage plugin model allows you to add more tools without increasing the cognitive load for your users.
@@ -7,11 +7,18 @@ authorURL: https://twitter.com/janisa_a
How did Spotify save millions on cloud costs within a matter of months?? We made cost optimization just another part of the daily development process. Our newly open sourced [Cost Insights plugin](https://github.com/backstage/backstage/tree/master/plugins/cost-insights) makes a teams cloud costs visible — and actionable — right inside Backstage. So engineers can see the impact of their cloud usage (down to a product and resource level) and make optimizations wherever and whenever it makes sense. By managing cloud costs from the ground up, you can make smarter decisions that let you continue to build and scale quickly, without wasting resources.
<iframe width="780" height="440" src="https://www.youtube.com/embed/YLAd5hdXR_Q" frameBorder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowFullScreen></iframe>
<iframe
width="780"
height="440"
src="https://www.youtube.com/embed/YLAd5hdXR_Q"
frameBorder="0"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
allowFullScreen
></iframe>
Are we turning engineers into accountants? Nope, were just letting engineers do what they do best, in the place that feels natural to them: inside Backstage.
<!--truncate-->
{/* truncate */}
## Why put a cost management tool in the hands of engineers?
@@ -10,7 +10,7 @@ authorURL: https://github.com/Rugvip
![Animation cycling between stability index scores](assets/2020-12-22/stability-index-hero.gif)
<!--truncate-->
{/* truncate */}
Backstage has a great and growing community of users and contributors. With so much valuable feedback, this inevitably means that sometimes we will go back and revise design decisions that introduce breaking changes. Furthermore, as we continue to ship new features and systems, well continue this cycle of iterating, gathering feedback, and iterating again before reaching a stable API.
@@ -11,7 +11,7 @@ TLDR; Were rethinking the Kubernetes developer experience with a new feature:
And since Backstage uses the native Kubernetes API, the feature works with whichever cloud provider (AWS, Azure, GCP, etc.) or managed service (OpenShift, IBM Cloud, GKE, etc.) you already use.
<!--truncate-->
{/* truncate */}
## The missing link between K8s and your service
@@ -8,7 +8,7 @@ authorURL: https://www.linkedin.com/in/austinlamon
One of the greatest strengths of Backstage also presents a never-ending challenge: Backstage is highly customizable and allows you to easily build a unique developer portal suited to your organizations needs. The downside of this flexibility is that it can be hard to know where to start. Backstage can do so many things — integrating every part of your tech infrastructure and developer experience — but if you set off building a developer portal without a plan, its easy to get overwhelmed by all the possibilities. To help you form your plan, this post will detail how Spotify came to design our internal portal and recommend potential models for you to use when designing and building your own.
<!--truncate-->
{/* truncate */}
## Infrastructure as tech culture
@@ -23,12 +23,14 @@ Spotifys developers were facing three big challenges on a daily basis:
- They needed to keep an eye on what squads around them might be building to ensure they could reuse systems when they needed to solve similar problems in the future.
In short, Spotify developers needed to continue building industry leading features at breakneck speed, while simultaneously maintaining a mental model for all the software at Spotify (oh, and help every new joiner develop that mental model as well!).
<br/>
<br />
## Three jobs: Create, manage, explore
Around the same time, the [jobs to be done](https://hbr.org/2016/09/know-your-customers-jobs-to-be-done) framework was becoming popular and luckily, a few Spotifiers helped guide the vision for a _sense-making tool for developers_ toward using it. After user research and many failed attempts, we landed on three jobs Spotify developers needed to do consistently:
<br/>
<br />
- **Create**: Spotify developers want to delight their customers with incredible features. They create new software to do that.
- **Manage**: Spotify developers are proud of their work and treat their software and data like products. That requires maintaining all the software they own on an ongoing basis.
@@ -73,7 +75,8 @@ Within todays complex development environments, there are barriers both big a
After talking with companies who have already adopted Backstage, weve seen a few common strategies for getting started. The different strategies are based on the size of your engineering org (which often also corresponds with how fast youre growing).
![200 engineers](assets/21-05-20/200-engineers_v.2.png)
<br/>
<br />
### My org has ~200 engineers (and is growing fast)
@@ -13,7 +13,7 @@ In order to grow Backstage further, Spotify is increasing the support we provide
And while Spotify remains committed to maturing the Backstage platform — both as original creator and active maintainer — we also want to make room for the community to take greater ownership. Backstage may have started inside Spotify, but it belongs to all of you. So, we hope you join us in whats next.
<!--truncate-->
{/* truncate */}
## Whats next: More support for adopters and contributors
@@ -13,7 +13,7 @@ So, you dont just get an improved out-of-the-box experience for searching wha
With one query, your teams can find exactly what theyre looking for: anything and everything.
<!--truncate-->
{/* truncate */}
## Search and explore
@@ -80,9 +80,9 @@ That's why we have put effort into making your search page experience composable
A good example of the level of customization the platform allows is how list items are displayed in search results. A search result component can be a list, this list can consist of different list items (search results returned from the search engine) — but these list items could look different depending on what the search result returns in terms of its fields.
Lets say that for an entity returned from the software catalog maybe the most important information to show is the name, while a result returned from the TechDocs plugin should maybe show the text content as the most important information. This can be customized by creating <CustomResultListItem /> components (like TechDocsResultListItem or CatalogResultListItem or whatever list item component you want) and configuring them in the app.
Lets say that for an entity returned from the software catalog maybe the most important information to show is the name, while a result returned from the TechDocs plugin should maybe show the text content as the most important information. This can be customized by creating `<CustomResultListItem />` components (like `TechDocsResultListItem` or `CatalogResultListItem` or whatever list item component you want) and configuring them in the app.
If there is no need to customize your search result list items, the <DefaultResultListItem /> component is there for you to reuse.
If there is no need to customize your search result list items, the `<DefaultResultListItem />` component is there for you to reuse.
## Getting started with Backstage Search
@@ -9,7 +9,7 @@ authorImageURL: https://avatars.githubusercontent.com/u/3645856?v=4
**TLDR**; At a high level, Backstage performs three main jobs: [Create, Manage, and Explore](https://backstage.io/blog/2021/05/20/adopting-backstage#three-jobs-create-manage-explore). Throughout the year, weve been focussed on improving the stability and scalability of these areas while enhancing the feature sets based upon requests from the community. Software Templates — which enable push-button deployments with all your standards and best practices built-in — is our first feature-complete release candidate to graduate to beta. Read on to learn how this release improves template customization and flexibility, as well as performance.
<!--truncate-->
{/* truncate */}
Lets rewind a little bit, around a year in fact. Backstage had been open sourced, and we released our first version of Software Templates and our Scaffolder plugin.
@@ -9,7 +9,7 @@ authorImageURL: https://avatars.githubusercontent.com/u/3496491?v=4
**TLDR:** Another beta has landed! We continue to focus on improving the stability and scalability of Backstage while enhancing its functionality. Thanks to focused efforts from the TechDocs core team and community, we're happy to say that TechDocs — [our docs-like-code solution](https://backstage.io/blog/2020/09/08/announcing-tech-docs) for all the software in your catalog — is now, after [Software Templates](https://backstage.io/blog/2021/07/26/software-templates-are-now-in-beta), the second core feature to graduate to beta.
<!--truncate-->
{/* truncate */}
In addition to new features and improvements, we made numerous compatibility updates ahead of this feature release. You'll find support for a variety of CI systems, cloud storage solutions, and source control systems — so that TechDocs works for most orgs, right out of box. But there's much more to explore in this beta, thanks to contributions from the community.
@@ -21,7 +21,10 @@ When we set out to define what beta looked like, we combed through GitHub issues
TechDocs can be transformational once fully up and running (update your code and your docs with the same pull request!). But for first-time users and especially those unfamiliar with the MkDocs ecosystem upon which TechDocs is built, there are often many small, obtuse hurdles that can get in the way of success. Leading up to the beta release, we worked to surface and improve relevant errors and other details during the documentation generation process. Better still, all of this detail is now provided to users _in real-time_, as docs are generated and refreshed.
<p>🙌 Shout out to <a href="https://github.com/dhenneke">Dominik Henneke</a> for implementing the interactive experience.</p>
<p>
🙌 Shout out to <a href="https://github.com/dhenneke">Dominik Henneke</a> for
implementing the interactive experience.
</p>
## Custom homepages: Make TechDocs yours
@@ -29,7 +32,10 @@ TechDocs can be transformational once fully up and running (update your code and
We strive to make it so that you can mold Backstage into the shape that best fits your organization. With this beta release, just as you can with the Catalog entities and [Search](https://backstage.io/blog/2021/06/24/announcing-backstage-search-platform#composable-search-page-experiences), you can now customize and compose your own TechDocs homepage. Use it to level up the front page of your Backstage documentation by highlighting golden documentation at your company, or use the new and improved (and Catalog-inspired) experience. Read more about [how to customize the TechDocs homepage](https://backstage.io/docs/features/techdocs/how-to-guides#how-to-customize-the-techdocs-home-page).
<p>🙏 Thanks to <a href="https://github.com/kuangp">Phil Kuang</a> for the improved default TechDocs home experience.</p>
<p>
🙏 Thanks to <a href="https://github.com/kuangp">Phil Kuang</a> for the
improved default TechDocs home experience.
</p>
## Simpler YAML annotations: What's in a ref?
@@ -39,7 +45,9 @@ We often forget that in order to enable TechDocs on a Catalog entity, documentat
In the beta, we've simplified this annotation dramatically for documentation authors, aligning its value with TechDocs' docs-like-code philosophy itself. In the vast majority of cases, its value will simply be `dir:.` — which means this catalog entity contains documentation and the mkdocs.yml file describing this documentation lives in the current directory. We continue to support edge cases for [other techdocs-ref annotation values](https://backstage.io/docs/features/techdocs/how-to-guides#how-to-understand-techdocs-ref-annotation-values), as well.
<p>👏 Another round of applause for Dominik for driving this improvement through.</p>
<p>
👏 Another round of applause for Dominik for driving this improvement through.
</p>
## Everything neat and tidy
@@ -11,7 +11,7 @@ Were excited to celebrate an important milestone for the Backstage community:
Before digging into why we believe this is so important, we want to send a huge “thank you” to all the Backstage adopters and contributors who have helped grow the Backstage community. First, to the publicly listed adopters as your visible support for the project excites others to learn more about Backstage. Second, to those non-listed adopters, many of whom still engage in the community via issues, comments, or code contributions. Thank you!
<!--truncate-->
{/* truncate */}
## Why we care about public adopters
@@ -15,7 +15,7 @@ In 2021 weve seen the project and community grow in every dimension, reaching
Now lets hear from the maintainers and look at the stats!
<!--truncate-->
{/* truncate */}
## The community grew…and grew
@@ -48,11 +48,25 @@ Along with the growth in contributors, PRs, and issues, our active, thriving com
Watch the visualization below to see where in the world all those contributions came from this past year.
<iframe width="780" height="440" src="https://www.youtube.com/embed/O1xtDv_XDt4" frameBorder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowFullScreen></iframe>
<iframe
width="780"
height="440"
src="https://www.youtube.com/embed/O1xtDv_XDt4"
frameBorder="0"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
allowFullScreen
></iframe>
### What does 9,000 contributions look like?
<iframe width="780" height="440" src="https://www.youtube.com/embed/bCqhoK7it2g" frameBorder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowFullScreen></iframe>
<iframe
width="780"
height="440"
src="https://www.youtube.com/embed/bCqhoK7it2g"
frameBorder="0"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
allowFullScreen
></iframe>
Can you spot your name in the video above?
@@ -11,7 +11,7 @@ _This blog post is co-authored by Emma Indal ([@emmaindal](https://github.com/em
_TLDR;_ Were excited to announce the arrival of homepage templates for Backstage. It can be intimidating to build up your own instance of Backstage, so we decided to make your life a bit easier by giving you an out-of-the-box homepage to hit the ground running. This template can be found in our [Backstage Storybook](https://backstage.io/storybook/?path=/story/plugins-home-templates--default-template), as well as future templates that we build.
<!--truncate-->
{/* truncate */}
## Why homepage templates?
@@ -9,7 +9,7 @@ authorImageURL: https://avatars.githubusercontent.com/u/8433119?v=4
_TLDR;_ The Spotify team recently announced [Backstage Upgrade Helper](https://backstage.github.io/upgrade-helper): a tool that helps adopters keep their Backstage application up-to-date. **Spoiler alert**: this is also a hidden and heartwarming tale about the beauty of open source innovation.
<!--truncate-->
{/* truncate */}
## Upgrading Backstage was a common pain point
@@ -9,7 +9,7 @@ authorImageURL: https://avatars1.githubusercontent.com/u/1236238?s=460&v=4
**TLDR:** Backstage has turned two. Of course, this is software, so we expect things to move fast. But when you have a passionate, worldwide community building together, weve now seen firsthand just how fast that can be. Were marking our second year as a community by becoming a CNCF incubating project, reaching 100 public adopters, releasing version 1.0 of the core app, and other very nice birthday gifts. Rather than a toddler finding their feet, Backstage today is beginning to look awfully grown-up for a two-year-old.
<!--truncate-->
{/* truncate */}
## Out of the Sandbox and into Incubation
@@ -49,7 +49,14 @@ The Backstage community is truly global with adopters and contributors from almo
We asked a few contributors and maintainers to share their thoughts around this two-year milestone.
<iframe width="780" height="440" src="https://www.youtube.com/embed/-j-waaybcH0" frameBorder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowFullScreen></iframe>
<iframe
width="780"
height="440"
src="https://www.youtube.com/embed/-j-waaybcH0"
frameBorder="0"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
allowFullScreen
></iframe>
Warms the heart, doesnt it? Thanks again to all our contributors for making this possible. Seriously. Were proud of what the community has accomplished and how weve accomplished it. All along, its your enthusiasm and warm/collaborative/positive vibes that have carried us and this project through.
@@ -10,7 +10,7 @@ authorImageURL: https://avatars.githubusercontent.com/u/6010860?v=4
_TL;DR:_ If youve been waiting for Backstage to come out of beta, were excited to announce that Backstage 1.0 is here!
<!--truncate-->
{/* truncate */}
Its been two years since Spotify [open sourced Backstage](https://backstage.io/blog/2020/03/16/announcing-backstage) so companies of all shapes and sizes — and in every industry all over the world — could build highly extensible and customized developer portals to best suit their organizations needs and culture. Now hundreds of adopters are using Backstage as the single pane of glass for their core development, managing millions of components and technical documentation, and helping hundreds of thousands of developers be more productive and happy.
@@ -12,7 +12,7 @@ _This blog post is co-authored by Eric Peterson ([@iamEAP](https://github.com/ia
_TL;DR:_ Introducing the TechDocs Addon Framework — a way for us all to contribute and share additional features, TechDocs Addons, on top of the base docs-like-code experience.
<!--truncate-->
{/* truncate */}
[TechDocs](https://backstage.io/docs/features/techdocs/) is a centralized platform for publishing, viewing, and discovering technical documentation across an entire organization. It's a solid foundation! But TechDocs doesn't solve higher order documentation needs on its own such as: How do you create and reinforce a culture of documentation? How do you build trust in the quality of technical documentation?
@@ -13,7 +13,7 @@ We first released the Backstage Search Platform over a year ago. Backstage Searc
Backstage Search Platform makes it possible for you to search across your entire software ecosystem. With a Search platform that is customizable and extendable, you can identify your needs within your organization and set up search to solve these problems. Whether it is to search through the Software Catalog or technical documentation generated by the TechDocs plugin.
<!--truncate-->
{/* truncate */}
## So what is Backstage Search 1.0?
@@ -11,7 +11,7 @@ authorURL: https://github.com/Rugvip
As an [Incubating project](https://www.cncf.io/blog/2022/03/15/backstage-project-joins-the-cncf-incubator/) within the [Cloud Native Computing Foundation (CNCF)](https://www.cncf.io/), Backstage was fortunate enough to take advantage of a sponsored security audit. The [Open Source Technology Improvement Fund (OSTIF)](https://ostif.org/) sponsored the audit as part of its ongoing efforts to secure the open source software ecosystem, and the audit itself was performed by [X41 D-Sec](https://x41-dsec.de/). Our goal with the audit was to evaluate and improve Backstages security posture, focusing on the core Backstage framework and plugins.
<!--truncate-->
{/* truncate */}
## Report Findings and Fixes
@@ -10,7 +10,7 @@ authorImageURL: https://avatars.githubusercontent.com/u/3496491?v=4
![The Plugin Analytics API](assets/22-09-08/analytics-api-fyi.png)
<!--truncate-->
{/* truncate */}
## What is the plugin analytics API?
@@ -9,7 +9,7 @@ Backstage continues to grow in [popularity and maturity](https://roadie.io/blog/
[![Introduction to Backstage: Developer Portals Made Easy (LFS142x): Enroll!](assets/22-11-15/Introduction-to-Backstage-Developer-Portals-Made-Easy-2-768x432.png)](https://www.edx.org/course/introduction-to-backstage-developer-portals-made-easy)
<!--truncate-->
{/* truncate */}
The course, [Introduction to Backstage: Developer Portals Made Easy (LFS142x)](https://www.edx.org/course/introduction-to-backstage-developer-portals-made-easy), starts discussing the benefits of adopting a Developer Portal. Then, it dives into what is Backstage, its main features (Catalog, Scaffolder, TechDocs), and how to map its capabilities to your organization. At last, it provides tips on how to connect with the community to ease up your adoption journey.
@@ -12,7 +12,7 @@ Our community is full of people from across the globe who bring incredible engag
But before anticipating too much, lets share some stats of this amazing 2022.
<!--truncate-->
{/* truncate */}
## We grew … a lot!
@@ -40,7 +40,14 @@ All of these people driving the enormous growth and maturity of the project are
Wow… thats a lot of activity. Weve generated this animation showing all of your contributions to the Backstage repository in 2022, look at this project grow:
<iframe width="780" height="440" src="https://www.youtube.com/embed/GoWBvHpH5Cg" frameBorder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowFullScreen></iframe>
<iframe
width="780"
height="440"
src="https://www.youtube.com/embed/GoWBvHpH5Cg"
frameBorder="0"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
allowFullScreen
></iframe>
## But wait… theres more
@@ -8,7 +8,7 @@ At the heart of [Backstage](https://backstage.io/) is the [Backstage Software Ca
![catalog pipeline](assets/2023-01-31/catalog-pipeline.png)
<!--truncate-->
{/* truncate */}
A common use case is for an organization to want to surface ownership and metadata about repositories. Backstage provides a mechanism for discovering and transforming repository information into a standard data structure and persisting it into the Backstage [Catalog](https://backstage.io/docs/features/software-catalog/). This process is known as ingestion, where all data is transformed into a standard Backstage data structure known as an entity. Entities in the Catalogs data store are accessible to the Backstage App via the REST API.
@@ -10,7 +10,7 @@ authorURL: https://github.com/leemills83
Okay, everyone. Time to move on from all the 2022 reflections, Top 10 lists, and Wrapped(s), and turn our gaze in the other direction — towards 2023. As the Backstage team moves into the new year, we find ourselves asking those perennial questions: How can we continue to grow and enhance the Backstage community? How can we improve the experience for those adopting Backstage? How can we give the best support to Backstage contributors?
<!--truncate-->
{/* truncate */}
Well, we dont have all the answers, but we do have some. So we wanted to share more on three ongoing initiatives aimed at moving the needle forward for these three distinct, yet interrelated, questions.
@@ -11,7 +11,7 @@ For the past year, the Backstage maintainer team has been spending time to give
Were happy to announce that the [v1.11](https://backstage.io/docs/releases/v1.11.0) release includes the public alpha of the [new Backstage backend system](https://backstage.io/docs/backend-system/)! The system has already been available to use for some time, as some of you have already found, but this alpha release marks the point where we are finally ready to encourage widespread adoption by plugin builders. We still dont recommend that you use this new system in your production setups just yet, more on that later.
<!--truncate-->
{/* truncate */}
## History of the Backstage backend system
@@ -37,9 +37,16 @@ A few months later as the RFC settled, we resumed work and followed up with an i
We wrapped up this work just before KubeCon NA 2022, with the full system implemented. The state of the system at this point was presented in our talk on the topic, which you can see just below. Except for a few API tweaks, this is what the system still looks like today.
<iframe width="780" height="440" src="https://www.youtube.com/embed/ZXF7uxrEBVY" frameBorder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowFullScreen></iframe>
<iframe
width="780"
height="440"
src="https://www.youtube.com/embed/ZXF7uxrEBVY"
frameBorder="0"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
allowFullScreen
></iframe>
<br/>
<br />
The final stage was all about polish, which we picked up at the beginning of this year. By leaving a bit of space between the main implementation, or phase two, and the polish phase, phase three, it was much easier to properly scrutinize our past solutions. We forget a lot of the low level reasoning for changes, and it is easier to step back and reconsider parts of the system. For example, we found that our initial design of the `createServiceFactory` function was unnecessarily complex, and could be made much simpler for most usages. In addition to reviewing all the APIs, we also wrote more documentation to help users, ensured that the local development and testing experience was solid, and double checked that there was a smooth migration path from the old system.
@@ -9,7 +9,7 @@ authorImageURL: https://avatars.githubusercontent.com/u/3645856?v=4
**TL;DR** Spotify released Backstage into open source three years ago today. Since then, the community has grown by leaps and bounds to stretch across the globe (and the Discord server!). Now that Backstage is a threenager, the growing pains are real. So, on this birthday, we want to cover our collective efforts to make it easier to adopt and contribute to Backstage.
<!--truncate-->
{/* truncate */}
## They grow up so fast, dont they?
@@ -33,9 +33,29 @@ But, without a doubt, the best thing about the Backstage project is the people i
Dont take our word for it! Take a look at this birthday video we put together with a few community members.
<div style={{ position: 'relative', overflow: 'hidden', width: '100%', paddingTop: '56.25%'}}>
<iframe style={{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, width: '100%', height: '100%' }} src="https://www.youtube.com/embed/rllOa_MfEWw" frameBorder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowFullScreen>
</iframe>
<div
style={{
position: 'relative',
overflow: 'hidden',
width: '100%',
paddingTop: '56.25%',
}}
>
<iframe
style={{
position: 'absolute',
top: 0,
left: 0,
right: 0,
bottom: 0,
width: '100%',
height: '100%',
}}
src="https://www.youtube.com/embed/rllOa_MfEWw"
frameBorder="0"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
allowFullScreen
></iframe>
</div>
## The growing pains are real
@@ -0,0 +1,34 @@
---
title: 'ICYMI: KubeCon EU 2023'
author: Bailey Brooks, Spotify
authorURL: http://github.com/bailey
authorImageURL: https://pbs.twimg.com/profile_images/1477424303192694785/qCfN6XWW_400x400.jpg
---
![KubeCon CloudNativeCon Europe 2023 banner](assets/2023-04-26/Backstage_News_3-7-23_KubeCon.png)
We had a blast talking all things Backstage at KubeCon EU 2023 in Amsterdam last week. In case you missed it, heres a quick recap:
{/* truncate */}
## Backstage Project Meeting
![A packed room for the Backstage project meeting](assets/2023-04-26/IMG_2522.png)
On Tuesday the Backstage maintainers hosted a jam-packed project meeting. The community welcomed many teams and individuals that were early in their Backstage journey, either actively adopting, preparing for the POC phase, or learning about the capabilities of Backstage. Many of the newcomers were eager to learn about how Backstage could help streamline their development workflows and improve developer productivity. During the project meeting, the maintainers covered a “day in the life” of a core maintainer, walked through spinning up a new instance of Backstage in a live demo, and opened it up to questions from the community. Its super exciting to see so much growing interest in Backstage and all of the ways adopters are adapting it to their needs.
## State of Backstage in 2023
![Patrik and Ben onstage for the State of Backstage talk](assets/2023-04-26/IMG_0120.png)
Core maintainers [Ben Lambert](https://github.com/benjdlambert) and [Patrik Oldsberg](https://github.com/Rugvip) took center stage on Wednesday for the Backstage Maintainer Track: State of Backstage in 2023 talk. Backstage has officially hit over 1,000 adopters and 1,000 contributors so its apt timing to modernize the governance model for the project. Taking pointers from the [CNCF Contributor Ladder Governance Template](https://contribute.cncf.io/maintainers/templates/), a new [Backstage Governance Model](https://github.com/backstage/backstage/blob/master/GOVERNANCE.md) is now in effect! Patrik walked us through the new ladder model which introduces a number of changes, one being the addition of [project area maintainers](https://github.com/backstage/backstage/blob/master/GOVERNANCE.md#project-area-maintainer). This role lets members of the community take increased ownership over a specific area of interest, like Catalog, Discoverability, TechDocs, Helm Charts, and Kubernetes. New project areas that will be added include Permissions and Software Templates. New project areas can be proposed by nominating a project area maintainer for the area. The new model also adds an organization member role for contributors who want to take a more active role in the Backstage community. You can open an issue to become an organization member [here](https://github.com/backstage/community/issues/new/choose).
![Contributor ladder](assets/2023-04-26/contributor_ladder.png)
Ben and Patrik also covered new capabilities for Software Templates and framework updates. Lots of exciting new features are planned for Software Templates including a new UI, async validation for CustomFieldExtensions, and embedded workflows. Lastly, the maintainers also announced a new focus on declarative integration permitting plugin installation without TypeScript. Development is still early, but we cant wait to see this in action!
## Other KubeCon excitement!
Throughout the week, we also heard success stories of adopters, like AppsFlyers talk, “How We Migrated Over 1000 Services to Backstage Using GitOps and Survived to Talk About It!” AppsFlyer has over 1,000 services and processes over 200 billion events per day so migrating to Backstage as their service catalog platform was no small feat. As part of their migration, they also integrated GitOps and Terraform into their Backstage instance. Many attendees found interest in these case studies where you could see the adoption and POC process directly from other adopters. It was exciting to see firsthand how teams can extend Backstage to fit their needs on the fly.
We were thrilled to see so much excitement and interest brewing around Backstage this year! If you missed it, you can catch up as soon as more talks are added to the [CNCF YouTube channel](https://www.youtube.com/@cncf/featured). We cant wait to catch up with you all again soon at KubeCon North America in Chicago.
Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 594 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 460 KiB

+10
View File
@@ -0,0 +1,10 @@
---
title: 'ChatGPT Plugin'
author: Enfuse
authorUrl: https://enfuse.io/
category: Development
description: Experiment with the OpenAI playground to help you develop more efficiently
documentation: https://github.com/enfuse/backstage-chatgpt-plugin/blob/main/README.md
iconUrl: /img/enfuse.png
npmPackageName: '@enfuse/chatgpt-plugin-frontend'
addedDate: '2023-04-21'
+12
View File
@@ -0,0 +1,12 @@
---
title: dbt Docs
author: IIBenII
authorUrl: https://github.com/IIBenII
category: Discovery
description: View dbt models and tests documentation.
documentation: https://github.com/IIBenII/backstage-plugin-dbt
npmPackageName: '@iiben_orgii/backstage-plugin-dbt'
tags:
- dbt
- doc
addedDate: '2023-04-27'
+6
View File
@@ -68,6 +68,12 @@ module.exports = {
},
],
],
markdown: {
preprocessor({ filePath, fileContent }) {
// Replace all HTML comments with emtpy strings as these are not supported by MDXv2.
return fileContent.replace(/<!--.*?-->/gs, '');
},
},
webpack: {
jsLoader: isServer => ({
loader: require.resolve('swc-loader'),
+4 -5
View File
@@ -17,21 +17,20 @@
"docusaurus": "docusaurus"
},
"devDependencies": {
"@docusaurus/module-type-aliases": "2.4.0",
"@docusaurus/module-type-aliases": "0.0.0-5566",
"@spotify/prettier-config": "^14.0.0",
"@tsconfig/docusaurus": "^1.0.6",
"@types/webpack-env": "^1.18.0",
"js-yaml": "^4.1.0",
"prettier": "^2.6.2",
"replace": "^1.2.2",
"typescript": "^4.9.4",
"yaml-loader": "^0.8.0"
},
"prettier": "@spotify/prettier-config",
"dependencies": {
"@docusaurus/core": "2.4.0",
"@docusaurus/plugin-client-redirects": "^2.3.1",
"@docusaurus/preset-classic": "2.4.0",
"@docusaurus/core": "0.0.0-5566",
"@docusaurus/plugin-client-redirects": "0.0.0-5566",
"@docusaurus/preset-classic": "0.0.0-5566",
"@swc/core": "^1.3.46",
"clsx": "^1.1.1",
"docusaurus-plugin-sass": "^0.2.3",

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