diff --git a/.changeset/angry-flowers-yawn.md b/.changeset/angry-flowers-yawn.md
new file mode 100644
index 0000000000..8f478b1eab
--- /dev/null
+++ b/.changeset/angry-flowers-yawn.md
@@ -0,0 +1,29 @@
+---
+'@backstage/catalog-model': patch
+'@backstage/plugin-catalog-backend': patch
+---
+
+Adds a `backstage.io/managed-by-origin-location` annotation to all entities. It links to the
+location that was registered to the catalog and which emitted this entity. It has a different
+semantic than the existing `backstage.io/managed-by-location` annotation, which tells the direct
+parent location that created this entity.
+
+Consider this example: The Backstage operator adds a location of type `github-org` in the
+`app-config.yaml`. This setting will be added to a `bootstrap:boostrap` location. The processor
+discovers the entities in the following branch
+`Location bootstrap:bootstrap -> Location github-org:… -> User xyz`. The user `xyz` will be:
+
+```yaml
+apiVersion: backstage.io/v1alpha1
+kind: User
+metadata:
+ name: xyz
+ annotations:
+ # This entity was added by the 'github-org:…' location
+ backstage.io/managed-by-location: github-org:…
+ # The entity was added because the 'bootstrap:boostrap' was added to the catalog
+ backstage.io/managed-by-origin-location: bootstrap:bootstrap
+ # ...
+spec:
+ # ...
+```
diff --git a/.changeset/bright-radios-eat.md b/.changeset/bright-radios-eat.md
new file mode 100644
index 0000000000..73d2b32e23
--- /dev/null
+++ b/.changeset/bright-radios-eat.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-github-actions': minor
+---
+
+Support GHE
diff --git a/.changeset/calm-turtles-smoke.md b/.changeset/calm-turtles-smoke.md
new file mode 100644
index 0000000000..f2d473fe9f
--- /dev/null
+++ b/.changeset/calm-turtles-smoke.md
@@ -0,0 +1,7 @@
+---
+'@backstage/core': minor
+---
+
+Removed `InfoCard` variant `height100`, originally deprecated in [#2826](https://github.com/backstage/backstage/pull/2826).
+
+If your component still relies on this variant, simply replace it with `gridItem`.
diff --git a/.changeset/clever-timers-thank.md b/.changeset/clever-timers-thank.md
new file mode 100644
index 0000000000..b5b75c0409
--- /dev/null
+++ b/.changeset/clever-timers-thank.md
@@ -0,0 +1,25 @@
+---
+'@backstage/backend-common': patch
+'@backstage/integration': patch
+---
+
+Add support for GitHub Apps authentication for backend plugins.
+
+`GithubCredentialsProvider` requests and caches GitHub credentials based on a repository or organization url.
+
+The `GithubCredentialsProvider` class should be considered stateful since tokens will be cached internally.
+Consecutive calls to get credentials will return the same token, tokens older than 50 minutes will be considered expired and reissued.
+`GithubCredentialsProvider` will default to the configured access token if no GitHub Apps are configured.
+
+More information on how to create and configure a GitHub App to use with backstage can be found in the documentation.
+
+Usage:
+
+```javascript
+const credentialsProvider = new GithubCredentialsProvider(config);
+const { token, headers } = await credentialsProvider.getCredentials({
+ url: 'https://github.com/',
+});
+```
+
+Updates `GithubUrlReader` to use the `GithubCredentialsProvider`.
diff --git a/.changeset/cool-horses-applaud.md b/.changeset/cool-horses-applaud.md
new file mode 100644
index 0000000000..83667d2b54
--- /dev/null
+++ b/.changeset/cool-horses-applaud.md
@@ -0,0 +1,6 @@
+---
+'@backstage/plugin-catalog': patch
+---
+
+Derive the list of to-delete entities in the `UnregisterEntityDialog` from the `backstage.io/managed-by-origin-location` annotation.
+The dialog also rejects deleting entities that are created by the `bootstrap:bootstrap` location.
diff --git a/.changeset/green-coins-confess.md b/.changeset/green-coins-confess.md
new file mode 100644
index 0000000000..7fc52b8a43
--- /dev/null
+++ b/.changeset/green-coins-confess.md
@@ -0,0 +1,40 @@
+---
+'@backstage/create-app': patch
+---
+
+Migrate to using `FlatRoutes` from `@backstage/core` for the root app routes.
+
+This is the first step in migrating applications as mentioned here: https://backstage.io/docs/plugins/composability#porting-existing-apps.
+
+To apply this change to an existing app, switch out the `Routes` component from `react-router` to `FlatRoutes` from `@backstage/core`.
+This also allows you to remove any `/*` suffixes on the route paths. For example:
+
+```diff
+import {
+ OAuthRequestDialog,
+ SidebarPage,
+ createRouteRef,
++ FlatRoutes,
+ } from '@backstage/core';
+ import { AppSidebar } from './sidebar';
+-import { Route, Routes, Navigate } from 'react-router';
++import { Route, Navigate } from 'react-router';
+ import { Router as CatalogRouter } from '@backstage/plugin-catalog';
+...
+
+-
++
+...
+ }
+ />
+- } />
++ } />
+...
+ } />
+-
++
+
+```
diff --git a/.changeset/healthy-comics-drive.md b/.changeset/healthy-comics-drive.md
new file mode 100644
index 0000000000..4b532dc853
--- /dev/null
+++ b/.changeset/healthy-comics-drive.md
@@ -0,0 +1,6 @@
+---
+'@backstage/plugin-catalog': patch
+---
+
+Display the owner, system, and domain as links to the entity pages in the about card.
+Only display fields in the about card that are applicable to the entity kind.
diff --git a/.changeset/healthy-crews-remember.md b/.changeset/healthy-crews-remember.md
new file mode 100644
index 0000000000..c7cfdaaa6d
--- /dev/null
+++ b/.changeset/healthy-crews-remember.md
@@ -0,0 +1,19 @@
+---
+'@backstage/create-app': patch
+---
+
+fix routing and config for user-settings plugin
+
+To make the corresponding change in your local app, add the following in your App.tsx
+
+```
+import { Router as SettingsRouter } from '@backstage/plugin-user-settings';
+...
+} />
+```
+
+and the following to your plugins.ts:
+
+```
+export { plugin as UserSettings } from '@backstage/plugin-user-settings';
+```
diff --git a/.changeset/khaki-icons-trade.md b/.changeset/khaki-icons-trade.md
new file mode 100644
index 0000000000..4d30c3977e
--- /dev/null
+++ b/.changeset/khaki-icons-trade.md
@@ -0,0 +1,26 @@
+---
+'@backstage/backend-common': patch
+---
+
+1. URL Reader's `readTree` method now returns an `etag` in the response along with the blob. The etag is an identifier of the blob and will only change if the blob is modified on the target. Usually it is set to the latest commit SHA on the target.
+
+`readTree` also takes an optional `etag` in its options and throws a `NotModifiedError` if the etag matches with the etag of the resource.
+
+So, the `etag` can be used in building a cache when working with URL Reader.
+
+An example -
+
+```ts
+const response = await reader.readTree(
+ 'https://github.com/backstage/backstage',
+);
+
+const etag = response.etag;
+
+// Will throw a new NotModifiedError (exported from @backstage/backstage-common)
+await reader.readTree('https://github.com/backstage/backstage', {
+ etag,
+});
+```
+
+2. URL Reader's readTree method can now detect the default branch. So, `url:https://github.com/org/repo/tree/master` can be replaced with `url:https://github.com/org/repo` in places like `backstage.io/techdocs-ref`.
diff --git a/.changeset/lovely-pants-battle.md b/.changeset/lovely-pants-battle.md
new file mode 100644
index 0000000000..f0d8f7e002
--- /dev/null
+++ b/.changeset/lovely-pants-battle.md
@@ -0,0 +1,7 @@
+---
+'@backstage/plugin-fossa': patch
+---
+
+Request a sorted response list to select the project with the correct title. The FOSSA API
+matches title searches with "starts with" so previously it used the response for `my-project-part`
+if you searched for `my-project`.
diff --git a/.changeset/nervous-mails-repair.md b/.changeset/nervous-mails-repair.md
new file mode 100644
index 0000000000..f72e2b5e66
--- /dev/null
+++ b/.changeset/nervous-mails-repair.md
@@ -0,0 +1,5 @@
+---
+'@backstage/integration': patch
+---
+
+Fix GitLab API base URL and add it by default to the gitlab.com host
diff --git a/.changeset/proud-news-impress.md b/.changeset/proud-news-impress.md
new file mode 100644
index 0000000000..d10c37819f
--- /dev/null
+++ b/.changeset/proud-news-impress.md
@@ -0,0 +1,55 @@
+---
+'@backstage/core': minor
+---
+
+Removed deprecated `router.registerRoute` method in `createPlugin`.
+
+Deprecated `router.addRoute` method in `createPlugin`.
+
+Replace usage of the above two components with a routable extension.
+
+For example, given the following:
+
+```ts
+import { createPlugin } from '@backstage/core';
+import { MyPage } from './components/MyPage';
+import { rootRoute } from './routes';
+
+export const plugin = createPlugin({
+ id: 'my-plugin',
+ register({ router }) {
+ router.addRoute(rootRoute, MyPage);
+ },
+});
+```
+
+Migrate to
+
+```ts
+import { createPlugin, createRoutableExtension } from '@backstage/core';
+import { rootRoute } from './routes';
+
+export const plugin = createPlugin({
+ id: 'my-plugin',
+ routes: {
+ root: rootRoute,
+ },
+});
+
+export const MyPage = plugin.provide(
+ createRoutableExtension({
+ component: () => import('./components/MyPage').then(m => m.MyPage),
+ mountPoint: rootRoute,
+ }),
+);
+```
+
+And then use `MyPage` like this in the app:
+
+```tsx
+
+...
+ }>
+...
+
+```
diff --git a/.changeset/rich-turtles-roll.md b/.changeset/rich-turtles-roll.md
new file mode 100644
index 0000000000..9015161369
--- /dev/null
+++ b/.changeset/rich-turtles-roll.md
@@ -0,0 +1,19 @@
+---
+'@backstage/backend-common': minor
+---
+
+Remove fallback option from `UrlReaders.create` and `UrlReaders.default`, as well as the default fallback reader.
+
+To be able to read data from endpoints outside of the configured integrations, you now need to explicitly allow it by
+adding an entry in the `backend.reading.allow` list. For example:
+
+```yml
+backend:
+ baseUrl: ...
+ reading:
+ allow:
+ - host: example.com
+ - host: '*.examples.org'
+```
+
+Apart from adding the above configuration, most projects should not need to take any action to migrate existing code. If you do happen to have your own fallback reader configured, this needs to be replaced with a reader factory that selects a specific set of URLs to work with. If you where wrapping the existing fallback reader, the new one that handles the allow list is created using `FetchUrlReader.factory`.
diff --git a/.changeset/strong-ligers-lay.md b/.changeset/strong-ligers-lay.md
new file mode 100644
index 0000000000..56f4a91a9d
--- /dev/null
+++ b/.changeset/strong-ligers-lay.md
@@ -0,0 +1,6 @@
+---
+'@backstage/plugin-catalog': patch
+---
+
+Display systems in catalog table and make both owner and system link to the entity pages.
+The owner field is now taken from the relations of the entity instead of its spec.
diff --git a/.changeset/swift-baboons-refuse.md b/.changeset/swift-baboons-refuse.md
new file mode 100644
index 0000000000..4cefb534ff
--- /dev/null
+++ b/.changeset/swift-baboons-refuse.md
@@ -0,0 +1,53 @@
+---
+'@backstage/create-app': patch
+---
+
+use `fromConfig` for all scaffolder helpers, and use the url protocol for app-config location entries.
+
+To apply this change to your local installation, replace the contents of your `packages/backend/src/plugins/scaffolder.ts` with the following contents:
+
+```ts
+import {
+ CookieCutter,
+ createRouter,
+ Preparers,
+ Publishers,
+ CreateReactAppTemplater,
+ Templaters,
+ CatalogEntityClient,
+} from '@backstage/plugin-scaffolder-backend';
+import { SingleHostDiscovery } from '@backstage/backend-common';
+import type { PluginEnvironment } from '../types';
+import Docker from 'dockerode';
+
+export default async function createPlugin({
+ logger,
+ config,
+}: PluginEnvironment) {
+ const cookiecutterTemplater = new CookieCutter();
+ const craTemplater = new CreateReactAppTemplater();
+ const templaters = new Templaters();
+ templaters.register('cookiecutter', cookiecutterTemplater);
+ templaters.register('cra', craTemplater);
+
+ const preparers = await Preparers.fromConfig(config, { logger });
+ const publishers = await Publishers.fromConfig(config, { logger });
+
+ const dockerClient = new Docker();
+
+ const discovery = SingleHostDiscovery.fromConfig(config);
+ const entityClient = new CatalogEntityClient({ discovery });
+
+ return await createRouter({
+ preparers,
+ templaters,
+ publishers,
+ logger,
+ config,
+ dockerClient,
+ entityClient,
+ });
+}
+```
+
+This will ensure that the `scaffolder-backend` package can add handlers for the `url` protocol which is becoming the standard when registering entities in the `catalog`
diff --git a/.changeset/techdocs-glasses-wonder.md b/.changeset/techdocs-glasses-wonder.md
new file mode 100644
index 0000000000..7610be2665
--- /dev/null
+++ b/.changeset/techdocs-glasses-wonder.md
@@ -0,0 +1,5 @@
+---
+'@backstage/techdocs-common': patch
+---
+
+TechDocs backend now streams files through from Google Cloud Storage to the browser, improving memory usage.
diff --git a/.changeset/techdocs-mean-items-behave.md b/.changeset/techdocs-mean-items-behave.md
deleted file mode 100644
index 77679c39d4..0000000000
--- a/.changeset/techdocs-mean-items-behave.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/techdocs-common': patch
----
-
-@backstage/techdocs-common can now be imported in an environment without @backstage/plugin-techdocs-backend being installed.
diff --git a/.changeset/twelve-ants-sort.md b/.changeset/twelve-ants-sort.md
new file mode 100644
index 0000000000..978047ab8e
--- /dev/null
+++ b/.changeset/twelve-ants-sort.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-auth-backend': patch
+---
+
+Add AWS ALB OIDC reverse proxy authentication provider
diff --git a/.changeset/warm-months-bake.md b/.changeset/warm-months-bake.md
new file mode 100644
index 0000000000..c8f3723eb1
--- /dev/null
+++ b/.changeset/warm-months-bake.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-lighthouse': patch
+---
+
+Fix display of floating point precision errors in card category scores
diff --git a/.changeset/wise-mice-invite.md b/.changeset/wise-mice-invite.md
new file mode 100644
index 0000000000..9021336c07
--- /dev/null
+++ b/.changeset/wise-mice-invite.md
@@ -0,0 +1,5 @@
+---
+'@backstage/backend-common': minor
+---
+
+Remove support for HTTPS certificate generation parameters. Use `backend.https = true` instead.
diff --git a/.changeset/yellow-ties-switch.md b/.changeset/yellow-ties-switch.md
new file mode 100644
index 0000000000..784d2a18ae
--- /dev/null
+++ b/.changeset/yellow-ties-switch.md
@@ -0,0 +1,5 @@
+---
+'@backstage/catalog-model': minor
+---
+
+The catalog no longer attempts to merge old and new annotations, when updating an entity from a remote location. This was a behavior that was copied from kubernetes, and catered to use cases where you wanted to use HTTP POST to update an entity in-place, outside of what the refresh loop does. This has proved to be a mistake, because as a side effect, the refresh loop effectively is unable to ever delete annotations when they are removed from source YAML. This is obviously a breaking change, but we believe that this is not a behavior that is relied upon in the wild, and it has never been an actually supported use flow of the catalog. We therefore choose to break the behavior outright, and instead just store updated annotations verbatim - just like we already do for example for labels
diff --git a/.github/styles/vocab.txt b/.github/styles/vocab.txt
index 3188d059f6..03f84f4417 100644
--- a/.github/styles/vocab.txt
+++ b/.github/styles/vocab.txt
@@ -67,6 +67,7 @@ Dominik
dtuite
dzolotusky
Ek
+etag
env
Env
eslint
@@ -78,6 +79,7 @@ Firekube
Fiverr
freben
Fredrik
+Georgoulas
gitbeaker
GitHub
GitLab
@@ -100,6 +102,7 @@ incentivised
inlined
inlinehilite
interop
+Ioannis
JavaScript
jq
js
@@ -113,6 +116,7 @@ Kumar
learnings
lerna
Lerna
+Luxon
magiclink
mailto
maintainership
diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml
index 6f45968002..68b08224ac 100644
--- a/.github/workflows/master.yml
+++ b/.github/workflows/master.yml
@@ -8,6 +8,9 @@ jobs:
build:
runs-on: ubuntu-latest
+ outputs:
+ needs_release: ${{ steps.release_check.outputs.needs_release }}
+
strategy:
matrix:
node-version: [12.x, 14.x]
@@ -47,6 +50,15 @@ jobs:
run: yarn install --frozen-lockfile
# End of yarn setup
+ - name: Fetch previous commit for release check
+ run: git fetch origin '${{ github.event.before }}'
+
+ - name: Check if release
+ id: release_check
+ run: node scripts/check-if-release.js
+ env:
+ COMMIT_SHA_BEFORE: '${{ github.event.before }}'
+
- name: validate config
run: yarn backstage-cli config:check
@@ -82,9 +94,10 @@ jobs:
# We can't re-use the output from the above step, but we'll have a guaranteed node_modules cache and
# only run the build steps that are necessary for publishing
release:
- if: contains(github.event.commits.*.author.username, 'github-actions[bot]') && contains(github.event.head_commit.message, 'from backstage/changeset-release/master')
needs: build
+ if: needs.build.outputs.needs_release == 'true'
+
runs-on: ubuntu-latest
strategy:
diff --git a/ADOPTERS.md b/ADOPTERS.md
index f7d1114008..363c092198 100644
--- a/ADOPTERS.md
+++ b/ADOPTERS.md
@@ -18,3 +18,4 @@
| [Zalando SE](https://www.zalando.de) | [@leviferreira](https://github.com/leviferreira) | Building V2 of the Internal Development Portal. |
| [LegalZoom](https://legalzoom.com) | [@backjo](https://github.com/backjo) | Developer portal - hub for all engineering projects and metadata. |
| [Expedia Group](https://www.expediagroup.com) | [Mike Turner](mailto:miturner@expediagroup.com), [Sneha Kumar](mailto:snkumar@expediagroup.com), [@guillermomanzo](https://github.com/guillermomanzo) | EG Common Developer Toolkit |
+| [Paddle.com](https://paddle.com) | [Ioannis Georgoulas](https://github.com/geototti21) | Developer portal (Tech Docs, Service Catalog, Internal Tooling), we use vanilla Backstage FE and custom BE implementation in Go |
diff --git a/README.md b/README.md
index d2e01195d4..7c04672998 100644
--- a/README.md
+++ b/README.md
@@ -39,7 +39,7 @@ Check out [the documentation](https://backstage.io/docs/getting-started) on how
- [Main documentation](https://backstage.io/docs)
- [Service Catalog](https://backstage.io/docs/features/software-catalog/software-catalog-overview)
-- [Architecture](https://backstage.io/docs/overview/architecture-terminology) ([Decisions](https://backstage.io/docs/architecture-decisions/adrs-overview))
+- [Architecture](https://backstage.io/docs/overview/architecture-overview) ([Decisions](https://backstage.io/docs/architecture-decisions/adrs-overview))
- [Designing for Backstage](https://backstage.io/docs/dls/design)
- [Storybook - UI components](https://backstage.io/storybook)
@@ -57,6 +57,6 @@ Check out [the documentation](https://backstage.io/docs/getting-started) on how
## License
-Copyright 2020 © Backstage Project Authors. All rights reserved. The Linux Foundation has registered trademarks and uses trademarks. For a list of trademarks of The Linux Foundation, please see our Trademark Usage page: https://www.linuxfoundation.org/trademark-usage
+Copyright 2020-2021 © Backstage Project Authors. All rights reserved. The Linux Foundation has registered trademarks and uses trademarks. For a list of trademarks of The Linux Foundation, please see our Trademark Usage page: https://www.linuxfoundation.org/trademark-usage
Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0
diff --git a/app-config.yaml b/app-config.yaml
index 5866354a87..741991877e 100644
--- a/app-config.yaml
+++ b/app-config.yaml
@@ -16,6 +16,10 @@ backend:
credentials: true
csp:
connect-src: ["'self'", 'http:', 'https:']
+ reading:
+ allow:
+ - host: example.com
+ - host: '*.mozilla.org'
# workingDirectory: /tmp # Use this to configure a working directory for the scaffolder, defaults to the OS temp-dir
# See README.md in the proxy-backend plugin for information on the configuration format
diff --git a/catalog-info.yaml b/catalog-info.yaml
index 2144d1709c..7e60af5755 100644
--- a/catalog-info.yaml
+++ b/catalog-info.yaml
@@ -6,7 +6,7 @@ metadata:
Backstage is an open-source developer portal that puts the developer experience first.
annotations:
github.com/project-slug: backstage/backstage
- backstage.io/techdocs-ref: url:https://github.com/backstage/backstage/tree/master
+ backstage.io/techdocs-ref: url:https://github.com/backstage/backstage
lighthouse.com/website-url: https://backstage.io
spec:
type: library
diff --git a/Dockerfile b/contrib/docker/frontend-with-nginx/Dockerfile
similarity index 90%
rename from Dockerfile
rename to contrib/docker/frontend-with-nginx/Dockerfile
index 174548a90c..a444c9de83 100644
--- a/Dockerfile
+++ b/contrib/docker/frontend-with-nginx/Dockerfile
@@ -8,8 +8,6 @@ FROM nginx:mainline
# This dockerfile requires the app to be built on the host first, as it
# simply copies in the build output into the image.
-# The safest way to build this image is to use `yarn docker-build:app`
-
RUN apt-get update && apt-get -y install jq && rm -rf /var/lib/apt/lists/*
COPY packages/app/dist /usr/share/nginx/html
diff --git a/docker/default.conf.template b/contrib/docker/frontend-with-nginx/docker/default.conf.template
similarity index 100%
rename from docker/default.conf.template
rename to contrib/docker/frontend-with-nginx/docker/default.conf.template
diff --git a/docker/run.sh b/contrib/docker/frontend-with-nginx/docker/run.sh
similarity index 100%
rename from docker/run.sh
rename to contrib/docker/frontend-with-nginx/docker/run.sh
diff --git a/docs/architecture-decisions/adr000-template.md b/docs/architecture-decisions/adr000-template.md
index 783db8e4bc..538afccf87 100644
--- a/docs/architecture-decisions/adr000-template.md
+++ b/docs/architecture-decisions/adr000-template.md
@@ -4,18 +4,10 @@ title: ADR000: [TITLE]
description: Architecture Decision Record (ADR) for [TITLE] [DESCRIPTION]
---
-| Created | Status |
-| ---------- | ------ |
-| YYYY-MM-DD | Open |
-
# ADR000: [title]
-## Status
-
-
-
## Context