merged master into the branch

Signed-off-by: bnechyporenko <bnechyporenko@bol.com>
This commit is contained in:
bnechyporenko
2024-02-15 10:50:22 +01:00
862 changed files with 12473 additions and 5012 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/backend-common': patch
---
Fix a bug with S3 Fetch that caused all objects to be flattened within a single folder on the local file system.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-react': minor
---
Added support for server side text filtering to paginated entity requests.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-api-docs': patch
---
Updated README to list AsyncApi v3 as supported
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-badges-backend': patch
---
Updating the `authorization` middleware to call the Catalog to check that the requesting user has permission to see the Entity before generating the UUID.
+8
View File
@@ -0,0 +1,8 @@
---
'@backstage/backend-common': minor
---
**BREAKING**: `A gitilesBaseUrl` must be provided for the Gerrit integration to work.
You can disable this check by setting `DISABLE_GERRIT_GITILES_REQUIREMENT=1` but
this will be removed in a future release. If you are not able to use the Gitiles
Gerrit plugin, please open an issue towards `https://github.com/backstage/backstage`
+7
View File
@@ -0,0 +1,7 @@
---
'@backstage/plugin-kubernetes-react': minor
---
**BREAKING** The `PodScope`, `PodAndErrors`, and `PodExecTerminalProps` types no
longer have a `clusterName` field; instead they now have the field `cluster`
which contains the full `ClusterAttributes`.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-auth-backend-module-oidc-provider': patch
---
Fixed a bug where the OIDC authenticator did not properly persist granted OAuth scopes.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-scaffolder-backend': patch
---
Fix some deprecations and misplaced `await` usage.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-kubernetes-react': patch
---
Pod dialogs display cluster title when specified.
+6
View File
@@ -0,0 +1,6 @@
---
'@backstage/plugin-kubernetes-react': patch
---
The `ErrorPanel` component will display the `title` field (when specified) for
clusters with errors.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-kubernetes-backend': patch
---
The `/clusters` API now surfaces cluster titles.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-kubernetes-common': patch
---
The `ClusterAttributes` type now includes the cluster title.
+7
View File
@@ -0,0 +1,7 @@
---
'@backstage/plugin-kubernetes': patch
'@backstage/plugin-kubernetes-react': patch
---
The `ErrorReporting` component's cluster column now displays cluster titles when
specified.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/theme': patch
---
Fixed missing extra variables like `applyDarkStyles` in Mui V5 theme after calling `createUnifiedThemeFromV4` function
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-scaffolder-backend-module-gitlab': patch
---
Use the Gitbeaker library for `gitlab:projectAccessToken:create` action, enabling the `expiresAt` option
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/backend-app-api': patch
---
Allow the `createConfigSecretEnumerator` to take an optional `schema` argument with an already-loaded global configuration schema.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog': minor
---
Updated the paginated catalog table to support server side text filtering.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend-module-github': patch
---
Added `validateLocationsExist` to the config
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/backend-common': patch
---
Add a User-Agent header for calls towards Google Cloud Storage.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-kubernetes-backend': patch
---
Responses from the `/api/kubernetes/services/:serviceId` endpoint now include the cluster title.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend': patch
---
Replace uses of deprecated types with replacements internally.
+53 -1
View File
@@ -1,5 +1,5 @@
{
"mode": "pre",
"mode": "exit",
"tag": "next",
"initialVersions": {
"example-app": "0.2.91",
@@ -281,8 +281,10 @@
"angry-phones-arrive",
"beige-apples-press",
"blue-keys-do",
"brave-jobs-invite",
"breezy-cobras-sin",
"brown-items-hammer",
"brown-peaches-hunt",
"calm-cups-rule",
"calm-items-double",
"calm-onions-exercise",
@@ -292,9 +294,12 @@
"cold-cheetahs-pull",
"cold-cooks-care",
"cool-islands-impress",
"cool-walls-applaud",
"create-app-1706621803",
"curvy-icons-peel",
"curvy-ladybugs-impress",
"cyan-bats-lick",
"cyan-ducks-sin",
"cyan-icons-rest",
"dirty-cheetahs-shave",
"dirty-mirrors-retire",
@@ -305,6 +310,8 @@
"dull-dolphins-explain",
"dull-fireants-repeat",
"eight-hounds-dream",
"eight-pumas-rule",
"eleven-walls-relate",
"empty-ligers-hang",
"fair-mirrors-hammer",
"famous-houses-thank",
@@ -314,15 +321,20 @@
"fifty-files-argue",
"flat-roses-happen",
"flat-wasps-fold",
"fluffy-jeans-eat",
"forty-beers-sniff",
"forty-cars-scream",
"forty-eagles-kick",
"four-mugs-try",
"four-walls-perform",
"fresh-gifts-smile",
"fresh-paws-raise",
"friendly-cheetahs-rescue",
"friendly-terms-love",
"funny-buttons-sip",
"funny-timers-visit",
"fuzzy-comics-collect",
"fuzzy-turtles-camp",
"giant-suits-switch",
"good-lemons-lick",
"gorgeous-bobcats-press",
@@ -332,34 +344,49 @@
"green-dogs-fold",
"green-flies-draw",
"grumpy-poets-study",
"happy-peas-hunt",
"healthy-bees-deliver",
"healthy-goats-jump",
"hip-ears-add",
"hot-horses-matter",
"hot-paws-tap",
"hot-pillows-poke",
"hot-tips-doubt",
"hungry-days-remain",
"hungry-lions-sit",
"khaki-seahorses-joke",
"kind-clouds-fly",
"kind-wombats-draw",
"large-frogs-grab",
"large-moons-speak",
"large-tables-wonder",
"late-poets-love",
"lazy-dolls-roll",
"lemon-cameras-remember",
"long-suns-bow",
"long-wasps-wait",
"loud-walls-compare",
"lovely-bugs-prove",
"lovely-starfishes-remain",
"lucky-bugs-bow",
"many-pugs-change",
"mean-apes-wait",
"metal-elephants-sit",
"metal-students-drive",
"mighty-steaks-shave",
"mighty-tomatoes-visit",
"mighty-toys-laugh",
"modern-peaches-clean",
"nasty-days-jog",
"nasty-shirts-look",
"neat-eels-greet",
"neat-hotels-wink",
"neat-kiwis-joke",
"new-plants-rhyme",
"nice-carrots-dream",
"nine-bulldogs-camp",
"nine-olives-swim",
"ninety-hats-kiss",
"ninety-rules-sneeze",
"old-papayas-shave",
"old-students-smoke",
@@ -367,8 +394,13 @@
"olive-experts-fold",
"olive-singers-accept",
"orange-gorillas-clean",
"orange-suns-yell",
"orange-walls-complain",
"perfect-colts-hammer",
"polite-meals-hug",
"poor-jeans-rescue",
"poor-points-do",
"quick-gifts-leave",
"quick-penguins-refuse",
"quick-ties-stare",
"quiet-donkeys-punch",
@@ -377,17 +409,26 @@
"real-grapes-sing",
"red-bottles-swim",
"red-eggs-serve",
"renovate-235713b",
"renovate-2d87790",
"renovate-47c1714",
"renovate-4b698fb",
"renovate-5f8d1ca",
"renovate-95b717a",
"renovate-97e6aa5",
"renovate-b35b354",
"renovate-c392808",
"renovate-d7337c1",
"renovate-f253121",
"renovate-f4b1d70",
"renovate-f58dd5c",
"renovate-f92a114",
"renovate-fb2e0b9",
"rich-bees-fry",
"rotten-lemons-cry",
"selfish-mails-scream",
"serious-carpets-learn",
"serious-dryers-grin",
"seven-dots-serve",
"seven-plums-return",
"shaggy-trainers-rule",
@@ -401,20 +442,27 @@
"silent-hotels-knock",
"silent-poets-grab",
"silent-waves-pretend",
"silver-crabs-exercise",
"six-emus-buy",
"six-jobs-sin",
"six-melons-end",
"sixty-bags-fry",
"sixty-shoes-prove",
"slimy-rats-fly",
"smart-numbers-call",
"soft-balloons-relax",
"soft-beans-tease",
"sour-ligers-hunt",
"sour-rivers-fry",
"spicy-bobcats-return",
"spotty-jokes-unite",
"spotty-kids-pay",
"spotty-phones-attend",
"strange-parents-hammer",
"strong-lobsters-hide",
"strong-news-develop",
"sweet-ravens-glow",
"swift-pumpkins-shake",
"tall-frogs-clap",
"tall-tools-compare",
"tame-numbers-smile",
@@ -425,14 +473,17 @@
"ten-planets-guess",
"ten-trainers-cough",
"tender-flowers-collect",
"thin-turtles-float",
"thirty-dolls-admire",
"tidy-cooks-mix",
"tidy-cooks-mixed",
"tidy-peaches-nail",
"tiny-donuts-drive",
"tiny-kiwis-know",
"tough-drinks-scream",
"twelve-hounds-know",
"twelve-pens-rescue",
"twelve-shirts-buy",
"twelve-weeks-march",
"twenty-taxis-mate",
"two-coats-smile",
@@ -445,6 +496,7 @@
"wet-emus-work",
"wet-lions-crash",
"wicked-ants-reflect",
"wicked-dolphins-wash",
"wicked-elephants-scream",
"wild-owls-doubt",
"wise-flies-laugh",
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend': patch
---
Fixed a bug where `fullTextFilter` wasn't preserved correctly in the cursor.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-kubernetes-react': patch
---
The `Cluster` component now renders the cluster's title, if specified.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/cli': patch
---
Updated dependency `vite-plugin-node-polyfills` to `^0.21.0`.
+36
View File
@@ -0,0 +1,36 @@
---
'@backstage/plugin-scaffolder-backend-module-confluence-to-markdown': patch
'@backstage/plugin-scaffolder-backend-module-bitbucket-server': patch
'@backstage/plugin-scaffolder-backend-module-bitbucket-cloud': patch
'@backstage/plugin-scaffolder-backend-module-cookiecutter': patch
'@backstage/plugin-scaffolder-backend-module-bitbucket': patch
'@backstage/backend-dynamic-feature-service': patch
'@backstage/plugin-scaffolder-backend-module-github': patch
'@backstage/plugin-scaffolder-backend-module-rails': patch
'@backstage/plugin-catalog-backend-module-gerrit': patch
'@backstage/backend-test-utils': patch
'@backstage/plugin-kubernetes-backend': patch
'@backstage/plugin-scaffolder-backend': patch
'@backstage/backend-app-api': patch
'@backstage/plugin-devtools-backend': patch
'@backstage/plugin-linguist-backend': patch
'@backstage/plugin-techdocs-backend': patch
'@backstage/backend-common': patch
'@backstage/e2e-test-utils': patch
'@backstage/plugin-catalog-backend': patch
'@backstage/plugin-rollbar-backend': patch
'@backstage/plugin-scaffolder-node': patch
'@backstage/config-loader': patch
'@techdocs/cli': patch
'@backstage/plugin-techdocs-node': patch
'@backstage/plugin-auth-backend': patch
'@backstage/create-app': patch
'@backstage/repo-tools': patch
'@backstage/plugin-app-backend': patch
'@backstage/cli-node': patch
'@backstage/plugin-app-node': patch
'@backstage/cli': patch
---
Updated dependency `fs-extra` to `^11.2.0`.
Updated dependency `@types/fs-extra` to `^11.0.0`.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/cli': patch
---
Updated dependency `esbuild-loader` to `^4.0.0`.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/cli': patch
---
Updated dependency `eslint-config-prettier` to `^9.0.0`.
+7
View File
@@ -0,0 +1,7 @@
---
'@backstage/backend-common': patch
'@techdocs/cli': patch
'@backstage/plugin-techdocs-backend': patch
---
Updated dependency `dockerode` to `^4.0.0`.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/cli': patch
---
Updated dependency `eslint-webpack-plugin` to `^4.0.0`.
+9
View File
@@ -0,0 +1,9 @@
---
'@backstage/cli': patch
'@backstage/codemods': patch
'@backstage/create-app': patch
'@backstage/repo-tools': patch
'@techdocs/cli': patch
---
Updated dependency `commander` to `^12.0.0`.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/cli': patch
---
Updated dependency `fork-ts-checker-webpack-plugin` to `^9.0.0`.
+6
View File
@@ -0,0 +1,6 @@
---
'@backstage/plugin-app-backend': patch
'@backstage/plugin-app-node': patch
---
Allow the `app-backend` plugin to use a global configuration schema provided externally through an extension.
+7
View File
@@ -0,0 +1,7 @@
---
'@backstage/plugin-signals-react': patch
'@backstage/plugin-signals-node': patch
'@backstage/plugin-signals': patch
---
Allow defining signal type to publish and receive
+6
View File
@@ -0,0 +1,6 @@
---
'@backstage/plugin-kubernetes-node': patch
---
The `ClusterDetails` type now has a `title` field, which should be a
human-readable name.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-auth-backend': patch
---
Added `experimentalExtraAllowedOrigins` to config
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-dynatrace': patch
---
Fixed Dynatrace plugin proxy configuration
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend-module-aws': patch
---
Move the AWS account e-mail from labels to annotations to fix the creation of `cloud-account` resources.
+8
View File
@@ -0,0 +1,8 @@
---
'@backstage/backend-dynamic-feature-service': minor
---
Implement the discovery of additional individual configuration schemas for dynamic plugins, and provide:
- an alternate implementation of the root logger service that takes them into account,
- an extension to the App backend plugin to set a global configuration schema that takes them into account.
+6
View File
@@ -0,0 +1,6 @@
---
'@backstage/plugin-scaffolder-backend': patch
'@backstage/plugin-catalog-backend': patch
---
Upgraded `prom-client` to version 15
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-kubernetes-backend': patch
---
Clusters in the catalog can now specify a human-readable title via `metadata.title`.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-kubernetes-backend': patch
---
Clusters in the app-config can now specify a `title` property for human readability.
+3
View File
@@ -0,0 +1,3 @@
**/api-report*.md linguist-generated=true
**/cli-report.md linguist-generated=true
**/knip-report.md linguist-generated=true
@@ -92,6 +92,7 @@ Deutsche
dev
devops
devs
dialogs
discoverability
Discoverability
dls
@@ -323,6 +324,7 @@ repos
rerender
rerenders
resourcequotas
retryable
reusability
Reusability
roadmaps
+6 -6
View File
@@ -23,7 +23,7 @@ jobs:
env:
CI: true
NODE_OPTIONS: --max-old-space-size=4096
NODE_OPTIONS: --max-old-space-size=8192
name: Install ${{ matrix.node-version }}
steps:
@@ -59,7 +59,7 @@ jobs:
env:
CI: true
NODE_OPTIONS: --max-old-space-size=4096
NODE_OPTIONS: --max-old-space-size=8192
name: Verify ${{ matrix.node-version }}
steps:
@@ -155,7 +155,7 @@ jobs:
name: Test ${{ matrix.node-version }}
services:
postgres16:
image: postgres:16@sha256:09f23e02d76670d3b346a3c00aa33a27cf57aab8341eedfcdaed41459d14f5c4
image: postgres:16@sha256:39d764950f22cfe878661247bb15cb344169dc3d55c9d4676303a2ef8675c057
env:
POSTGRES_PASSWORD: postgres
options: >-
@@ -166,7 +166,7 @@ jobs:
ports:
- 5432/tcp
postgres12:
image: postgres:12@sha256:8ffdca6e9208aceb30653fa0cc1c38956303ace453944b54b4f71019cfe854c1
image: postgres:12@sha256:7a4c3f690fa767db8aaa4a9da3870037535307cc7f8f1880f1d7275a1be29b4d
env:
POSTGRES_PASSWORD: postgres
options: >-
@@ -177,7 +177,7 @@ jobs:
ports:
- 5432/tcp
mysql8:
image: mysql:8@sha256:2a9ef1075ff30c65bbcf4f96b25a03ea3b3f492c284e6c4a612c269ce4c5bb19
image: mysql:8@sha256:343b82684a6b05812c58ca20ccd3af8bcf8a5f48b1842f251c54379bfce848f9
env:
MYSQL_ROOT_PASSWORD: root
options: >-
@@ -190,7 +190,7 @@ jobs:
env:
CI: true
NODE_OPTIONS: ${{ matrix.node-version == '20.x' && '--max-old-space-size=4096 --no-node-snapshot' || '--max-old-space-size=4096' }}
NODE_OPTIONS: ${{ matrix.node-version == '20.x' && '--max-old-space-size=8192 --no-node-snapshot' || '--max-old-space-size=8192' }}
INTEGRATION_TEST_GITHUB_TOKEN: ${{ secrets.INTEGRATION_TEST_GITHUB_TOKEN }}
INTEGRATION_TEST_GITLAB_TOKEN: ${{ secrets.INTEGRATION_TEST_GITLAB_TOKEN }}
INTEGRATION_TEST_BITBUCKET_TOKEN: ${{ secrets.INTEGRATION_TEST_BITBUCKET_TOKEN }}
+1 -1
View File
@@ -11,7 +11,7 @@ jobs:
env:
CI: true
NODE_OPTIONS: --max-old-space-size=4096
NODE_OPTIONS: --max-old-space-size=8192
steps:
- name: Harden Runner
+5 -5
View File
@@ -23,7 +23,7 @@ jobs:
services:
postgres16:
image: postgres:16@sha256:09f23e02d76670d3b346a3c00aa33a27cf57aab8341eedfcdaed41459d14f5c4
image: postgres:16@sha256:39d764950f22cfe878661247bb15cb344169dc3d55c9d4676303a2ef8675c057
env:
POSTGRES_PASSWORD: postgres
options: >-
@@ -34,7 +34,7 @@ jobs:
ports:
- 5432/tcp
postgres12:
image: postgres:12@sha256:8ffdca6e9208aceb30653fa0cc1c38956303ace453944b54b4f71019cfe854c1
image: postgres:12@sha256:7a4c3f690fa767db8aaa4a9da3870037535307cc7f8f1880f1d7275a1be29b4d
env:
POSTGRES_PASSWORD: postgres
options: >-
@@ -45,7 +45,7 @@ jobs:
ports:
- 5432/tcp
mysql8:
image: mysql:8@sha256:2a9ef1075ff30c65bbcf4f96b25a03ea3b3f492c284e6c4a612c269ce4c5bb19
image: mysql:8@sha256:343b82684a6b05812c58ca20ccd3af8bcf8a5f48b1842f251c54379bfce848f9
env:
MYSQL_ROOT_PASSWORD: root
options: >-
@@ -58,7 +58,7 @@ jobs:
env:
CI: true
NODE_OPTIONS: ${{ matrix.node-version == '20.x' && '--max-old-space-size=4096 --no-node-snapshot' || '--max-old-space-size=4096' }}
NODE_OPTIONS: ${{ matrix.node-version == '20.x' && '--max-old-space-size=8192 --no-node-snapshot' || '--max-old-space-size=8192' }}
INTEGRATION_TEST_GITHUB_TOKEN: ${{ secrets.INTEGRATION_TEST_GITHUB_TOKEN }}
INTEGRATION_TEST_GITLAB_TOKEN: ${{ secrets.INTEGRATION_TEST_GITLAB_TOKEN }}
INTEGRATION_TEST_BITBUCKET_TOKEN: ${{ secrets.INTEGRATION_TEST_BITBUCKET_TOKEN }}
@@ -140,7 +140,7 @@ jobs:
env:
CI: 'true'
NODE_OPTIONS: --max-old-space-size=4096
NODE_OPTIONS: --max-old-space-size=8192
steps:
- name: Harden Runner
+1 -1
View File
@@ -66,6 +66,6 @@ jobs:
# Upload the results to GitHub's code scanning dashboard.
- name: 'Upload to code-scanning'
uses: github/codeql-action/upload-sarif@e8893c57a1f3a2b659b6b55564fdfdbbd2982911 # v3.24.0
uses: github/codeql-action/upload-sarif@e675ced7a7522a761fc9c8eb26682c8b27c42b2b # v3.24.1
with:
sarif_file: results.sarif
+1 -1
View File
@@ -58,6 +58,6 @@ jobs:
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
NODE_OPTIONS: --max-old-space-size=7168
- name: Upload Snyk report
uses: github/codeql-action/upload-sarif@e8893c57a1f3a2b659b6b55564fdfdbbd2982911 # v3.24.0
uses: github/codeql-action/upload-sarif@e675ced7a7522a761fc9c8eb26682c8b27c42b2b # v3.24.1
with:
sarif_file: snyk.sarif
+2 -2
View File
@@ -106,7 +106,7 @@ jobs:
# Identify comment to be updated
- name: Find comment for Ephemeral Environment
uses: peter-evans/find-comment@a54c31d7fa095754bfef525c0c8e5e5674c4b4b1 # v2
uses: peter-evans/find-comment@d5fe37641ad8451bdd80312415672ba26c86575e # v3
id: find-comment
with:
issue-number: ${{ needs.cache-manifests-file.outputs.pr-number }}
@@ -220,7 +220,7 @@ jobs:
# Identify comment to be updated
- name: Find comment for Ephemeral Environment
uses: peter-evans/find-comment@a54c31d7fa095754bfef525c0c8e5e5674c4b4b1 # v2
uses: peter-evans/find-comment@d5fe37641ad8451bdd80312415672ba26c86575e # v3
id: find-comment
with:
issue-number: ${{ needs.cache-manifests-file.outputs.pr-number }}
+3 -3
View File
@@ -55,7 +55,7 @@ jobs:
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@e8893c57a1f3a2b659b6b55564fdfdbbd2982911 # v3.24.0
uses: github/codeql-action/init@e675ced7a7522a761fc9c8eb26682c8b27c42b2b # v3.24.1
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
@@ -66,7 +66,7 @@ jobs:
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@e8893c57a1f3a2b659b6b55564fdfdbbd2982911 # v3.24.0
uses: github/codeql-action/autobuild@e675ced7a7522a761fc9c8eb26682c8b27c42b2b # v3.24.1
# ️ Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
@@ -80,4 +80,4 @@ jobs:
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@e8893c57a1f3a2b659b6b55564fdfdbbd2982911 # v3.24.0
uses: github/codeql-action/analyze@e675ced7a7522a761fc9c8eb26682c8b27c42b2b # v3.24.1
+1 -1
View File
@@ -40,7 +40,7 @@ jobs:
cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }}
- name: bootstrap kind
uses: helm/kind-action@dda0770415bac9fc20092cacbc54aa298604d140 # v1.8.0
uses: helm/kind-action@99576bfa6ddf9a8e612d83b513da5a75875caced # v1.9.0
- name: kubernetes test
working-directory: packages/backend-common
+1 -1
View File
@@ -19,7 +19,7 @@ jobs:
services:
postgres:
image: postgres:12@sha256:8ffdca6e9208aceb30653fa0cc1c38956303ace453944b54b4f71019cfe854c1
image: postgres:12@sha256:7a4c3f690fa767db8aaa4a9da3870037535307cc7f8f1880f1d7275a1be29b4d
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
+1 -1
View File
@@ -51,7 +51,7 @@ jobs:
- run: yarn build-storybook
- uses: chromaui/action@76bda3648003815314bd50adaa553ee612a7f36c # v10
- uses: chromaui/action@a7938ff070f700b48e271857366b0564d65e3e5b # v10
with:
token: ${{ secrets.GITHUB_TOKEN }}
# projectToken intentionally shared to allow collaborators to run Chromatic on forks
+1 -1
View File
@@ -21,7 +21,7 @@ jobs:
env:
CI: true
NODE_OPTIONS: ${{ matrix.node-version == '20.x' && '--max-old-space-size=4096 --no-node-snapshot' || '--max-old-space-size=4096' }}
NODE_OPTIONS: ${{ matrix.node-version == '20.x' && '--max-old-space-size=8192 --no-node-snapshot' || '--max-old-space-size=8192' }}
INTEGRATION_TEST_GITHUB_TOKEN: ${{ secrets.INTEGRATION_TEST_GITHUB_TOKEN }}
INTEGRATION_TEST_GITLAB_TOKEN: ${{ secrets.INTEGRATION_TEST_GITLAB_TOKEN }}
INTEGRATION_TEST_BITBUCKET_TOKEN: ${{ secrets.INTEGRATION_TEST_BITBUCKET_TOKEN }}
+11 -7
View File
@@ -261,11 +261,13 @@ Example signal payload for a new notification:
}
```
#### Future considerations
#### Future considerations and BEP TODO
- Add icon for the notification request (for UX purposes)
- Broadcast messages are to be saved to a separate table for performance reasons
- OpenAPI tooling is taken into use for the notification router and client
- Allow using dynamic values in notification payload, for example entity references `{{ user:default/john.doe }}` should be rendered by the frontend with `EntityRefLink` component. Defining the dynamic data values should be done before implementation.
- Add configurable automatic clean-up of old notifications to save storage space
- Support for saving user notification settings
### Frontend API
@@ -352,13 +354,15 @@ interface SignalApi {
}
```
#### Future considerations
#### Future considerations and BEP TODO
- Notification frontend utilizes [Web Notification API](https://developer.mozilla.org/en-US/docs/Web/API/Notification) to notify user for new notifications
- Unread notifications count is displayed in the title of the page
- Configuration can be used to enable or disable features in the notification system (Web Notification API, title change, etc.)
- Replace absent signal service with long polling. This requires changes to the `signals` plugin as well.
- Notifications can have severity that is used to determine how notifications are shown to the user
- Render dynamic values with various different React elements such as the `EntityRefLink` for entity references (for example `{{ user:default/john.doe }}`) in the notification payload
- Handle `link` values that use route references. For example instead hard-coding link to `/catalog/default/component/artist-web` it should be possible to use `catalogPlugin.catalogEntity` route reference as a link of the notification. This should also allow using parameters to be passed to the route reference
- Add support for `analyticsApi` to notification actions like marking notifications done, saved or opening links in the notifications
- Add support for user settings to control how notifications are shown to the user and which notifications user wants to receive. This should also include support for different `NotificationProcessor`s that can send notification to external systems
- Add a sound to be played when notification is received
- Add i18n internationalization support for the notification payload
## Release Plan
+74 -48
View File
@@ -14,7 +14,7 @@ creation-date: 2024-01-28
<!-- Before merging the initial BEP PR, create a feature issue and update the below link. You can wait with this step until the BEP is ready to be merged. -->
[**Discussion Issue**](https://github.com/backstage/backstage/issues/NNNNN)
[**Discussion Issue**](https://github.com/backstage/backstage/issues/22605)
- [Summary](#summary)
- [Motivation](#motivation)
@@ -75,6 +75,8 @@ For service-to-service communication we will move away from reusing user tokens
An issue that has been identified in the current auth implementation is that the user information embedded in the Backstage user tokens can grow fairly large. In order to avoid that this becomes a widespread problem, especially as we implement cookie auth with a 4kb size limit, we will remove the ownership entity refs (`ent` claim) from the user tokens. There were already very few consumers of this information in practice - only the `permission-backend` and `signal-backend` plugin packages currently rely on this information. The ownership data will instead be available via a new `UserInfoService`, owned by the `auth-backend`. The implementation of this new service will keep relying on the `ent` claim of the user token initially, but we will also implement a new `/v1/userinfo` endpoint in the `auth-backend` that will migrate to transparently in the future.
Finally, it is also important to be able to disable the built-in protection of Backstage instances, for example when access protection is already provided by an external service, and one wishes to allow unauthenticated access for internal use. All built-in service implementation therefore support a common configuration for specifying the desired access control.
## Design Details
### `AuthService` Interface
@@ -84,18 +86,18 @@ The new `AuthService` interface is defined as follows:
```ts
// These credential types are opaque and will also store some internal information, for example bearer tokens
export type BackstageUserCredentials = {
$$type: '@backstage/BackstageCredentials';
export type BackstageNonePrincipal = {
type: 'none';
};
export type BackstageUserPrincipal = {
type: 'user';
userEntityRef: string;
};
export type BackstageServiceCredentials = {
$$type: '@backstage/BackstageCredentials';
type: 'service';
export type BackstageServicePrincipal = {
type: 'user';
// Exact format TBD, possibly 'plugin:<pluginId>' or 'external:<externalServiceId>'
subject: string;
@@ -104,17 +106,31 @@ export type BackstageServiceCredentials = {
permissions?: string[];
};
type BackstageCredentials =
| BackstageUserCredentials
| BackstageServiceCredentials;
export type BackstageCredentials<TPrincipal = unknown> = {
$$type: '@backstage/BackstageCredentials';
principal: TPrincipal;
};
export type BackstagePrincipalTypes = {
user: BackstageUserPrincipal;
service: BackstageServicePrincipal;
none: BackstageNonePrincipal;
};
export interface AuthService {
authenticate(token: string): Promise<BackstageCredentials>;
// TODO: should the caller provide the target plugin ID?
// TODO: how can we make it very difficult to forget to forward credentials
issueToken(options: {
forward?: BackstageCredentials;
isPrincipal<TType extends keyof BackstagePrincipalTypes>(
credentials: BackstageCredentials,
type: TType,
): credentials is BackstageCredentials<BackstagePrincipalTypes[TType]>;
getOwnCredentials(): Promise<BackstageCredentials<BackstageServicePrincipal>>;
// TODO: should the caller provide the target plugin ID? if not - probably skip the object form
issueServiceToken(options: {
forward: BackstageCredentials;
}): Promise<{ token: string }>;
}
```
@@ -124,10 +140,13 @@ export interface AuthService {
The new `UserInfoService` interface is defined as follows:
```ts
export interface BackstageUserInfo {
userEntityRef: string;
ownershipEntityRefs: string[];
}
export interface UserInfoService {
getUserInfo(
credentials: BackstageUserCredentials,
): Promise<{ ownershipEntityRefs: string[] /* profile info too? */ }>;
getUserInfo(credentials: BackstageCredentials): Promise<BackstageUserInfo>;
}
```
@@ -236,30 +255,33 @@ export default createBackendPlugin({
The new `HttpAuthService` interface is defined as follows:
```ts
export type BackstageUnauthorizedCredentials = {
$$type: '@backstage/BackstageCredentials';
type: 'unauthorized';
};
type BackstageCredentialTypes = {
user: BackstageUserCredentials;
'user-cookie': BackstageUserCredentials;
service: BackstageServiceCredentials;
unauthorized: BackstageUnauthorizedCredentials;
type BackstageHttpAccessToPrincipalTypesMapping = {
user: BackstageUserPrincipal;
'user-cookie': BackstageUserPrincipal;
service: BackstageServicePrincipal;
unauthenticated: BackstageNonePrincipal;
unknown: unknown;
};
export interface HttpAuthService {
// Implementations should cache resolved credentials on the request object
credentials<TAllowed extends keyof BackstageCredentialTypes>(
credentials<
TAllowed extends
| keyof BackstageHttpAccessToPrincipalTypesMapping = 'unknown',
>(
req: Request,
options?: HttpAuthServiceMiddlewareOptions<TAllowed>,
): Promise<BackstageCredentialTypes[TAllowed]>;
options?: { allow: Array<TAllowed> },
): Promise<
BackstageCredentials<BackstageHttpAccessToPrincipalTypesMapping[TAllowed]>
>;
requestHeaders(options?: {
forward?: BackstageCredentials;
requestHeaders(options: {
forward: BackstageCredentials;
}): Promise<Record<string, string>>;
// The cookie issued by this method must be consumable by the `credentials` method, which in turn
// should create a credentials object that can be passed to the `issueServiceToken` method.
// The issued token must then in turn be a valid token for a user principal with full access.
issueUserCookie(res: Response): Promise<void>;
}
```
@@ -276,7 +298,7 @@ router.get('/read-data', (req, res) => {
const credentials = await httpAuth.credentials(req, { allow: ['user'] }); // throws if not: user (or obo), user-cookie
const { ownershipEntityRefs } = await userInfo.getUserInfo(credentials);
console.log(
`User ref=${credentials.userEntityRef} ownership=${ownershipEntityRefs} claims=${credentials.extraClaims}`,
`User ref=${credentials.principal.userEntityRef} ownership=${ownershipEntityRefs} claims=${credentials.principal.extraClaims}`,
);
// ...
});
@@ -289,11 +311,11 @@ class CatalogIntegration {
async getEntity(
res: string,
options: {
credentials: BackstageUserCredentials | BackstageServiceCredentials;
credentials: BackstageCredentials;
},
) {
return catalogClient.getEntityByRef(req.params.entityRef, {
token: await auth.issueToken({
token: await auth.issueServiceToken({
forward: options.credentials,
}),
});
@@ -306,13 +328,6 @@ const catalogIntegration = new CatalogIntegration();
router.get('/read-data', (req, res) => {
// The catalogClient will have a reference to the (plugin scoped) HttpAuthService,
// which it uses to create the credential headers for the upstream request.
const entity = await catalogClient.getEntityByRef(req.params.entityRef, {
credentials: httpAuth.forwardCredentials(req, {
dangerouslyAllowUnauthenticated: true,
}),
});
// TODO: try this out in more places in plugins
const entity = await catalogIntegration.getEntity(req.params.entityRef, {
credentials: await httpAuth.credentials(req),
});
@@ -327,12 +342,14 @@ router.get('/read-data', (req, res) => {
const credentials = await httpAuth.credentials(req, {
allow: ['user', 'service'],
});
if (credentials.type === 'user') {
res.json(todoStore.listOwnedTodos({ owner: credentials.userEntityRef }));
if (credentials.principal.type === 'user') {
res.json(
todoStore.listOwnedTodos({ owner: credentials.principal.userEntityRef }),
);
} else {
res.json(
todoStore.listTodos({
serviceId: credentials.subject,
serviceId: credentials.principal.subject,
}),
);
}
@@ -366,8 +383,6 @@ router.get(
'/read-data',
httpAuth.middleware({ allow: ['user-cookie'] }),
(req, res) => {
// These credentials don't actually contain an underlying user token for cookie-authed requests
// If you try to pass them to the AuthService, it'll throw.
const credentials = await httpAuth.credentials(req, { allow: ['user'] });
const { ownershipEntityRefs } = await userInfo.getUserInfo(credentials);
console.log(
@@ -378,6 +393,17 @@ router.get(
);
```
### Access Control Configuration
In order to disable access control for a Backstage instance, the following configuration can be used:
```yaml
backend:
dangerouslyDisableServiceAuth: true
```
The exact impact that this has is that it disables the check in the `HttpRouterService` implementation, effectively applying the `unauthenticated` access level to all routes. Furthermore, it will also change `AuthService` so that the `issueServiceToken()` method will now issue an empty token for a `'none'` principal, rather than throwing.
## Release Plan
The existing `IdentityService` and `TokenManagerService` will be deprecated and instead implemented in terms of the new `AuthService`.
@@ -0,0 +1,247 @@
---
title: Scaffolder Retryable Tasks
status: provisional
authors:
- 'bnechyporenko@bol.com'
- 'benjaminl@spotify.com'
owners:
project-areas:
- scaffolder
creation-date: 2024-01-31
---
<!--
**Note:** When your BEP is complete, all these pre-existing comments should be removed
When editing BEPs, aim for tightly-scoped, single-topic PRs to keep discussions focused. If you disagree with what is already in a document, open a new PR with suggested changes.
-->
# BEP: <!-- Your short, descriptive title -->
<!-- Before merging the initial BEP PR, create a feature issue and update the below link. You can wait with this step until the BEP is ready to be merged. -->
[**Discussion Issue**](https://github.com/backstage/backstage/issues/22590)
- [Summary](#summary)
- [Motivation](#motivation)
- [Goals](#goals)
- [Non-Goals](#non-goals)
- [Proposal](#proposal)
- [Design Details](#design-details)
- [Release Plan](#release-plan)
- [Dependencies](#dependencies)
- [Alternatives](#alternatives)
## Summary
Scaffolder retryable task idempotency provides the means to make each action of the task idempotent. By default, an action is not considered to be idempotent.
It has to be crafted to a solution when action can be re-run multiple times and giving the same effect as it had been run only once.
## Motivation
The aim is to make task engine more reliable in terms of system crash or redeployment. If the task engine is in process of executing
tasks and system stops, after restart task engine will restore all such tasks and continue their execution.
Another purpose is to make it possible to manually retry the task from the last failed step.
### Goals
<!--
List the specific goals of the BEP. What is it trying to achieve? How will we
know that this has succeeded?
-->
- we will provide extended task API in scaffolder with a necessary tools to let tasks implement retries
- make built-in actions retryable
- enable the user to retry the failed task
- should be possible to retry the task on a different scaffolder instance
- we would like to retry from any state and not tearing down or overwriting what was created before.
- we would like to be resilient to upstream failures, i.e. a request to create a remote repository failed and repository was created, it should be handled gracefully.
### Non-Goals
<!--
What is out of scope for this BEP? Listing non-goals helps to focus discussion
and make progress.
-->
We will not aim to magically provide idempotency for actions, it has to be explicitly implemented.
## Proposal
<!--
This is where we get down to the specifics of what the proposal actually is.
This should have enough detail that reviewers can understand exactly what
you're proposing, but should not include things like API designs or
implementation.
-->
### Idempotency
We believe that idempotency is the best way to do it. Idempotency allows to rerun the actions multiple times to gracefully deal with semi-complete actions.
### Serialization of workspace
We believe that a serialization of workspace is a way to achieve re-running the task on a non-sticky way.
That means that the task can be restored and retried on a different scaffolder node.
### Secrets
Secrets will be stored for a longer period of time in the database and wiped out once the task going into a complete state (successfully finished or archived).
## Design Details
<!--
This section should contain enough information that the specifics of your
change are understandable. This may include API specs or even code snippets.
If there's any ambiguity about HOW your proposal will be implemented, this is the place to discuss them.
-->
### Idempotency
This is a simplified idempotent version of GitHub repository creation action:
```typescript
export function createGithubRepoCreateAction(options: {
integrations: ScmIntegrationRegistry;
githubCredentialsProvider?: GithubCredentialsProvider;
}) {
const { integrations, githubCredentialsProvider } = options;
return createTemplateAction<{
repoUrl: string;
secrets?: { [key: string]: string };
token?: string;
}>({
id: 'github:repo:create',
description: 'Creates a GitHub repository.',
examples,
schema: {
input: {
type: 'object',
required: ['repoUrl'],
properties: {
repoUrl: inputProps.repoUrl,
token: inputProps.token,
secrets: inputProps.secrets,
repoVariables: inputProps.repoVariables,
},
},
},
async handler(ctx) {
const {
repoUrl,
secrets,
repoVariables,
token: providedToken,
} = ctx.input;
const octokitOptions = await getOctokitOptions({
integrations,
credentialsProvider: githubCredentialsProvider,
token: providedToken,
repoUrl: repoUrl,
});
const client = new Octokit(octokitOptions);
const { owner, repo } = parseRepoUrl(repoUrl, integrations);
if (!owner) {
throw new InputError('Invalid repository owner provided in repoUrl');
}
const user = await client.rest.users.getByUsername({
username: owner,
});
await ctx.checkpoint('v1.task.checkpoint.repo.creation', async () => {
const repoCreationPromise =
user.data.type === 'Organization'
? client.rest.repos.createInOrg({
name: repo,
org: owner,
})
: client.rest.repos.createForAuthenticatedUser({
name: repo,
});
const { repoUrl } = await repoCreationPromise;
return { repoUrl };
});
if (secrets) {
await ctx.checkpoint(
'v1.task.checkpoint.repo.create.variables',
async () => {
for (const [key, value] of Object.entries(repoVariables ?? {})) {
await client.rest.actions.createRepoVariable({
owner,
repo,
name: key,
value: value,
});
}
},
);
}
ctx.output('remoteUrl', newRepo.clone_url);
},
});
}
```
#### Task context store
Implement the similar API to CatalogProcessorCache allowing to store markers or keys to enable users to write idempotent actions.
This context persists across retries.
```typescript
const repoMarker = await cache.get<RepoMarker>('repo.marker.key');
```
#### Checkpoints
Checkpoints will allow action authors to create actions where code paths are ignored if already run.
This will be provided on a context object and action of author provide a key and a callback.
```typescript
await ctx.checkpoint('v1.task.checkpoint.repo.creation', async () => {
const { repoUrl } = await client.rest.Repository.create({});
return { repoUrl };
});
```
This checkpoint will be backed with task stored context namespaced with a checkpoint versioned prefix.
It's going look like:
```json
{
"v1.task.checkpoint.repo.creation": {
"status": "success",
"result": {
"repoUrl": "https://github.com/backstage/backstage.git"
}
}
}
```
## Release Plan
<!--
This section should describe the rollout process for any new features. It must take our version policies into account and plan for a phased rollout if this change affects any existing stable APIs.
If there is any particular feedback to be gathered during the rollout, this should be described here as well.
-->
## Dependencies
<!--
List any dependencies that this work has on other BEPs or features.
-->
## Alternatives
<!--
What other approaches did you consider, and why did you rule them out? These do
not need to be as detailed as the proposal, but should include enough
information to express the idea and why it was not acceptable.
-->
@@ -46,7 +46,7 @@ RUN yarn workspace app build
FROM nginx:mainline@sha256:84c52dfd55c467e12ef85cad6a252c0990564f03c4850799bf41dd738738691f
FROM nginx:mainline
RUN apt-get update && apt-get -y install jq && rm -rf /var/lib/apt/lists/*
@@ -27,7 +27,7 @@
FROM nginx:mainline@sha256:84c52dfd55c467e12ef85cad6a252c0990564f03c4850799bf41dd738738691f
FROM nginx:mainline
RUN apt-get update && apt-get -y install jq && rm -rf /var/lib/apt/lists/*
+2 -2
View File
@@ -11,8 +11,8 @@ This is a small tutorial that goes over how to setup your Backstage instance to
```diff
// packages/backend/package.json
"dependencies": {
+ "express-prom-bundle": "^6.3.6",
+ "prom-client": "^14.0.1",
+ "express-prom-bundle": "^7.0.0",
+ "prom-client": "^15.0.0",
```
2. Now we want to run `yarn install` from the root of the project to get those dependencies in place
+155 -2
View File
@@ -9,8 +9,159 @@ This guide explains how to deploy Backstage to [Flightcontrol](https://www.fligh
Before you begin, make sure you have a [Flightcontrol account](https://app.flightcontrol.dev/signup?ref=backstage) and a [Github account](https://github.com/login) to follow this guide.
# Creating a Dockerfile and .dockerignore
Once your Flightcontrol account is setup, you will need to prepare a `Dockerfile` and `.dockerignore` to deploy Backstage to your target AWS environment. The standard `Dockerfile` included in the Backstage repository assumes that the `skeleton.tar.gz` and `bundle.tar.gz` already exist. When integrating Flightcontrol directly with a GitHub repository, changes to files within this repository will automatically start a Flightcontrol deployment, unless you have configured deployments via a webhook. Regardless of which method you have chosen, when Flightcontrol starts a deployment process it will pull all files directly from the repository, and not from a GitHub runner or other location. As Flightcontrol does not contain CI steps this results in the zip files having to be committed to the repository in order to be available for the `Dockerfile` to copy.
A simple work around for this is to use a `Dockerfile` with a [multi-stage build](https://docs.docker.com/build/building/multi-stage/). Using this approach we can create our zip files in the first build stage, and copy them into the second stage ready for deployment.
The following two code snippets demonstrate this method. The first block of code is an example of a multi-stage build approach and should be added to a file called `Dockerfile.flightcontrol` in the `packages/backend` directory.
```dockerfile filename="Dockerfile.flightcontrol"
# This dockerfile builds an image for the backend package.
# It should be executed with the root of the repo as docker context.
#
# Before building this image, be sure to have run the following commands in the repo root:
#
# yarn install
# yarn tsc
# yarn build:backend
#
# Once the commands have been run, you can build the image using `yarn build-image`
FROM node:18-bookworm-slim as build
USER node
WORKDIR /app
COPY --chown=node:node . .
RUN yarn install --frozen-lockfile
# tsc outputs type definitions to dist-types/ in the repo root, which are then consumed by the build
RUN yarn tsc
# Build the backend, which bundles it all up into the packages/backend/dist folder.
# The configuration files here should match the one you use inside the Dockerfile below.
RUN yarn build:backend --config ../../app-config.yaml
FROM node:18-bookworm-slim
# Install isolate-vm dependencies, these are needed by the @backstage/plugin-scaffolder-backend.
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
--mount=type=cache,target=/var/lib/apt,sharing=locked \
apt-get update && \
apt-get install -y --no-install-recommends python3 g++ build-essential && \
yarn config set python /usr/bin/python3
# Install sqlite3 dependencies. You can skip this if you don't use sqlite3 in the image,
# in which case you should also move better-sqlite3 to "devDependencies" in package.json.
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
--mount=type=cache,target=/var/lib/apt,sharing=locked \
apt-get update && \
apt-get install -y --no-install-recommends libsqlite3-dev
# From here on we use the least-privileged `node` user to run the backend.
USER node
# This should create the app dir as `node`.
# If it is instead created as `root` then the `tar` command below will fail: `can't create directory 'packages/': Permission denied`.
# If this occurs, then ensure BuildKit is enabled (`DOCKER_BUILDKIT=1`) so the app dir is correctly created as `node`.
WORKDIR /app
# This switches many Node.js dependencies to production mode.
ENV NODE_ENV production
# Copy repo skeleton first, to avoid unnecessary docker cache invalidation.
# The skeleton contains the package.json of each package in the monorepo,
# and along with yarn.lock and the root package.json, that's enough to run yarn install.
COPY --from=build app/yarn.lock app/package.json app/packages/backend/dist/skeleton.tar.gz ./
RUN tar xzf skeleton.tar.gz && rm skeleton.tar.gz
RUN --mount=type=cache,target=/home/node/.cache/yarn,sharing=locked,uid=1000,gid=1000 \
yarn install --frozen-lockfile --production --network-timeout 300000
# Then copy the rest of the backend bundle, along with any other files we might want.
COPY --from=build app/packages/backend/dist/bundle.tar.gz app/app-config*.yaml ./
RUN tar xzf bundle.tar.gz && rm bundle.tar.gz
CMD ["node", "packages/backend", "--config", "app-config.yaml", "--config", "app-config.production.yaml"]
```
In order to prevent the default `.dockerignore` file from preventing the copying of the relevant files into the first stage of our build, we need to override it with a custom one. This can also be added to the `packages/backend` directory, it should be called `Dockerfile.flightcontrol.dockerignore` and contain the following.
```ssh filename="Dockerfile.flightcontrol.dockerignore"
.git
.yarn/cache
.yarn/install-state.gz
node_modules
packages/*/node_modules
*.local.yaml
```
With these two new files, you will now have the necessary steps in place to build the zip files, copy them into the second stage of the build, and deploy them via Flightcontrol.
# Creating a custom app-config.production file
Our next steps before switching to the Flightcontrol dashboard is to create a custom app-config.production file. The purposes of this is to update how Backstage will connect to the RDS hosted Postgres DB. The default `app-config.production` file uses the `host`, `port`, `user` and `password` environment variables.
When creating a database via the Flightcontrol dashboard, we are given an environment variable with the single connection string. Therefore we need an `app-config.production` file which uses this variable.
Within your Backstage project create a new file called `app-config.production.flightcontrol.yaml`. Add the following configuration to it:
```yaml filename="app-config.production.flightcontrol.yaml"
app:
# Should be the same as backend.baseUrl when using the `app-backend` plugin.
baseUrl: http://localhost:7007
backend:
# Note that the baseUrl should be the URL that the browser and other clients
# should use when communicating with the backend, i.e. it needs to be
# reachable not just from within the backend host, but from all of your
# callers. When its value is "http://localhost:7007", it's strictly private
# and can't be reached by others.
baseUrl: http://localhost:7007
# The listener can also be expressed as a single <host>:<port> string. In this case we bind to
# all interfaces, the most permissive setting. The right value depends on your specific deployment.
listen: ':7007'
# config options: https://node-postgres.com/api/client
database:
client: pg
pluginDivisionMode: 'schema'
connection:
connectionString: ${POSTGRES_CON_STRING}
ssl:
require: true
rejectUnauthorized: false
# Flightcontrol provides a single DB connection string
# environment variable which can be renamed to POSTGRES_CON_STRING.
# the following default values are therefore not used:
# host: ${POSTGRES_HOST}
# port: ${POSTGRES_PORT}
# user: ${POSTGRES_USER}
# password: ${POSTGRES_PASSWORD}
# https://node-postgres.com/features/ssl
# you can set the sslmode configuration option via the `PGSSLMODE` environment variable
# see https://www.postgresql.org/docs/current/libpq-ssl.html Table 33.1. SSL Mode Descriptions (e.g. require)
# ssl:
# ca: # if you have a CA file and want to verify it you can uncomment this section
# $file: <file-path>/ca/server.crt
catalog:
# Overrides the default list locations from app-config.yaml as these contain example data.
# See https://backstage.io/docs/features/software-catalog/#adding-components-to-the-catalog for more details
# on how to get entities into the catalog.
locations: []
```
Make a note of the environment variable used in the `connectionString`. In our example above this is `POSTGRES_CON_STRING`. You will need this later when you have deployed the database via the Flightcontrol console, and wish to connect to it from Backstage.
# Deployment Via Dashboard
Ensure that custom `Dockerfile.flightcontrol`, `Dockerfile.flightcontrol.dockerignore` and `app-config.production.flightcontrol.yaml` have been committed to your repository before following the next steps.
Login into the Flightcontrol Dashboard and complete each of the following:
1. Create a new project from the Flightcontrol Dashboard
2. Select the GitHub repo for your Backstage project
@@ -25,7 +176,7 @@ Before you begin, make sure you have a [Flightcontrol account](https://app.fligh
| Health Check Path | /catalog |
| Port | 7007 |
5. Click `Create Project` and complete any required steps (like linking your AWS account).
5. Click `Create Project` and complete any required steps (like linking your AWS account). Remember to point the project to your custom files.
# Deployment via Code
@@ -33,7 +184,7 @@ Before you begin, make sure you have a [Flightcontrol account](https://app.fligh
2. Select the GitHub repo for your Backstage project
3. Select the `flightcontrol.json` Config Type.
3. Select the `flightcontrol.json` Config Type. Update the example JSON below where applicable to your custom Dockerfile.
```json filename="flightcontrol.json"
{
@@ -72,6 +223,8 @@ Before you begin, make sure you have a [Flightcontrol account](https://app.fligh
If you need a database or Redis for your Backstage plugins, you can easily add those to your Flightcontrol deployment. For more information, see [the flightcontrol docs](https://www.flightcontrol.dev/docs/guides/flightcontrol/using-code?ref=backstage#redis).
When creating a Postgres RDS database you will need to update the connection string variable name to the one included in the `app-config.production.flightcontrol.yaml`. As noted above in our example we called this `POSTGRES_CON_STRING`.
## Troubleshooting
- [Flightcontrol Documentation](https://www.flightcontrol.dev/docs?ref=backstage)
+1 -1
View File
@@ -384,7 +384,7 @@ $ yarn build-image --tag backstage:1.0.0
There is no special wiring needed to access the PostgreSQL service. Since it's
running on the same cluster, Kubernetes will inject `POSTGRES_SERVICE_HOST` and
`POSTGRES_SERVICE_PORT` environment variables into our Backstage container.
These can be used in the Backstage `app-config.yaml` along with the secrets:
These can be used in the Backstage `app-config.yaml` along with the secrets. Apply this to `app-config.production.yaml` as well if you have one:
```yaml
backend:
@@ -38,6 +38,7 @@ kubernetes:
plural: 'rollouts'
- url: http://127.0.0.2:9999
name: aws-cluster-1
title: 'My AWS Cluster Number One'
authProvider: 'aws'
- type: 'gke'
projectId: 'gke-clusters'
@@ -151,6 +152,11 @@ The base URL to the Kubernetes control plane. Can be found by using the
A name to represent this cluster, this must be unique within the `clusters`
array. Users will see this value in the Software Catalog Kubernetes plugin.
##### `clusters.\*.title`
A human-readable name for the cluster. This value will override the `name` field
for the purposes of display in the catalog.
##### `clusters.\*.authProvider`
This determines how the Kubernetes client authenticates with the Kubernetes
@@ -838,7 +838,7 @@ The current set of well-known and common values for this field is:
- `openapi` - An API definition in YAML or JSON format based on the
[OpenAPI](https://swagger.io/specification/) version 2 or version 3 spec.
- `asyncapi` - An API definition based on the
[AsyncAPI](https://www.asyncapi.com/docs/reference/specification/latest) spec.
[AsyncAPI](https://www.asyncapi.com/docs/reference/specification/latest) version 2 or version 3 spec.
- `graphql` - An API definition based on
[GraphQL schemas](https://spec.graphql.org/) for consuming
[GraphQL](https://graphql.org/) based APIs.
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -69,7 +69,7 @@ module.exports = {
],
],
markdown: {
preprocessor({ filePath, fileContent }) {
preprocessor({ fileContent }) {
// Replace all HTML comments with emtpy strings as these are not supported by MDXv2.
return fileContent.replace(/<!--.*?-->/gs, '');
},
+4 -4
View File
@@ -18,7 +18,7 @@
"docusaurus": "docusaurus"
},
"devDependencies": {
"@docusaurus/module-type-aliases": "0.0.0-5703",
"@docusaurus/module-type-aliases": "^3.1.1",
"@spotify/prettier-config": "^14.0.0",
"@tsconfig/docusaurus": "^2.0.0",
"@types/luxon": "^3.0.0",
@@ -30,9 +30,9 @@
},
"prettier": "@spotify/prettier-config",
"dependencies": {
"@docusaurus/core": "0.0.0-5703",
"@docusaurus/plugin-client-redirects": "0.0.0-5703",
"@docusaurus/preset-classic": "0.0.0-5703",
"@docusaurus/core": "^3.1.1",
"@docusaurus/plugin-client-redirects": "^3.1.1",
"@docusaurus/preset-classic": "^3.1.1",
"@swc/core": "^1.3.46",
"clsx": "^2.0.0",
"docusaurus-plugin-sass": "^0.2.3",
+994 -1607
View File
File diff suppressed because it is too large Load Diff
+3 -3
View File
@@ -62,7 +62,7 @@
"@material-ui/pickers@^3.3.10": "patch:@material-ui/pickers@npm%3A3.3.11#./.yarn/patches/@material-ui-pickers-npm-3.3.11-1c8f68ea20.patch",
"@material-ui/pickers@^3.2.10": "patch:@material-ui/pickers@npm%3A3.3.11#./.yarn/patches/@material-ui-pickers-npm-3.3.11-1c8f68ea20.patch"
},
"version": "1.23.0-next.2",
"version": "1.23.0-next.3",
"dependencies": {
"@backstage/errors": "workspace:^",
"@manypkg/get-packages": "^1.1.3",
@@ -89,9 +89,9 @@
"eslint-plugin-notice": "^0.9.10",
"eslint-plugin-react": "^7.28.0",
"eslint-plugin-testing-library": "^6.0.0",
"fs-extra": "10.1.0",
"fs-extra": "^11.2.0",
"husky": "^9.0.0",
"knip": "^4.3.1",
"knip": "^5.0.0",
"lint-staged": "^15.0.0",
"minimist": "^1.2.5",
"node-gyp": "^10.0.0",
+11
View File
@@ -1,5 +1,16 @@
# @backstage/app-defaults
## 1.5.0-next.3
### Patch Changes
- Updated dependencies
- @backstage/theme@0.5.1-next.1
- @backstage/core-components@0.14.0-next.2
- @backstage/core-app-api@1.12.0-next.1
- @backstage/core-plugin-api@1.9.0-next.1
- @backstage/plugin-permission-react@0.4.20-next.1
## 1.5.0-next.2
### Minor Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/app-defaults",
"description": "Provides the default wiring of a Backstage App",
"version": "1.5.0-next.2",
"version": "1.5.0-next.3",
"publishConfig": {
"access": "public",
"main": "dist/index.esm.js",
@@ -1,5 +1,13 @@
# app-next-example-plugin
## 0.0.6-next.3
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.14.0-next.2
- @backstage/frontend-plugin-api@0.6.0-next.3
## 0.0.6-next.2
### Patch Changes
+4 -4
View File
@@ -2,8 +2,8 @@
## Unused devDependencies (2)
| Name | Location |
|:------------|:-------------|
| msw | package.json |
| cross-fetch | package.json |
| Name | Location | Severity |
| :---------- | :----------- | :------- |
| cross-fetch | package.json | error |
| msw | package.json | error |
@@ -1,7 +1,7 @@
{
"name": "app-next-example-plugin",
"description": "Backstage internal example plugin",
"version": "0.0.6-next.2",
"version": "0.0.6-next.3",
"publishConfig": {
"access": "public",
"main": "dist/index.esm.js",
+76
View File
@@ -1,5 +1,81 @@
# example-app-next
## 0.0.6-next.3
### Patch Changes
- Updated dependencies
- @backstage/plugin-api-docs@0.11.0-next.3
- @backstage/cli@0.25.2-next.3
- @backstage/plugin-kubernetes@0.11.5-next.3
- @backstage/theme@0.5.1-next.1
- @backstage/plugin-playlist@0.2.4-next.3
- @backstage/plugin-catalog@1.17.0-next.3
- @backstage/frontend-app-api@0.6.0-next.3
- @backstage/plugin-app-visualizer@0.1.1-next.3
- @backstage/core-components@0.14.0-next.2
- @backstage/plugin-catalog-react@1.10.0-next.3
- @backstage/plugin-gcp-projects@0.3.46-next.2
- @backstage/plugin-scaffolder-react@1.8.0-next.3
- @backstage/plugin-scaffolder@1.18.0-next.3
- @backstage/plugin-techdocs-module-addons-contrib@1.1.5-next.3
- @backstage/plugin-home@0.6.2-next.3
- @backstage/plugin-gcalendar@0.3.23-next.2
- @backstage/plugin-microsoft-calendar@0.1.12-next.2
- @backstage/plugin-techdocs@1.10.0-next.3
- @backstage/plugin-catalog-import@0.10.6-next.3
- @backstage/plugin-github-actions@0.6.11-next.3
- @backstage/plugin-dynatrace@9.0.0-next.3
- @backstage/app-defaults@1.5.0-next.3
- app-next-example-plugin@0.0.6-next.3
- @backstage/catalog-model@1.4.4-next.0
- @backstage/core-app-api@1.12.0-next.1
- @backstage/core-compat-api@0.2.0-next.3
- @backstage/core-plugin-api@1.9.0-next.1
- @backstage/frontend-plugin-api@0.6.0-next.3
- @backstage/integration-react@1.1.24-next.2
- @backstage/plugin-adr@0.6.13-next.3
- @backstage/plugin-airbrake@0.3.30-next.3
- @backstage/plugin-apache-airflow@0.2.20-next.2
- @backstage/plugin-azure-devops@0.3.12-next.3
- @backstage/plugin-azure-sites@0.1.19-next.3
- @backstage/plugin-badges@0.2.54-next.3
- @backstage/plugin-catalog-common@1.0.21-next.0
- @backstage/plugin-catalog-graph@0.4.0-next.3
- @backstage/plugin-catalog-unprocessed-entities@0.1.8-next.2
- @backstage/plugin-cloudbuild@0.4.0-next.3
- @backstage/plugin-code-coverage@0.2.23-next.3
- @backstage/plugin-cost-insights@0.12.19-next.3
- @backstage/plugin-devtools@0.1.9-next.3
- @backstage/plugin-entity-feedback@0.2.13-next.3
- @backstage/plugin-explore@0.4.16-next.3
- @backstage/plugin-gocd@0.1.36-next.3
- @backstage/plugin-graphiql@0.3.3-next.3
- @backstage/plugin-jenkins@0.9.5-next.3
- @backstage/plugin-kafka@0.3.30-next.3
- @backstage/plugin-lighthouse@0.4.15-next.3
- @backstage/plugin-linguist@0.1.15-next.3
- @backstage/plugin-linguist-common@0.1.2
- @backstage/plugin-newrelic@0.3.45-next.2
- @backstage/plugin-newrelic-dashboard@0.3.5-next.3
- @backstage/plugin-octopus-deploy@0.2.12-next.3
- @backstage/plugin-org@0.6.20-next.3
- @backstage/plugin-pagerduty@0.7.2-next.3
- @backstage/plugin-permission-react@0.4.20-next.1
- @backstage/plugin-puppetdb@0.1.13-next.3
- @backstage/plugin-rollbar@0.4.30-next.3
- @backstage/plugin-search@1.4.6-next.3
- @backstage/plugin-search-common@1.2.10
- @backstage/plugin-search-react@1.7.6-next.3
- @backstage/plugin-sentry@0.5.15-next.3
- @backstage/plugin-shortcuts@0.3.19-next.2
- @backstage/plugin-stackstorm@0.1.11-next.2
- @backstage/plugin-tech-insights@0.3.22-next.3
- @backstage/plugin-tech-radar@0.6.13-next.3
- @backstage/plugin-techdocs-react@1.1.16-next.2
- @backstage/plugin-todo@0.2.34-next.3
- @backstage/plugin-user-settings@0.8.1-next.3
## 0.0.6-next.2
### Patch Changes
+74 -75
View File
@@ -1,82 +1,81 @@
# Knip report
## Unused dependencies (64)
## Unused dependencies (63)
| Name | Location |
|:-------------------------------------------------|:-------------|
| lodash | package.json |
| history | package.json |
| react-use | package.json |
| @octokit/rest | package.json |
| zen-observable | package.json |
| @material-ui/lab | package.json |
| @backstage/theme | package.json |
| @backstage/plugin-org | package.json |
| @backstage/plugin-adr | package.json |
| @backstage/plugin-todo | package.json |
| @backstage/plugin-gocd | package.json |
| app-next-example-plugin | package.json |
| @backstage/plugin-kafka | package.json |
| @backstage/app-defaults | package.json |
| @backstage/plugin-sentry | package.json |
| @backstage/plugin-search | package.json |
| @backstage/plugin-badges | package.json |
| @backstage/catalog-model | package.json |
| @backstage/plugin-rollbar | package.json |
| @backstage/plugin-jenkins | package.json |
| @backstage/plugin-explore | package.json |
| @backstage/plugin-catalog | package.json |
| @circleci/backstage-plugin | package.json |
| @backstage/plugin-puppetdb | package.json |
| @backstage/plugin-playlist | package.json |
| @backstage/plugin-newrelic | package.json |
| @backstage/plugin-linguist | package.json |
| @backstage/plugin-devtools | package.json |
| @backstage/plugin-api-docs | package.json |
| @backstage/plugin-airbrake | package.json |
| @backstage/plugin-shortcuts | package.json |
| @backstage/plugin-dynatrace | package.json |
| @backstage/plugin-stackstorm | package.json |
| @backstage/plugin-scaffolder | package.json |
| @backstage/plugin-lighthouse | package.json |
| @backstage/plugin-kubernetes | package.json |
| @backstage/plugin-cloudbuild | package.json |
| @backstage/plugin-azure-sites | package.json |
| @backstage/plugin-search-react | package.json |
| @backstage/plugin-gcp-projects | package.json |
| @backstage/plugin-azure-devops | package.json |
| @backstage/plugin-tech-insights | package.json |
| @backstage/plugin-search-common | package.json |
| @backstage/plugin-cost-insights | package.json |
| @backstage/plugin-code-coverage | package.json |
| @backstage/plugin-catalog-react | package.json |
| @backstage/plugin-catalog-graph | package.json |
| @backstage/plugin-techdocs-react | package.json |
| @backstage/plugin-octopus-deploy | package.json |
| @backstage/plugin-github-actions | package.json |
| @backstage/plugin-catalog-common | package.json |
| @backstage/plugin-apache-airflow | package.json |
| @backstage/plugin-linguist-common | package.json |
| @backstage/plugin-entity-feedback | package.json |
| @backstage/plugin-scaffolder-react | package.json |
| @backstage/plugin-permission-react | package.json |
| @roadiehq/backstage-plugin-travis-ci | package.json |
| @roadiehq/backstage-plugin-buildkite | package.json |
| @backstage/plugin-newrelic-dashboard | package.json |
| @oriflame/backstage-plugin-score-card | package.json |
| @roadiehq/backstage-plugin-github-insights | package.json |
| @backstage/plugin-catalog-unprocessed-entities | package.json |
| @roadiehq/backstage-plugin-github-pull-requests | package.json |
| @backstage/plugin-techdocs-module-addons-contrib | package.json |
| Name | Location | Severity |
| :----------------------------------------------- | :----------- | :------- |
| @backstage/plugin-techdocs-module-addons-contrib | package.json | error |
| @roadiehq/backstage-plugin-github-pull-requests | package.json | error |
| @backstage/plugin-catalog-unprocessed-entities | package.json | error |
| @roadiehq/backstage-plugin-github-insights | package.json | error |
| @oriflame/backstage-plugin-score-card | package.json | error |
| @backstage/plugin-newrelic-dashboard | package.json | error |
| @roadiehq/backstage-plugin-buildkite | package.json | error |
| @roadiehq/backstage-plugin-travis-ci | package.json | error |
| @backstage/plugin-permission-react | package.json | error |
| @backstage/plugin-scaffolder-react | package.json | error |
| @backstage/plugin-entity-feedback | package.json | error |
| @backstage/plugin-linguist-common | package.json | error |
| @backstage/plugin-apache-airflow | package.json | error |
| @backstage/plugin-catalog-common | package.json | error |
| @backstage/plugin-github-actions | package.json | error |
| @backstage/plugin-octopus-deploy | package.json | error |
| @backstage/plugin-techdocs-react | package.json | error |
| @backstage/plugin-catalog-graph | package.json | error |
| @backstage/plugin-catalog-react | package.json | error |
| @backstage/plugin-code-coverage | package.json | error |
| @backstage/plugin-cost-insights | package.json | error |
| @backstage/plugin-search-common | package.json | error |
| @backstage/plugin-tech-insights | package.json | error |
| @backstage/plugin-azure-devops | package.json | error |
| @backstage/plugin-gcp-projects | package.json | error |
| @backstage/plugin-search-react | package.json | error |
| @backstage/plugin-azure-sites | package.json | error |
| @backstage/plugin-cloudbuild | package.json | error |
| @backstage/plugin-kubernetes | package.json | error |
| @backstage/plugin-lighthouse | package.json | error |
| @backstage/plugin-scaffolder | package.json | error |
| @backstage/plugin-stackstorm | package.json | error |
| @backstage/plugin-dynatrace | package.json | error |
| @backstage/plugin-shortcuts | package.json | error |
| @backstage/plugin-airbrake | package.json | error |
| @backstage/plugin-api-docs | package.json | error |
| @backstage/plugin-devtools | package.json | error |
| @backstage/plugin-linguist | package.json | error |
| @backstage/plugin-newrelic | package.json | error |
| @backstage/plugin-playlist | package.json | error |
| @backstage/plugin-puppetdb | package.json | error |
| @circleci/backstage-plugin | package.json | error |
| @backstage/plugin-catalog | package.json | error |
| @backstage/plugin-explore | package.json | error |
| @backstage/plugin-jenkins | package.json | error |
| @backstage/plugin-rollbar | package.json | error |
| @backstage/catalog-model | package.json | error |
| @backstage/plugin-badges | package.json | error |
| @backstage/plugin-search | package.json | error |
| @backstage/plugin-sentry | package.json | error |
| @backstage/app-defaults | package.json | error |
| @backstage/plugin-kafka | package.json | error |
| app-next-example-plugin | package.json | error |
| @backstage/plugin-gocd | package.json | error |
| @backstage/plugin-todo | package.json | error |
| @backstage/plugin-adr | package.json | error |
| @backstage/plugin-org | package.json | error |
| @material-ui/lab | package.json | error |
| zen-observable | package.json | error |
| @octokit/rest | package.json | error |
| react-use | package.json | error |
| history | package.json | error |
| lodash | package.json | error |
## Unused devDependencies (6)
| Name | Location |
|:----------------------------|:-------------|
| cross-env | package.json |
| @types/jquery | package.json |
| @testing-library/dom | package.json |
| @types/zen-observable | package.json |
| @testing-library/react | package.json |
| @testing-library/user-event | package.json |
| Name | Location | Severity |
| :-------------------------- | :----------- | :------- |
| @testing-library/user-event | package.json | error |
| @testing-library/react | package.json | error |
| @types/zen-observable | package.json | error |
| @testing-library/dom | package.json | error |
| @types/jquery | package.json | error |
| cross-env | package.json | error |
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "example-app-next",
"version": "0.0.6-next.2",
"version": "0.0.6-next.3",
"private": true,
"repository": {
"type": "git",
+78
View File
@@ -1,5 +1,83 @@
# example-app
## 0.2.92-next.3
### Patch Changes
- Updated dependencies
- @backstage/plugin-api-docs@0.11.0-next.3
- @backstage/cli@0.25.2-next.3
- @backstage/plugin-kubernetes@0.11.5-next.3
- @backstage/theme@0.5.1-next.1
- @backstage/plugin-playlist@0.2.4-next.3
- @backstage/plugin-catalog@1.17.0-next.3
- @backstage/frontend-app-api@0.6.0-next.3
- @backstage/plugin-notifications@0.0.1-next.1
- @backstage/plugin-signals@0.0.1-next.3
- @backstage/core-components@0.14.0-next.2
- @backstage/plugin-catalog-react@1.10.0-next.3
- @backstage/plugin-gcp-projects@0.3.46-next.2
- @backstage/plugin-scaffolder-react@1.8.0-next.3
- @backstage/plugin-scaffolder@1.18.0-next.3
- @backstage/plugin-techdocs-module-addons-contrib@1.1.5-next.3
- @backstage/plugin-home@0.6.2-next.3
- @backstage/plugin-gcalendar@0.3.23-next.2
- @backstage/plugin-microsoft-calendar@0.1.12-next.2
- @backstage/plugin-techdocs@1.10.0-next.3
- @backstage/plugin-catalog-import@0.10.6-next.3
- @backstage/plugin-github-actions@0.6.11-next.3
- @backstage/plugin-dynatrace@9.0.0-next.3
- @backstage/plugin-kubernetes-cluster@0.0.6-next.3
- @backstage/app-defaults@1.5.0-next.3
- @backstage/catalog-model@1.4.4-next.0
- @backstage/config@1.1.1
- @backstage/core-app-api@1.12.0-next.1
- @backstage/core-plugin-api@1.9.0-next.1
- @backstage/integration-react@1.1.24-next.2
- @backstage/plugin-adr@0.6.13-next.3
- @backstage/plugin-airbrake@0.3.30-next.3
- @backstage/plugin-apache-airflow@0.2.20-next.2
- @backstage/plugin-azure-devops@0.3.12-next.3
- @backstage/plugin-azure-sites@0.1.19-next.3
- @backstage/plugin-badges@0.2.54-next.3
- @backstage/plugin-catalog-common@1.0.21-next.0
- @backstage/plugin-catalog-graph@0.4.0-next.3
- @backstage/plugin-catalog-unprocessed-entities@0.1.8-next.2
- @backstage/plugin-cloudbuild@0.4.0-next.3
- @backstage/plugin-code-coverage@0.2.23-next.3
- @backstage/plugin-cost-insights@0.12.19-next.3
- @backstage/plugin-devtools@0.1.9-next.3
- @backstage/plugin-entity-feedback@0.2.13-next.3
- @backstage/plugin-explore@0.4.16-next.3
- @backstage/plugin-gocd@0.1.36-next.3
- @backstage/plugin-graphiql@0.3.3-next.3
- @backstage/plugin-jenkins@0.9.5-next.3
- @backstage/plugin-kafka@0.3.30-next.3
- @backstage/plugin-lighthouse@0.4.15-next.3
- @backstage/plugin-linguist@0.1.15-next.3
- @backstage/plugin-linguist-common@0.1.2
- @backstage/plugin-newrelic@0.3.45-next.2
- @backstage/plugin-newrelic-dashboard@0.3.5-next.3
- @backstage/plugin-nomad@0.1.11-next.3
- @backstage/plugin-octopus-deploy@0.2.12-next.3
- @backstage/plugin-org@0.6.20-next.3
- @backstage/plugin-pagerduty@0.7.2-next.3
- @backstage/plugin-permission-react@0.4.20-next.1
- @backstage/plugin-puppetdb@0.1.13-next.3
- @backstage/plugin-rollbar@0.4.30-next.3
- @backstage/plugin-search@1.4.6-next.3
- @backstage/plugin-search-common@1.2.10
- @backstage/plugin-search-react@1.7.6-next.3
- @backstage/plugin-sentry@0.5.15-next.3
- @backstage/plugin-shortcuts@0.3.19-next.2
- @backstage/plugin-stack-overflow@0.1.25-next.3
- @backstage/plugin-stackstorm@0.1.11-next.2
- @backstage/plugin-tech-insights@0.3.22-next.3
- @backstage/plugin-tech-radar@0.6.13-next.3
- @backstage/plugin-techdocs-react@1.1.16-next.2
- @backstage/plugin-todo@0.2.34-next.3
- @backstage/plugin-user-settings@0.8.1-next.3
## 0.2.92-next.2
### Patch Changes
+27 -28
View File
@@ -1,38 +1,37 @@
# Knip report
## Unused dependencies (15)
## Unused dependencies (14)
| Name | Location |
|:----------------------------------|:-------------|
| vite | package.json |
| history | package.json |
| react-router | package.json |
| @octokit/rest | package.json |
| zen-observable | package.json |
| vite-plugin-html | package.json |
| @material-ui/lab | package.json |
| @backstage/theme | package.json |
| @vitejs/plugin-react | package.json |
| vite-plugin-node-polyfills | package.json |
| @backstage/plugin-airbrake | package.json |
| @backstage/frontend-app-api | package.json |
| @backstage/plugin-azure-sites | package.json |
| @backstage/plugin-search-common | package.json |
| @backstage/plugin-linguist-common | package.json |
| Name | Location | Severity |
| :-------------------------------- | :----------- | :------- |
| @backstage/plugin-linguist-common | package.json | error |
| @backstage/plugin-search-common | package.json | error |
| @backstage/plugin-azure-sites | package.json | error |
| @backstage/frontend-app-api | package.json | error |
| @backstage/plugin-airbrake | package.json | error |
| vite-plugin-node-polyfills | package.json | error |
| @vitejs/plugin-react | package.json | error |
| @material-ui/lab | package.json | error |
| vite-plugin-html | package.json | error |
| zen-observable | package.json | error |
| @octokit/rest | package.json | error |
| react-router | package.json | error |
| history | package.json | error |
| vite | package.json | error |
## Unused devDependencies (5)
| Name | Location |
|:----------------------------|:-------------|
| cross-env | package.json |
| @types/jquery | package.json |
| @testing-library/dom | package.json |
| @types/zen-observable | package.json |
| @testing-library/user-event | package.json |
| Name | Location | Severity |
| :-------------------------- | :----------- | :------- |
| @testing-library/user-event | package.json | error |
| @types/zen-observable | package.json | error |
| @testing-library/dom | package.json | error |
| @types/jquery | package.json | error |
| cross-env | package.json | error |
## Unlisted dependencies (1)
| Name | Location |
|:------------|:---------------------------------------------------------|
| @rjsf/utils | src/components/scaffolder/customScaffolderExtensions.tsx |
| Name | Location | Severity |
| :---------- | :------------------------------------------------------- | :------- |
| @rjsf/utils | src/components/scaffolder/customScaffolderExtensions.tsx | error |
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "example-app",
"version": "0.2.92-next.2",
"version": "0.2.92-next.3",
"private": true,
"backstage": {
"role": "frontend"
@@ -104,7 +104,7 @@
"react-use": "^17.2.4",
"vite": "^4.4.9",
"vite-plugin-html": "^3.2.0",
"vite-plugin-node-polyfills": "^0.19.0",
"vite-plugin-node-polyfills": "^0.21.0",
"zen-observable": "^0.10.0"
},
"devDependencies": {
+18
View File
@@ -1,5 +1,23 @@
# @backstage/backend-app-api
## 0.5.11-next.3
### Patch Changes
- 54ad8e1: Allow the `createConfigSecretEnumerator` to take an optional `schema` argument with an already-loaded global configuration schema.
- Updated dependencies
- @backstage/backend-common@0.21.0-next.3
- @backstage/cli-node@0.2.3-next.0
- @backstage/backend-tasks@0.5.15-next.3
- @backstage/config-loader@1.6.2-next.0
- @backstage/plugin-auth-node@0.4.4-next.3
- @backstage/plugin-permission-node@0.7.21-next.3
- @backstage/backend-plugin-api@0.6.10-next.3
- @backstage/cli-common@0.1.13
- @backstage/config@1.1.1
- @backstage/errors@1.2.3
- @backstage/types@1.1.1
## 0.5.11-next.2
### Patch Changes
+2
View File
@@ -9,6 +9,7 @@ import type { AppConfig } from '@backstage/config';
import { BackendFeature } from '@backstage/backend-plugin-api';
import { CacheClient } from '@backstage/backend-common';
import { Config } from '@backstage/config';
import { ConfigSchema } from '@backstage/config-loader';
import { CorsOptions } from 'cors';
import { DiscoveryService } from '@backstage/backend-plugin-api';
import { ErrorRequestHandler } from 'express';
@@ -64,6 +65,7 @@ export const cacheServiceFactory: () => ServiceFactory<CacheClient, 'plugin'>;
export function createConfigSecretEnumerator(options: {
logger: LoggerService;
dir?: string;
schema?: ConfigSchema;
}): Promise<(config: Config) => Iterable<string>>;
// @public
+3 -3
View File
@@ -2,7 +2,7 @@
## Unused dependencies (1)
| Name | Location |
|:------------------|:-------------|
| winston-transport | package.json |
| Name | Location | Severity |
| :---------------- | :----------- | :------- |
| winston-transport | package.json | error |
+3 -3
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-app-api",
"description": "Core API used by Backstage backend apps",
"version": "0.5.11-next.2",
"version": "0.5.11-next.3",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
@@ -63,7 +63,7 @@
"cors": "^2.8.5",
"express": "^4.17.1",
"express-promise-router": "^4.1.0",
"fs-extra": "10.1.0",
"fs-extra": "^11.2.0",
"helmet": "^6.0.0",
"lodash": "^4.17.21",
"logform": "^2.3.2",
@@ -80,7 +80,7 @@
"@backstage/backend-test-utils": "workspace:^",
"@backstage/cli": "workspace:^",
"@types/compression": "^1.7.0",
"@types/fs-extra": "^9.0.3",
"@types/fs-extra": "^11.0.0",
"@types/http-errors": "^2.0.0",
"@types/minimist": "^1.2.0",
"@types/morgan": "^1.9.0",
@@ -23,6 +23,7 @@ import {
loadConfig,
ConfigTarget,
LoadConfigOptionsRemote,
ConfigSchema,
} from '@backstage/config-loader';
import { ConfigReader } from '@backstage/config';
import type { Config, AppConfig } from '@backstage/config';
@@ -34,12 +35,15 @@ import { isValidUrl } from '../lib/urls';
export async function createConfigSecretEnumerator(options: {
logger: LoggerService;
dir?: string;
schema?: ConfigSchema;
}): Promise<(config: Config) => Iterable<string>> {
const { logger, dir = process.cwd() } = options;
const { packages } = await getPackages(dir);
const schema = await loadConfigSchema({
dependencies: packages.map(p => p.packageJson.name),
});
const schema =
options.schema ??
(await loadConfigSchema({
dependencies: packages.map(p => p.packageJson.name).filter(() => false),
}));
return (config: Config) => {
const [secretsData] = schema.process(
+27
View File
@@ -1,5 +1,32 @@
# @backstage/backend-common
## 0.21.0-next.3
### Minor Changes
- bbe374e: **BREAKING**: `A gitilesBaseUrl` must be provided for the Gerrit integration to work.
You can disable this check by setting `DISABLE_GERRIT_GITILES_REQUIREMENT=1` but
this will be removed in a future release. If you are not able to use the Gitiles
Gerrit plugin, please open an issue towards `https://github.com/backstage/backstage`
### Patch Changes
- 6707216: Added a new `LegacyRootDatabaseService` interface that can be used to avoid direct dependencies on the `DatabaseManager`.
- 842171a: Fix a bug with S3 Fetch that caused all objects to be flattened within a single folder on the local file system.
- ece5a8f: Add a User-Agent header for calls towards Google Cloud Storage.
- 1cae748: Updated dependency `git-url-parse` to `^14.0.0`.
- Updated dependencies
- @backstage/integration-aws-node@0.1.9-next.0
- @backstage/integration@1.9.0-next.1
- @backstage/backend-app-api@0.5.11-next.3
- @backstage/config-loader@1.6.2-next.0
- @backstage/backend-dev-utils@0.1.4-next.0
- @backstage/backend-plugin-api@0.6.10-next.3
- @backstage/cli-common@0.1.13
- @backstage/config@1.1.1
- @backstage/errors@1.2.3
- @backstage/types@1.1.1
## 0.21.0-next.2
### Patch Changes
+13 -13
View File
@@ -2,23 +2,23 @@
## Unused dependencies (3)
| Name | Location |
|:----------------------|:-------------|
| mysql2 | package.json |
| @types/webpack-env | package.json |
| @manypkg/get-packages | package.json |
| Name | Location | Severity |
| :-------------------- | :----------- | :------- |
| @manypkg/get-packages | package.json | error |
| @types/webpack-env | package.json | error |
| mysql2 | package.json | error |
## Unused devDependencies (3)
| Name | Location |
|:-------------------|:-------------|
| mysql2 | package.json |
| better-sqlite3 | package.json |
| @types/webpack-env | package.json |
| Name | Location | Severity |
| :----------------- | :----------- | :------- |
| @types/webpack-env | package.json | error |
| better-sqlite3 | package.json | error |
| mysql2 | package.json | error |
## Referenced optional peerDependencies (1)
| Name | Location |
|:---------------------|:-------------|
| pg-connection-string | package.json |
| Name | Location | Severity |
| :------------------- | :----------- | :------- |
| pg-connection-string | package.json | error |
+4 -4
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-common",
"description": "Common functionality library for Backstage backends",
"version": "0.21.0-next.2",
"version": "0.21.0-next.3",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
@@ -80,10 +80,10 @@
"compression": "^1.7.4",
"concat-stream": "^2.0.0",
"cors": "^2.8.5",
"dockerode": "^3.3.1",
"dockerode": "^4.0.0",
"express": "^4.17.1",
"express-promise-router": "^4.1.0",
"fs-extra": "10.1.0",
"fs-extra": "^11.2.0",
"git-url-parse": "^14.0.0",
"helmet": "^6.0.0",
"isomorphic-git": "^1.23.0",
@@ -122,7 +122,7 @@
"@types/base64-stream": "^1.0.2",
"@types/compression": "^1.7.0",
"@types/concat-stream": "^2.0.0",
"@types/fs-extra": "^9.0.3",
"@types/fs-extra": "^11.0.0",
"@types/http-errors": "^2.0.0",
"@types/pg": "^8.6.6",
"@types/supertest": "^2.0.8",
@@ -46,6 +46,7 @@ import {
import { AbortController } from '@aws-sdk/abort-controller';
import { ReadUrlResponseFactory } from './ReadUrlResponseFactory';
import { Readable } from 'stream';
import { relative } from 'path/posix';
export const DEFAULT_REGION = 'us-east-1';
@@ -345,7 +346,7 @@ export class AwsS3UrlReader implements UrlReader {
responses.push({
data: s3ObjectData,
path: String(allObjects[i]),
path: relative(path, String(allObjects[i])),
lastModifiedAt: response?.LastModified ?? undefined,
});
}
@@ -32,10 +32,15 @@ import path from 'path';
import { getVoidLogger } from '../logging';
import { UrlReaderPredicateTuple } from './types';
import { DefaultReadTreeResponseFactory } from './tree';
import { GerritUrlReader } from './GerritUrlReader';
import {
GITILES_BASE_URL_DEPRECATION_MESSSAGE,
GerritUrlReader,
} from './GerritUrlReader';
import getRawBody from 'raw-body';
const mockDir = createMockDirectory({ mockOsTmpDir: true });
const env = process.env;
process.env = { ...env, DISABLE_GERRIT_GITILES_REQUIREMENT: '1' };
const treeResponseFactory = DefaultReadTreeResponseFactory.create({
config: new ConfigReader({}),
@@ -93,10 +98,14 @@ describe.skip('GerritUrlReader', () => {
const worker = setupServer();
setupRequestMockHandlers(worker);
beforeEach(mockDir.clear);
beforeEach(() => {
mockDir.clear();
process.env = { ...env, DISABLE_GERRIT_GITILES_REQUIREMENT: '1' };
});
afterAll(() => {
jest.clearAllMocks();
process.env = env;
});
describe('reader factory', () => {
@@ -117,6 +126,29 @@ describe.skip('GerritUrlReader', () => {
});
});
describe('handle optional gitilesBaseUrl deprecation', () => {
it('should throw if gitilesBaseUrl is not set.', () => {
process.env = env;
expect(() =>
createReader({
integrations: {
gerrit: [{ host: 'gerrit.com' }],
},
}),
).toThrow(GITILES_BASE_URL_DEPRECATION_MESSSAGE);
});
it('should not throw if gitilesBaseUrl requirement is overridden.', () => {
process.env = { ...env, DISABLE_GERRIT_GITILES_REQUIREMENT: '1' };
expect(() =>
createReader({
integrations: {
gerrit: [{ host: 'gerrit.com' }],
},
}),
).not.toThrow();
});
});
describe('predicates without Gitiles', () => {
const readers = createReader({
integrations: {
@@ -49,6 +49,12 @@ import {
const pipeline = promisify(pipelineCb);
export const GITILES_BASE_URL_DEPRECATION_MESSSAGE = `A gitilesBaseUrl must be provided \
for the gerrit integration to work. You can disable this check by setting \
DISABLE_GERRIT_GITILES_REQUIREMENT=1 but this will be removed in a future release. If you \
are not able to use the gitiles gerrit plugin, please open an issue towards \
https://github.com/backstage/backstage`;
const createTemporaryDirectory = async (workDir: string): Promise<string> =>
await fs.mkdtemp(joinPath(workDir, '/gerrit-clone-'));
@@ -81,6 +87,12 @@ export class GerritUrlReader implements UrlReader {
const workDir =
config.getOptionalString('backend.workingDirectory') ?? os.tmpdir();
return integrations.gerrit.list().map(integration => {
if (
integration.config.gitilesBaseUrl === integration.config.baseUrl &&
process.env.DISABLE_GERRIT_GITILES_REQUIREMENT === undefined
) {
throw new Error(GITILES_BASE_URL_DEPRECATION_MESSSAGE);
}
const reader = new GerritUrlReader(
integration,
{ treeResponseFactory },
@@ -20,6 +20,7 @@ import { getVoidLogger } from '../logging';
import { DefaultReadTreeResponseFactory } from './tree';
import { GoogleGcsUrlReader } from './GoogleGcsUrlReader';
import { UrlReaderPredicateTuple } from './types';
import packageinfo from '../../package.json';
const bucketGetFilesMock = jest.fn();
jest.mock('@google-cloud/storage', () => {
@@ -77,6 +78,20 @@ describe('GcsUrlReader', () => {
});
expect(entries).toHaveLength(1);
});
it('check if userAgent has been called with this key value', async () => {
const getStorage: any = {
userAgent: `backstage/backend-common.GoogleGcsUrlReader/${packageinfo.version}`,
};
jest.mock('@google-cloud/storage', () => {
return {
Storage: jest.fn(() => getStorage),
};
});
const getUserAgent = getStorage.userAgent.toString();
expect(getUserAgent).toBe(
`backstage/backend-common.GoogleGcsUrlReader/${packageinfo.version}`,
);
});
describe('predicates', () => {
const readers = createReader({
@@ -30,6 +30,7 @@ import {
} from '@backstage/integration';
import { Readable } from 'stream';
import { ReadUrlResponseFactory } from './ReadUrlResponseFactory';
import packageinfo from '../../package.json';
const GOOGLE_GCS_HOST = 'storage.cloud.google.com';
@@ -68,13 +69,16 @@ export class GoogleGcsUrlReader implements UrlReader {
logger.info(
'googleGcs credentials not found in config. Using default credentials provider.',
);
storage = new Storage();
storage = new Storage({
userAgent: `backstage/backend-common.GoogleGcsUrlReader/${packageinfo.version}`,
});
} else {
storage = new Storage({
credentials: {
client_email: gcsConfig.clientEmail || undefined,
private_key: gcsConfig.privateKey || undefined,
},
userAgent: `backstage/backend-common.GoogleGcsUrlReader/${packageinfo.version}`,
});
}
const reader = new GoogleGcsUrlReader(gcsConfig, storage);
@@ -19,6 +19,7 @@ import path from 'path';
import { FromReadableArrayOptions } from '../types';
import { ReadableArrayResponse } from './ReadableArrayResponse';
import { createMockDirectory } from '@backstage/backend-test-utils';
import { relative } from 'path/posix';
const name1 = 'file1.yaml';
const file1 = fs.readFileSync(
@@ -74,9 +75,12 @@ describe('ReadableArrayResponse', () => {
});
it('should extract entire archive into directory', async () => {
const relativePath1 = relative(sourceDir.path, path1);
const relativePath2 = relative(sourceDir.path, path2);
const arr: FromReadableArrayOptions = [
{ data: createReadStream(path1), path: path1 },
{ data: createReadStream(path2), path: path2 },
{ data: createReadStream(path1), path: relativePath1 },
{ data: createReadStream(path2), path: relativePath2 },
];
const res = new ReadableArrayResponse(arr, targetDir.path, 'etag');
@@ -15,7 +15,7 @@
*/
import concatStream from 'concat-stream';
import platformPath, { basename } from 'path';
import platformPath, { dirname } from 'path';
import getRawBody from 'raw-body';
import fs from 'fs-extra';
@@ -96,12 +96,9 @@ export class ReadableArrayResponse implements ReadTreeResponse {
for (let i = 0; i < this.stream.length; i++) {
if (!this.stream[i].path.endsWith('/')) {
await pipeline(
this.stream[i].data,
fs.createWriteStream(
platformPath.join(dir, basename(this.stream[i].path)),
),
);
const filePath = platformPath.join(dir, this.stream[i].path);
await fs.mkdir(dirname(filePath), { recursive: true });
await pipeline(this.stream[i].data, fs.createWriteStream(filePath));
}
}
+8
View File
@@ -1,5 +1,13 @@
# @backstage/backend-defaults
## 0.2.10-next.3
### Patch Changes
- Updated dependencies
- @backstage/backend-common@0.21.0-next.3
- @backstage/backend-app-api@0.5.11-next.3
## 0.2.10-next.2
### Patch Changes
+3 -3
View File
@@ -2,7 +2,7 @@
## Unused devDependencies (1)
| Name | Location |
|:------------------------------|:-------------|
| @backstage/backend-test-utils | package.json |
| Name | Location | Severity |
| :---------------------------- | :----------- | :------- |
| @backstage/backend-test-utils | package.json | error |
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-defaults",
"description": "Backend defaults used by Backstage backend apps",
"version": "0.2.10-next.2",
"version": "0.2.10-next.3",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
@@ -1,5 +1,39 @@
# @backstage/backend-dynamic-feature-service
## 0.2.0-next.3
### Minor Changes
- d7adbbf: Implement the discovery of additional individual configuration schemas for dynamic plugins, and provide:
- an alternate implementation of the root logger service that takes them into account,
- an extension to the App backend plugin to set a global configuration schema that takes them into account.
### Patch Changes
- 8472188: Added or fixed the `repository` field in `package.json`.
- Updated dependencies
- @backstage/backend-common@0.21.0-next.3
- @backstage/cli-node@0.2.3-next.0
- @backstage/backend-app-api@0.5.11-next.3
- @backstage/backend-tasks@0.5.15-next.3
- @backstage/config-loader@1.6.2-next.0
- @backstage/plugin-app-node@0.1.10-next.3
- @backstage/plugin-catalog-backend@1.17.0-next.3
- @backstage/plugin-auth-node@0.4.4-next.3
- @backstage/plugin-events-backend@0.2.19-next.3
- @backstage/plugin-permission-node@0.7.21-next.3
- @backstage/plugin-scaffolder-node@0.3.0-next.3
- @backstage/plugin-search-backend-node@1.2.14-next.3
- @backstage/backend-plugin-api@0.6.10-next.3
- @backstage/cli-common@0.1.13
- @backstage/config@1.1.1
- @backstage/errors@1.2.3
- @backstage/types@1.1.1
- @backstage/plugin-events-node@0.2.19-next.3
- @backstage/plugin-permission-common@0.7.12
- @backstage/plugin-search-common@1.2.10
## 0.1.1-next.2
### Patch Changes

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