diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml
index 04b50c3e60..354838037e 100644
--- a/.github/workflows/master.yml
+++ b/.github/workflows/master.yml
@@ -74,3 +74,11 @@ jobs:
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
package_root: "packages/core"
tag_prefix: "v"
+
+ - name: Discord notification
+ if: ${{ failure() }}
+ uses: Ilshidur/action-discord@0.2.0
+ env:
+ DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
+ with:
+ args: 'Master build failed https://github.com/{{GITHUB_REPOSITORY}}/actions/runs/{{GITHUB_RUN_ID}}'
diff --git a/.gitignore b/.gitignore
index 743561c3b6..aee80f4c10 100644
--- a/.gitignore
+++ b/.gitignore
@@ -92,6 +92,7 @@ dist
# Microsite build output
microsite/build
+microsite/i18n
# Gatsby files
.cache/
diff --git a/ADOPTERS.md b/ADOPTERS.md
index dc02ad3b85..0ba3e3196b 100644
--- a/ADOPTERS.md
+++ b/ADOPTERS.md
@@ -12,3 +12,4 @@
| [Voi](https://www.voiscooters.com/) | [@K-Phoen](https://github.com/K-Phoen) | Developer portal, main gateway to our infrastructure, documentation and internal tooling. |
| [Talkdesk](https://www.talkdesk.com) | [@jaime-talkdesk](https://github.com/jaime-talkdesk) | Initial work for Engineering Portal and Self Provisioning to R&D |
| [Wealthsimple](https://www.wealthsimple.com) | [@andrewthauer](https://github.com/andrewthauer) | Developer portal, service catalog, documentation and tooling |
+| [Grab](https://www.grab.com) | [@althafh](https://github.com/althafh) | Initial work as a unified interface for all of Grab's internal tooling |
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ce39a9f8d2..20ae9a414d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,15 @@ If you encounter issues while upgrading to a newer version, don't hesitate to re
> Collect changes for the next release below
+- The backend plugin
+ [service builder](https://github.com/spotify/backstage/blob/master/packages/backend-common/src/service/lib/ServiceBuilderImpl.ts)
+ no longer adds `express.json()` automatically to all routes. While convenient
+ in a lot of cases, it also led to problems where for example the proxy
+ middleware could hang because the body had already been altered and could not
+ be streamed. Also, plugins that rather wanted to handle e.g. form encoded data
+ still had to cater to that manually. We therefore decided to let plugins add
+ `express.json()` themselves if they happen to deal with JSON data.
+
## v0.1.1-alpha.20
- Includes https://github.com/spotify/backstage/pull/2097 to resolve issues with create-plugin command.
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 5b8febd1d2..853332f74d 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,7 +1,4 @@
----
-id: CONTRIBUTING
-title: Contributing
----
+# Contributing to Backstage
Our vision for Backstage is for it to become the trusted standard toolbox (read: UX layer) for the open source infrastructure landscape. Think of it like Kubernetes for developer experience. We realize this is an ambitious goal. We canโt do it alone.
@@ -31,7 +28,7 @@ What kind of plugins should/could be created? Some inspiration from the 120+ plu
## Suggesting a plugin
-If you start developing a plugin that you aim to release as open source, we suggest that you create a new [new Issue](https://github.com/spotify/backstage/issues/new?template=plugin_template.md). This helps the community know what plugins are in development.
+If you start developing a plugin that you aim to release as open source, we suggest that you create a new [new Issue](https://github.com/spotify/backstage/issues/new?labels=plugin&template=plugin_template.md&title=%5BPlugin%5D+THE+PLUGIN+NAME). This helps the community know what plugins are in development.
You can also use this process if you have an idea for a good plugin but you hope that someone else will pick up the work.
diff --git a/README.md b/README.md
index b5e8704548..4009864edc 100644
--- a/README.md
+++ b/README.md
@@ -61,7 +61,7 @@ Take a look at the [Getting Started](https://backstage.io/docs/getting-started/i
## Documentation
-- [Main documentation](https://backstage.io/docs/overview/what-is-backstage)
+- [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))
- [Designing for Backstage](https://backstage.io/docs/dls/design)
diff --git a/app-config.yaml b/app-config.yaml
index 3b3733cf54..7a8863495e 100644
--- a/app-config.yaml
+++ b/app-config.yaml
@@ -48,6 +48,8 @@ lighthouse:
baseUrl: http://localhost:3003
catalog:
+ rules:
+ - allow: [Component, API, Group, Template, Location]
processors:
githubApi:
privateToken:
diff --git a/docs/features/software-catalog/configuration.md b/docs/features/software-catalog/configuration.md
new file mode 100644
index 0000000000..be6314e494
--- /dev/null
+++ b/docs/features/software-catalog/configuration.md
@@ -0,0 +1,58 @@
+---
+id: software-catalog-configuration
+title: Catalog Configuration
+---
+
+## Static Location Configuration
+
+To enable declarative catalog setups, it is possible to add locations to the
+catalog via [static configuration](../../conf/index.md). Locations are added to
+the catalog under the `catalog.locations` key, for example:
+
+```yaml
+catalog:
+ locations:
+ - type: github
+ target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/artist-lookup-component.yaml
+```
+
+The locations added through static configuration can not be removed through the
+catalog locations API. To remove the locations, you have to remove them from the
+configuration.
+
+## Catalog Rules
+
+By default the catalog will only allow ingestion of entities with the kind
+`Component`, `API` and `Location`. In order to allow entities of other kinds to
+be added, you need to add rules to the catalog. Rules are added either in a
+separate `catalog.rules` key, or added to statically configured locations.
+
+For example, given the following configuration:
+
+```yaml
+catalog:
+ rules:
+ - allow: [Component, API, Location, Template]
+
+ locations:
+ - type: github
+ target: https://github.com/org/example/blob/master/org-data.yaml
+ rules:
+ - allow: [Group]
+```
+
+We are able to add entities of kind `Component`, `API`, `Location`, or
+`Template` from any location, and `Group` entities from the `org-data.yaml`,
+which will also be read as statically configured location.
+
+Note that if the `catalog.rules` key is present it will replace the default
+value, meaning that you need to add rules for the default kinds if you want
+those to still be allowed.
+
+The following configuration will reject any kind of entities from being added to
+the catalog:
+
+```yaml
+catalog:
+ rules: []
+```
diff --git a/docs/features/software-catalog/index.md b/docs/features/software-catalog/index.md
index db8c183390..bfc3d53d4d 100644
--- a/docs/features/software-catalog/index.md
+++ b/docs/features/software-catalog/index.md
@@ -79,6 +79,22 @@ All software created through the
[Backstage Software Templates](../software-templates/index.md) are automatically
registered in the catalog.
+### Static catalog configuration
+
+In addition to manually registering components, it is also possible to register
+components though [static configuration](../../conf/index.md). For example, the
+above example can be added using the following configuration:
+
+```yaml
+catalog:
+ locations:
+ - type: github
+ target: https://github.com/spotify/backstage/blob/master/packages/catalog-model/examples/artist-lookup-component.yaml
+```
+
+More information about catalog configuration can be found
+[here](configuration.md).
+
### Updating component metadata
Teams owning the components are responsible for maintaining the metadata about
diff --git a/docs/features/software-templates/adding-templates.md b/docs/features/software-templates/adding-templates.md
index 67467bd98e..4f7af7c015 100644
--- a/docs/features/software-templates/adding-templates.md
+++ b/docs/features/software-templates/adding-templates.md
@@ -58,6 +58,29 @@ Currently the catalog supports loading definitions from GitHub + Local Files. To
load from other places, not only will there need to be another preparer, but the
support to load the location will also need to be added to the Catalog.
+You can add the template files to the catalog through
+[static location configuration](../software-catalog/configuration.md#static-location-configuration),
+for example
+
+```yaml
+catalog:
+ locations:
+ - type: github
+ target: https://github.com/spotify/cookiecutter-golang/blob/master/template.yaml
+ rules:
+ - allow: [Template]
+```
+
+Templates can also be added by posting the to the catalog directly. Note that if
+you're doing this, you need to configure the catalog to allow template entities
+to be ingested from any source, for example:
+
+```yaml
+catalog:
+ rules:
+ - allow: [Component, API, Template]
+```
+
For loading from a file, the following command should work when the backend is
running:
diff --git a/docs/overview/roadmap.md b/docs/overview/roadmap.md
index a84bc525c9..5a06f4544f 100644
--- a/docs/overview/roadmap.md
+++ b/docs/overview/roadmap.md
@@ -79,18 +79,26 @@ guidelines to get started.
- Further improvements to platform documentation
+### Plugins
+
+Building and maintaining [plugins](https://backstage.io/plugins) is the work of
+the entire Backstage community.
+
+A list of plugins that are in development is
+[available here](https://github.com/spotify/backstage/issues?q=is%3Aissue+is%3Aopen+label%3Aplugin+sort%3Areactions-%2B1-desc).
+We strongly recommend to upvote ๐ plugins you are interested in. This helps us
+and the community prioritize what plugins to build.
+
+Are you missing a plugin for your favorite tool? Please
+[suggest a new one](https://github.com/spotify/backstage/issues/new?labels=plugin&template=plugin_template.md&title=%5BPlugin%5D+THE+PLUGIN+NAME).
+Chances are that someone will jump in and help build it.
+
### Future work ๐ฎ
- **[Backstage platform is stable](https://github.com/spotify/backstage/milestone/19)** -
The platform APIs and features are stable and can be depended on for
production use. After this plugins will require little to no maintenance.
-- **[Plugin marketplace](https://github.com/spotify/backstage/issues/2009)** -
- As the ecosystem of Backstage plugins continues to grow it is becoming
- increasingly hard to keep track of what plugins are available. To solve this
- we imagine a "Plugin marketplace" that helps with discovery and installation
- of plugins.
-
- **Deploy a product demo at `demo.backstage.io`** - Deploy a typical Backstage
deployment available publicly so that people can click around and get a feel
for the product without having to install anything.
@@ -111,6 +119,7 @@ guidelines to get started.
### Completed milestones โ
+- [Plugin marketplace](https://backstage.io/plugins)
- [Improved and move documentation to backstage.io](https://backstage.io/docs/overview/what-is-backstage)
- [Backstage Service Catalog (alpha)](https://backstage.io/blog/2020/06/22/backstage-service-catalog-alpha)
- [Backstage Software Templates (alpha)](https://backstage.io/blog/2020/08/05/announcing-backstage-software-templates)
diff --git a/docs/plugins/add-to-marketplace.md b/docs/plugins/add-to-marketplace.md
index 23cfecd5d0..d85807a226 100644
--- a/docs/plugins/add-to-marketplace.md
+++ b/docs/plugins/add-to-marketplace.md
@@ -6,7 +6,9 @@ title: Add to Marketplace
## Adding a Plugin to the Marketplace
To add a new plugin to the [plugin marketplace](https://backstage.io/plugins)
-create a file in `data/plugins` with your plugin's information. Example:
+create a file in
+[`microsite/data/plugins`](https://github.com/spotify/backstage/tree/master/microsite/data/plugins)
+with your plugin's information. Example:
```yaml
---
diff --git a/docs/plugins/publishing.md b/docs/plugins/publishing.md
index 1d16ebb047..6fee4f9b1d 100644
--- a/docs/plugins/publishing.md
+++ b/docs/plugins/publishing.md
@@ -39,4 +39,18 @@ $ git push origin -u new-release
And then create a PR. Once the PR is approved and merged into master, the master
build will publish new versions of all bumped packages.
+### Include new changes in existing release PR
+
+If you want to include some last minute changes to an existing release PR,
+follow these instructions:
+
+```sh
+$ git checkout master
+$ git pull
+$ git checkout new-release
+$ git reset --hard master
+$ yarn release
+$ git push --force
+```
+
[Back to Docs](../README.md)
diff --git a/microsite/core/Footer.js b/microsite/core/Footer.js
index 407bebca84..761862c1fc 100644
--- a/microsite/core/Footer.js
+++ b/microsite/core/Footer.js
@@ -45,6 +45,9 @@ class Footer extends React.Component {
Community
Support chatroom
+
+ Contributing
+
Subscribe to our newsletter
diff --git a/microsite/data/plugins/api-docs.yaml b/microsite/data/plugins/api-docs.yaml
new file mode 100644
index 0000000000..babcbf74f1
--- /dev/null
+++ b/microsite/data/plugins/api-docs.yaml
@@ -0,0 +1,9 @@
+---
+title: API Docs
+author: SDA SE
+authorUrl: https://sda.se/
+category: Discovery
+description: Components to discover and display API entities as an extension to the catalog plugin.
+documentation: https://github.com/spotify/backstage/blob/master/plugins/api-docs/README.md
+iconUrl: https://thecoders.io/wp-content/uploads/2019/11/tech-swagger.svg
+npmPackageName: '@backstage/plugin-api-docs'
diff --git a/microsite/data/plugins/circleci.yaml b/microsite/data/plugins/circleci.yaml
new file mode 100644
index 0000000000..6937064815
--- /dev/null
+++ b/microsite/data/plugins/circleci.yaml
@@ -0,0 +1,9 @@
+---
+title: CircleCI
+author: Spotify
+authorUrl: https://www.spotify.com/
+category: CI
+description: Automate your development process with CI hosted in the cloud or on a private server.
+documentation: https://github.com/spotify/backstage/tree/master/plugins/circleci
+iconUrl: https://www.saaves.com/storage/brochure/logo-circleci-icon1583764538.png
+npmPackageName: '@backstage/plugin-circleci'
diff --git a/microsite/data/plugins/github-actions.yaml b/microsite/data/plugins/github-actions.yaml
new file mode 100644
index 0000000000..b384980b2a
--- /dev/null
+++ b/microsite/data/plugins/github-actions.yaml
@@ -0,0 +1,13 @@
+---
+title: GitHub Actions
+author: Spotify
+authorUrl: https://www.spotify.com/
+category: CI
+description: GitHub Actions makes it easy to automate all your software workflows, now with world-class CI/CD. Build, test, and deploy your code right from GitHub.
+documentation: https://github.com/spotify/backstage/tree/master/plugins/github-actions
+iconUrl: https://avatars2.githubusercontent.com/u/44036562?s=400&v=4
+npmPackageName: '@backstage/plugin-github-actions'
+tags:
+ - ci
+ - cd
+ - github
diff --git a/microsite/data/plugins/github-pull-requests.yaml b/microsite/data/plugins/github-pull-requests.yaml
new file mode 100644
index 0000000000..917198a221
--- /dev/null
+++ b/microsite/data/plugins/github-pull-requests.yaml
@@ -0,0 +1,10 @@
+---
+title: GitHub Pull Requests
+author: roadie.io
+authorUrl: https://roadie.io/
+category: CI
+description: View GitHub pull requests for your service in Backstage.
+documentation: https://roadie.io/backstage/plugins/github-pull-requests
+iconUrl: https://roadie.io/static/7f13bb8d861d8dedc5112fb939d215f9/351f2/GitHub-Mark-Light-120px-plus.png
+npmPackageName: '@roadiehq/backstage-plugin-github-pull-requests'
+
diff --git a/microsite/data/plugins/gitops-cluster.yaml b/microsite/data/plugins/gitops-cluster.yaml
new file mode 100644
index 0000000000..6f8ab6b097
--- /dev/null
+++ b/microsite/data/plugins/gitops-cluster.yaml
@@ -0,0 +1,14 @@
+---
+title: GitOps Clusters
+author: Weaveworks
+authorUrl: https://www.weave.works/
+category: Kubernetes
+description: Create GitOps-managed Kubernetes clusters. Currently, it supports provisioning EKS clusters on GitHub via GitHub Actions.
+documentation: https://github.com/spotify/backstage/tree/master/plugins/gitops-profiles
+iconUrl: https://res-5.cloudinary.com/crunchbase-production/image/upload/c_lpad,h_256,w_256,f_auto,q_auto:eco/v1462316670/i9d3delzvx1erzjhmcws.png
+npmPackageName: '@backstage/plugin-gitops-profiles'
+tags:
+ - kubernetes
+ - gitops
+ - github
+ - eks
diff --git a/microsite/data/plugins/graphiql.yaml b/microsite/data/plugins/graphiql.yaml
new file mode 100644
index 0000000000..73733c84fd
--- /dev/null
+++ b/microsite/data/plugins/graphiql.yaml
@@ -0,0 +1,13 @@
+---
+title: GraphiQL
+author: Spotify
+authorUrl: https://www.spotify.com/
+category: Debugging
+description: Integrates GraphiQL as a tool to browse GraphiQL endpoints inside Backstage.
+documentation: https://github.com/spotify/backstage/tree/master/plugins/lighthouse
+iconUrl: https://upload.wikimedia.org/wikipedia/commons/thumb/1/17/GraphQL_Logo.svg/1024px-GraphQL_Logo.svg.png
+npmPackageName: '@backstage/plugin-graphiql'
+tags:
+ - graphql
+ - github
+ - gitlab
diff --git a/microsite/data/plugins/lighthouse.yaml b/microsite/data/plugins/lighthouse.yaml
new file mode 100644
index 0000000000..15a650f0bd
--- /dev/null
+++ b/microsite/data/plugins/lighthouse.yaml
@@ -0,0 +1,14 @@
+---
+title: Lighthouse
+author: Spotify
+authorUrl: https://www.spotify.com/
+category: Accessibility
+description: Google's Lighthouse tool is a great resource for benchmarking and improving the accessibility, performance, SEO, and best practices of your website.
+documentation: https://github.com/spotify/backstage/tree/master/plugins/lighthouse
+iconUrl: https://seeklogo.com/images/G/google-lighthouse-logo-1C7FA08580-seeklogo.com.png
+npmPackageName: '@backstage/plugin-lighthouse'
+tags:
+ - web
+ - seo
+ - accessibility
+ - performance
diff --git a/microsite/data/plugins/new-relic.yaml b/microsite/data/plugins/new-relic.yaml
new file mode 100644
index 0000000000..e3ddf18652
--- /dev/null
+++ b/microsite/data/plugins/new-relic.yaml
@@ -0,0 +1,14 @@
+---
+title: New Relic
+author: '@timwheelercom'
+authorUrl: https://github.com/timwheelercom
+category: Monitoring
+description: Observability platform built to help engineers create and monitor their software.
+documentation: https://github.com/spotify/backstage/tree/master/plugins/newrelic
+iconUrl: https://www.mulesoft.com/sites/default/files/2018-10/New_relic.png
+npmPackageName: '@backstage/plugin-newrelic'
+tags:
+ - performance
+ - monitoring
+ - errors
+ - alerting
diff --git a/microsite/data/plugins/tech-radar.yaml b/microsite/data/plugins/tech-radar.yaml
new file mode 100644
index 0000000000..585e204b12
--- /dev/null
+++ b/microsite/data/plugins/tech-radar.yaml
@@ -0,0 +1,9 @@
+---
+title: Tech Radar
+author: Spotify
+authorUrl: https://www.spotify.com/
+category: Discovery
+description: Visualize the your company's official guidelines of different areas of software development.
+documentation: https://github.com/spotify/backstage/tree/master/plugins/tech-radar
+iconUrl: https://img.icons8.com/officel/2x/radar.png
+npmPackageName: '@backstage/plugin-tech-radar'
diff --git a/microsite/i18n/en.json b/microsite/i18n/en.json
deleted file mode 100644
index f61442e938..0000000000
--- a/microsite/i18n/en.json
+++ /dev/null
@@ -1,325 +0,0 @@
-{
- "_comment": "This file is auto-generated by write-translations.js",
- "localized-strings": {
- "next": "Next",
- "previous": "Previous",
- "tagline": "An open platform for building developer portals",
- "docs": {
- "api/backend": {
- "title": "Backend"
- },
- "api/utility-apis": {
- "title": "Utility APIs"
- },
- "architecture-decisions/adrs-adr001": {
- "title": "ADR001: Architecture Decision Record (ADR) log",
- "sidebar_label": "ADR001"
- },
- "architecture-decisions/adrs-adr002": {
- "title": "ADR002: Default Software Catalog File Format",
- "sidebar_label": "ADR002"
- },
- "architecture-decisions/adrs-adr003": {
- "title": "ADR003: Avoid Default Exports and Prefer Named Exports",
- "sidebar_label": "ADR003"
- },
- "architecture-decisions/adrs-adr004": {
- "title": "ADR004: Module Export Structure",
- "sidebar_label": "ADR004"
- },
- "architecture-decisions/adrs-adr005": {
- "title": "ADR005: Catalog Core Entities",
- "sidebar_label": "ADR005"
- },
- "architecture-decisions/adrs-adr006": {
- "title": "ADR006: Avoid React.FC and React.SFC",
- "sidebar_label": "ADR006"
- },
- "architecture-decisions/adrs-adr007": {
- "title": "ADR007: Use MSW to mock http requests",
- "sidebar_label": "ADR007"
- },
- "architecture-decisions/adrs-adr008": {
- "title": "ADR008: Default Catalog File Name",
- "sidebar_label": "ADR008"
- },
- "architecture-decisions/adrs-overview": {
- "title": "Architecture Decision Records (ADR)",
- "sidebar_label": "Overview"
- },
- "auth/add-auth-provider": {
- "title": "Adding authentication providers"
- },
- "auth/auth-backend-classes": {
- "title": "Auth backend classes"
- },
- "auth/auth-backend": {
- "title": "Auth backend"
- },
- "auth/glossary": {
- "title": "Glossary"
- },
- "auth/index": {
- "title": "User Authentication and Authorization in Backstage"
- },
- "auth/oauth": {
- "title": "OAuth and OpenID Connect"
- },
- "conf/defining": {
- "title": "Defining Configuration for your Plugin"
- },
- "conf/index": {
- "title": "Static Configuration in Backstage"
- },
- "conf/reading": {
- "title": "Reading Backstage Configuration"
- },
- "conf/writing": {
- "title": "Writing Backstage Configuration Files"
- },
- "dls/contributing-to-storybook": {
- "title": "Contributing to Storybook"
- },
- "dls/design": {
- "title": "Design"
- },
- "dls/figma": {
- "title": "Figma"
- },
- "FAQ": {
- "title": "FAQ"
- },
- "features/software-catalog/software-catalog-api": {
- "title": "API"
- },
- "features/software-catalog/descriptor-format": {
- "title": "Descriptor Format of Catalog Entities",
- "sidebar_label": "YAML File Format"
- },
- "features/software-catalog/extending-the-model": {
- "title": "Extending the model"
- },
- "features/software-catalog/external-integrations": {
- "title": "External integrations"
- },
- "features/software-catalog/software-catalog-overview": {
- "title": "Backstage Service Catalog (alpha)",
- "sidebar_label": "Backstage Service Catalog"
- },
- "features/software-catalog/installation": {
- "title": "features/software-catalog/installation"
- },
- "features/software-catalog/system-model": {
- "title": "System Model"
- },
- "features/software-templates/adding-templates": {
- "title": "Adding your own Templates"
- },
- "features/software-templates/extending/extending-preparer": {
- "title": "Create your own Preparer"
- },
- "features/software-templates/extending/extending-publisher": {
- "title": "Create your own Publisher"
- },
- "features/software-templates/extending/extending-templater": {
- "title": "Creating your own Templater"
- },
- "features/software-templates/extending/extending-index": {
- "title": "Extending the Scaffolder"
- },
- "features/software-templates/software-templates-index": {
- "title": "Software Templates"
- },
- "features/software-templates/installation": {
- "title": "features/software-templates/installation"
- },
- "features/techdocs/concepts": {
- "title": "Concepts"
- },
- "features/techdocs/creating-and-publishing": {
- "title": "Creating and publishing your docs",
- "sidebar_label": "Creating and Publishing Documentation"
- },
- "features/techdocs/faqs": {
- "title": "TechDocs FAQ",
- "sidebar_label": "FAQ"
- },
- "features/techdocs/getting-started": {
- "title": "Getting Started"
- },
- "features/techdocs/techdocs-overview": {
- "title": "TechDocs Documentation",
- "sidebar_label": "Overview"
- },
- "getting-started/app-custom-theme": {
- "title": "Customize the look-and-feel of your App"
- },
- "getting-started/configure-app-with-plugins": {
- "title": "Configuring App with plugins"
- },
- "getting-started/create-an-app": {
- "title": "Create an App"
- },
- "getting-started/deployment-k8s": {
- "title": "Kubernetes"
- },
- "getting-started/deployment-other": {
- "title": "Other"
- },
- "getting-started/development-environment": {
- "title": "Development Environment"
- },
- "getting-started/index": {
- "title": "Running Backstage Locally"
- },
- "getting-started/installation": {
- "title": "Installation"
- },
- "overview/adopting": {
- "title": "Strategies for adopting"
- },
- "overview/architecture-overview": {
- "title": "Architecture overview"
- },
- "overview/architecture-terminology": {
- "title": "Architecture terminology"
- },
- "overview/background": {
- "title": "The Spotify Story"
- },
- "overview/roadmap": {
- "title": "Project roadmap"
- },
- "overview/support": {
- "title": "Support and community"
- },
- "overview/vision": {
- "title": "Vision"
- },
- "overview/what-is-backstage": {
- "title": "What is Backstage?"
- },
- "plugins/add-to-marketplace": {
- "title": "Add to Marketplace"
- },
- "plugins/backend-plugin": {
- "title": "Backend plugin"
- },
- "plugins/call-existing-api": {
- "title": "Call Existing API"
- },
- "plugins/create-a-plugin": {
- "title": "Create a Backstage Plugin"
- },
- "plugins/existing-plugins": {
- "title": "Existing plugins"
- },
- "plugins/index": {
- "title": "Intro to plugins"
- },
- "plugins/plugin-development": {
- "title": "Plugin Development"
- },
- "plugins/proxying": {
- "title": "Proxying"
- },
- "plugins/publish-private": {
- "title": "Publish private"
- },
- "plugins/publishing": {
- "title": "Publishing"
- },
- "plugins/structure-of-a-plugin": {
- "title": "Structure of a Plugin"
- },
- "plugins/testing": {
- "title": "Testing with Jest"
- },
- "README": {
- "title": "README"
- },
- "reference/createPlugin-feature-flags": {
- "title": "createPlugin - feature flags"
- },
- "reference/createPlugin-router": {
- "title": "createPlugin - router"
- },
- "reference/createPlugin": {
- "title": "createPlugin"
- },
- "reference/utility-apis/AlertApi": {
- "title": "reference/utility-apis/AlertApi"
- },
- "reference/utility-apis/AppThemeApi": {
- "title": "reference/utility-apis/AppThemeApi"
- },
- "reference/utility-apis/BackstageIdentityApi": {
- "title": "reference/utility-apis/BackstageIdentityApi"
- },
- "reference/utility-apis/Config": {
- "title": "reference/utility-apis/Config"
- },
- "reference/utility-apis/ErrorApi": {
- "title": "reference/utility-apis/ErrorApi"
- },
- "reference/utility-apis/FeatureFlagsApi": {
- "title": "reference/utility-apis/FeatureFlagsApi"
- },
- "reference/utility-apis/IdentityApi": {
- "title": "reference/utility-apis/IdentityApi"
- },
- "reference/utility-apis/OAuthApi": {
- "title": "reference/utility-apis/OAuthApi"
- },
- "reference/utility-apis/OAuthRequestApi": {
- "title": "reference/utility-apis/OAuthRequestApi"
- },
- "reference/utility-apis/OpenIdConnectApi": {
- "title": "reference/utility-apis/OpenIdConnectApi"
- },
- "reference/utility-apis/ProfileInfoApi": {
- "title": "reference/utility-apis/ProfileInfoApi"
- },
- "reference/utility-apis/README": {
- "title": "Utility API References"
- },
- "reference/utility-apis/SessionStateApi": {
- "title": "reference/utility-apis/SessionStateApi"
- },
- "reference/utility-apis/StorageApi": {
- "title": "reference/utility-apis/StorageApi"
- },
- "tutorials/journey": {
- "title": "Future developer journey"
- }
- },
- "links": {
- "GitHub": "GitHub",
- "Docs": "Docs",
- "Blog": "Blog",
- "Demos": "Demos",
- "Plugins": "Plugins",
- "Newsletter": "Newsletter"
- },
- "categories": {
- "Overview": "Overview",
- "Getting Started": "Getting Started",
- "Features": "Features",
- "Plugins": "Plugins",
- "Configuration": "Configuration",
- "Auth and identity": "Auth and identity",
- "Designing for Backstage": "Designing for Backstage",
- "API references": "API references",
- "Tutorials": "Tutorials",
- "Architecture Decision Records (ADRs)": "Architecture Decision Records (ADRs)",
- "Contribute": "Contribute",
- "Support": "Support",
- "FAQ": "FAQ"
- }
- },
- "pages-strings": {
- "Help Translate|recruit community translators for your project": "Help Translate",
- "Edit this Doc|recruitment message asking to edit the doc source": "Edit",
- "Translate this Doc|recruitment message asking to translate the docs": "Translate"
- }
-}
diff --git a/microsite/pages/en/index.js b/microsite/pages/en/index.js
index 986db4b732..7a58ede25f 100644
--- a/microsite/pages/en/index.js
+++ b/microsite/pages/en/index.js
@@ -455,12 +455,8 @@ class Index extends React.Component {
Share with the community
- Building{' '}
-
- open source plugins
- {' '}
- contributes to the entire Backstage ecosystem, which benefits
- everyone
+ Building open source plugins contributes
+ to the entire Backstage ecosystem, which benefits everyone
@@ -472,7 +468,7 @@ class Index extends React.Component {
Build a plugin
-
+
Contribute
diff --git a/microsite/pages/en/plugins.js b/microsite/pages/en/plugins.js
index 916f34c21e..8c5f017e24 100644
--- a/microsite/pages/en/plugins.js
+++ b/microsite/pages/en/plugins.js
@@ -29,13 +29,14 @@ const Plugins = () => (
@@ -69,13 +70,44 @@ const Plugins = () => (
className="PluginCardLink ButtonFilled"
href={documentation}
>
- docs
+ Explore
),
)}
+
+
+
+ Do you have an existing plugin that you want to add to the
+ Marketplace?
+
+
+
+ Add to marketplace
+
+
+
+
+
+ See what plugins are already{' '}
+
+ in progress
+ {' '}
+ and ๐. Missing a plugin for your favorite tool? Please{' '}
+
+ suggest
+ {' '}
+ a new one.
+
+
+
diff --git a/microsite/static/css/custom.css b/microsite/static/css/custom.css
index 3c0184a07b..5e078582cc 100644
--- a/microsite/static/css/custom.css
+++ b/microsite/static/css/custom.css
@@ -216,7 +216,7 @@ td {
code {
font-family: IBM Plex Mono, Menlo, Monaco, Consolas, Courier New, monospace;
font-weight: 500;
- background-color: #0e0e0e;
+ background-color: #272822;
}
/* .stripe {
diff --git a/microsite/static/css/plugins.css b/microsite/static/css/plugins.css
index 042e2954e1..96fe3dac35 100644
--- a/microsite/static/css/plugins.css
+++ b/microsite/static/css/plugins.css
@@ -1,111 +1,112 @@
.PluginCard {
- background-color: #272822;
- height: 100%;
- padding: 16px;
- display: flex;
- flex-direction: column;
+ background-color: #272822;
+ height: 100%;
+ padding: 16px;
+ display: flex;
+ flex-direction: column;
}
.grid {
- display: grid;
- grid-gap: 1rem;
- grid-template-columns: repeat(4, 1fr);
- grid-auto-rows: 1fr;
- padding-top: 32px;
+ display: grid;
+ grid-gap: 1rem;
+ grid-template-columns: repeat(4, 1fr);
+ grid-auto-rows: 1fr;
+ padding-top: 32px;
}
@media (max-width: 1200px) {
- .grid {
- grid-template-columns: repeat(3, 1fr);
- }
+ .grid {
+ grid-template-columns: repeat(3, 1fr);
+ }
}
@media only screen and (max-width: 815px) {
- .grid {
- grid-template-columns: repeat(2, 1fr);
- }
+ .grid {
+ grid-template-columns: repeat(2, 1fr);
+ }
}
.PluginCard img {
- float: left;
- margin: 0px 16px 8px 0px;
- height: 100px;
- width: 100px;
+ float: left;
+ margin: 0px 16px 8px 0px;
+ height: 80px;
+ width: 80px;
}
.PluginCardHeader {
- max-height: fit-content;
- min-height: fit-content;
+ max-height: fit-content;
+ min-height: fit-content;
}
.PluginCardTitle {
- color: white;
- vertical-align: top;
- margin: 8px 0px 0px 16px;
+ color: white;
+ vertical-align: top;
+ margin: 8px 0px 0px 16px;
}
.PluginAddNewButton {
- position: absolute;
- bottom: 16px;
- right: 0px;
+ position: absolute;
+ bottom: 16px;
+ right: 0px;
}
.ButtonFilled {
- padding: 4px 8px;
- border-radius: 4px;
- background-color: #36BAA2;
- color: white;
- margin-top: 36px;
+ padding: 4px 8px;
+ border-radius: 4px;
+ background-color: #36baa2;
+ color: white;
+ margin-top: 36px;
}
.ButtonFilled:hover {
- border: 1px solid #36BAA2;
- background-color: transparent;
+ border: 1px solid #36baa2;
+ background-color: transparent;
}
.ChipOutlined {
- font-size: small;
- border-radius: 16px;
- padding: 2px 8px;
- border: 1px solid #36BAA2;
- color: #36BAA2;
+ font-size: small;
+ border-radius: 16px;
+ padding: 2px 8px;
+ border: 1px solid #36baa2;
+ color: #36baa2;
}
.PluginCardLink {
- padding: 2px 8px;
- position: absolute;
- bottom: 0;
- right: 0;
+ padding: 2px 8px;
+ position: absolute;
+ bottom: 0;
+ right: 0;
}
.PluginPageLayout {
- margin: auto;
- max-width: 1430px;
- padding: 20px;
+ margin: auto;
+ max-width: 1430px;
+ padding: 20px;
}
.PluginPageHeader {
- position: relative;
+ position: relative;
}
.PluginPageHeader h2 {
- display: inline-block;
+ display: inline-block;
}
.PluginCardBody {
- padding-top: 8px;
+ padding-top: 8px;
}
.PluginCardFooter {
- position: relative;
- min-height: 2em;
+ position: relative;
+ min-height: 2em;
}
-.Author, .Author a {
- margin-bottom: 0.25em;
- color: rgba(255,255,255, 0.6);
+.Author,
+.Author a {
+ margin-bottom: 0.25em;
+ color: rgba(255, 255, 255, 0.6);
}
- .Author a:hover {
- color: white;
+.Author a:hover {
+ color: white;
}
diff --git a/mkdocs.yml b/mkdocs.yml
index 637e45c0f0..b12c8f81c7 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -28,6 +28,7 @@ nav:
- Overview: 'features/software-catalog/index.md'
- System model: 'features/software-catalog/system-model.md'
- YAML File Format: 'features/software-catalog/descriptor-format.md'
+ - Configuration: 'features/software-catalog/configuration.md'
- Extending the model: 'features/software-catalog/extending-the-model.md'
- External integrations: 'features/software-catalog/external-integrations.md'
- API: 'features/software-catalog/api.md'
diff --git a/packages/app/package.json b/packages/app/package.json
index 13f2b83440..738370c2b9 100644
--- a/packages/app/package.json
+++ b/packages/app/package.json
@@ -2,6 +2,7 @@
"name": "example-app",
"version": "0.1.1-alpha.21",
"private": true,
+ "bundled": true,
"dependencies": {
"@backstage/cli": "^0.1.1-alpha.21",
"@backstage/core": "^0.1.1-alpha.21",
diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json
index 2f82634a2e..c9103375eb 100644
--- a/packages/backend-common/package.json
+++ b/packages/backend-common/package.json
@@ -46,7 +46,8 @@
"prom-client": "^12.0.0",
"selfsigned": "^1.10.7",
"stoppable": "^1.1.0",
- "winston": "^3.2.1"
+ "winston": "^3.2.1",
+ "logform": "^2.1.1"
},
"peerDependencies": {
"pg-connection-string": "^2.3.0"
diff --git a/packages/backend-common/src/database/connection.test.ts b/packages/backend-common/src/database/connection.test.ts
index 814503fda1..2cc3a54e06 100644
--- a/packages/backend-common/src/database/connection.test.ts
+++ b/packages/backend-common/src/database/connection.test.ts
@@ -15,7 +15,7 @@
*/
import { ConfigReader } from '@backstage/config';
-import { createDatabase } from './connection';
+import { createDatabaseClient } from './connection';
describe('database connection', () => {
const createConfig = (data: any) =>
@@ -26,10 +26,10 @@ describe('database connection', () => {
},
]);
- describe(createDatabase, () => {
+ describe(createDatabaseClient, () => {
it('returns a postgres connection', () => {
expect(
- createDatabase(
+ createDatabaseClient(
createConfig({
client: 'pg',
connection: {
@@ -45,7 +45,7 @@ describe('database connection', () => {
it('returns an sqlite connection', () => {
expect(
- createDatabase(
+ createDatabaseClient(
createConfig({
client: 'sqlite3',
connection: ':memory:',
@@ -56,7 +56,7 @@ describe('database connection', () => {
it('tries to create a mysql connection as a passthrough', () => {
expect(() =>
- createDatabase(
+ createDatabaseClient(
createConfig({
client: 'mysql',
connection: {
@@ -72,7 +72,7 @@ describe('database connection', () => {
it('accepts overrides', () => {
expect(
- createDatabase(
+ createDatabaseClient(
createConfig({
client: 'pg',
connection: {
@@ -93,7 +93,7 @@ describe('database connection', () => {
it('throws an error without a client', () => {
expect(() =>
- createDatabase(
+ createDatabaseClient(
createConfig({
connection: '',
}),
@@ -103,7 +103,7 @@ describe('database connection', () => {
it('throws an error without a connection', () => {
expect(() =>
- createDatabase(
+ createDatabaseClient(
createConfig({
client: 'pg',
}),
diff --git a/packages/backend-common/src/database/connection.ts b/packages/backend-common/src/database/connection.ts
index d968275482..009a85239f 100644
--- a/packages/backend-common/src/database/connection.ts
+++ b/packages/backend-common/src/database/connection.ts
@@ -15,30 +15,36 @@
*/
import knex from 'knex';
-import { ConfigReader } from '@backstage/config';
+import { Config } from '@backstage/config';
import { mergeDatabaseConfig } from './config';
-import { createPgDatabase } from './postgres';
-import { createSqlite3Database } from './sqlite3';
+import { createPgDatabaseClient } from './postgres';
+import { createSqliteDatabaseClient } from './sqlite3';
type DatabaseClient = 'pg' | 'sqlite3' | string;
/**
* Creates a knex database connection
*
- * @param config The database config
+ * @param dbConfig The database config
* @param overrides Additional options to merge with the config
*/
-export function createDatabase(
- config: ConfigReader,
+export function createDatabaseClient(
+ dbConfig: Config,
overrides?: Partial