Commit Graph

73623 Commits

Author SHA1 Message Date
Fredrik Adelöw bb6c46adc0 fix(catalog-backend): create replacement indices before dropping in down migration
Avoids a window with no coverage on (key, value) during rollback.

Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-11 12:50:02 +02:00
Fredrik Adelöw c8efd9dda5 clarify death loop risk in migration comments and changeset
Be explicit that interrupted index builds do not leave partial progress —
each retry starts from scratch. On large tables with short liveness
probe timeouts this repeats indefinitely. Recommend running the SQL
commands manually before deploying.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
2026-05-10 19:16:32 +02:00
Fredrik Adelöw 27d2d3f0a2 fix down migration + update SQL report
The down migration now restores the previous index state (drops new
indices, recreates the old search_key_value_idx and
search_key_original_value_idx). Updated the SQL report to reflect the
new index set.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
2026-05-10 14:21:19 +02:00
Fredrik Adelöw 7445f0f5bc draft(catalog-backend): search table dedup, covering indices, UNIQUE constraint
Single knex migration that cleans up duplicate search rows and creates
covering indices including a UNIQUE constraint on (entity_id, key, value).
Each step is idempotent and handles INVALID indices from interrupted runs.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
2026-05-10 14:16:03 +02:00
Andre Wanlin 044ba27248 Merge pull request #33884 from backstage/dependabot/npm_and_yarn/microsite/follow-redirects-1.16.0
chore(deps): bump follow-redirects from 1.15.6 to 1.16.0 in /microsite
2026-05-08 14:17:43 -05:00
Andre Wanlin a44f28972a Merge pull request #34141 from backstage/renovate/snyk-actions-digest
chore(deps): update snyk/actions digest to 9cf6ca7
2026-05-08 14:08:36 -05:00
Andre Wanlin 3e4d49db23 Merge pull request #34060 from raphaeltorquat0/fix/issue-32925
docs(techdocs): fix incorrect S3 permission in AWS configuration
2026-05-08 14:07:57 -05:00
Andre Wanlin d45038ebde Merge pull request #34062 from backstage/dependabot/npm_and_yarn/microsite/postcss-8.5.10
chore(deps): Bump postcss from 8.5.6 to 8.5.10 in /microsite
2026-05-08 14:07:17 -05:00
Andre Wanlin 87ff9ee4e3 Merge pull request #33645 from backstage/renovate/github-codeql-action-4.x
chore(deps): update github/codeql-action action to v4.35.4
2026-05-08 14:06:39 -05:00
Andre Wanlin cd02b9e99b Merge pull request #33635 from backstage/dependabot/npm_and_yarn/brace-expansion-1.1.13
build(deps): bump brace-expansion from 1.1.12 to 1.1.13
2026-05-08 14:06:15 -05:00
Andre Wanlin 1b046f6c6e Merge pull request #33634 from backstage/dependabot/npm_and_yarn/microsite/brace-expansion-1.1.13
build(deps): bump brace-expansion from 1.1.12 to 1.1.13 in /microsite
2026-05-08 14:06:03 -05:00
Andre Wanlin df2a5f8de1 Merge pull request #34120 from backstage/dependabot/npm_and_yarn/vm2-3.11.2
build(deps): bump vm2 from 3.10.3 to 3.11.2
2026-05-08 14:03:24 -05:00
Andre Wanlin 47f7e459bb Merge pull request #34094 from leboncoin/docs-style-guide-format-issue
docs(contribute): correct format issue in doc-style-guide.md
2026-05-08 14:02:28 -05:00
Andre Wanlin 5f8ff96fe0 Merge pull request #33545 from backstage/sennyeya/deployment-guide
docs: add deployment golden path guide
2026-05-08 14:01:59 -05:00
Andre Wanlin 254d2b9b5c Merge pull request #33793 from backstage/dependabot/npm_and_yarn/hono/node-server-1.19.13
chore(deps): bump @hono/node-server from 1.19.10 to 1.19.13
2026-05-08 14:01:34 -05:00
Andre Wanlin ea7d8ac8e9 Merge pull request #33489 from jdgranberry/correct-rum-config-syntax
docs: correct syntax for configuring RUM instrumentation
2026-05-08 13:59:05 -05:00
Andre Wanlin e344fe40cb Merge pull request #34116 from drodil/fix_mui_to_bui_skill
docs(mui-to-bui): fix mangled jsx examples
2026-05-08 13:33:47 -05:00
Eva Gustavsson 41b65b190e fix: Correct faulty link to techdocs-cli (#34091)
The link to Github repository of techdocs-cli was
faulty. This commit corrects the link in the
documentation.

Signed-off-by: evhnn29 <eva.gustavsson@t-online.de>
2026-05-08 10:22:56 -04:00
Fredrik Adelöw 95f31b18ec Merge pull request #34160 from backstage/freben/catalog-metrics-cache
fix(catalog-backend): cache and cheapen catalog_entities_count metric
2026-05-08 14:51:08 +03:00
Fredrik Adelöw 594de037f1 Merge pull request #34158 from backstage/freben/facets-inner-join
fix(catalog-backend): use INNER JOIN for filtered entity facets
2026-05-08 14:49:55 +03:00
Fredrik Adelöw 8f7f591c46 coalesce overlapping callers via single-flight in-flight promise
Hold a shared promise rather than just a resolved value. Concurrent
callers awaiting a fresh count get the same in-flight promise back, so
the underlying query is never overlapped by a duplicate. The TTL is now
the minimum gap between the resolution of one query and the start of
the next, rather than a hard bound on cache age.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
2026-05-08 11:55:26 +02:00
Fredrik Adelöw ccbad9d892 fix(catalog-backend): cache and cheapen catalog_entities_count metric
The legacy Prometheus and OpenTelemetry observable gauges previously each
ran the per-kind count query against the search table on every metrics
scrape. With multiple pods and short scrape intervals, identical
sequential scans piled up faster than they completed, contending for
buffers in the database.

Extract a shared helper that wraps a 30-second TTL cache around a single
query, and have both gauges read from it. The query itself moves from
the (large) search table to final_entities, parsing kind out of
entity_ref via per-engine substring functions. The emitted labels and
values are unchanged.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
2026-05-08 11:48:58 +02:00
Fredrik Adelöw 3f55b73e32 fix(catalog-backend): use INNER JOIN for filtered entity facets
Replace the `WHERE search.entity_id IN (...)` form with an INNER JOIN
against the filtered final_entities subquery in DefaultEntitiesCatalog#facets.
Results are unchanged; the planner gets more freedom to pick cheaper plans,
which on large catalogs leads to substantial speedups (1.2× to 7×+ in
adversarial testing on a ~13.8M-row search table) and avoids the
materialize-then-spill pattern of the IN form.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
2026-05-08 11:17:08 +02:00
renovate[bot] 2e435d8e88 Update github/codeql-action action to v4.35.4
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-07 16:26:59 +00:00
Johan Persson 4bb649d511 fix(ui): prevent selection checkboxes from creating phantom scroll height
Add `position: relative` to `.bui-Table` so it becomes the containing
block for react-aria's absolutely positioned hidden checkbox inputs.

Without this, the inputs position themselves relative to a distant
ancestor, extending its scrollable area and creating phantom scroll
height.

Signed-off-by: Johan Persson <johanopersson@gmail.com>
2026-05-07 16:39:02 +02:00
Fredrik Adelöw 213c6807d9 Merge pull request #33991 from jtbry/master
fix(SecureTemplater): return dispose function to clean up secure temp…
2026-05-07 17:15:23 +03:00
Fredrik Adelöw 90d9e05133 Merge pull request #34149 from hudsonb/bhudson/aws-wif-token-file
feat(integration-aws-node): add per-account webIdentityTokenFile config
2026-05-07 16:28:12 +03:00
Fredrik Adelöw 52dd22b436 Merge pull request #34150 from backstage/rugvip/app-routes-param-redirects
plugin-app: substitute path params in app/routes redirect targets
2026-05-07 15:33:19 +03:00
Fredrik Adelöw 5ebd1a14a0 plugin-app: fix param substitution to use word boundary
Use a word-boundary regex (:name\b) instead of a plain string replace
so that a shorter param like :a doesn't corrupt a longer param :ab
when both are present in the route.

Signed-off-by: Patrik Oldsberg <rugvip@backstage.io>
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-07 14:03:07 +02:00
Fredrik Adelöw a3458208a5 plugin-app: substitute path params in app/routes redirect targets
The app/routes redirect config now performs the same :param and *
substitution that the legacy Redirect component did before navigating.
Named params captured by the `from` pattern are replaced in the `to`
string, enabling redirects like /users/:userId → /profile/:userId and
/old-docs → /docs/* (with splat forwarding).

Adds tests for both named-param and splat substitution.

Signed-off-by: Patrik Oldsberg <rugvip@backstage.io>
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-07 13:57:23 +02:00
Brian Hudson 8df06ec2bc feat(integration-aws-node): add per-account webIdentityTokenFile config
Adds an optional `webIdentityTokenFile` field to
`AwsIntegrationAccountConfig` and `AwsIntegrationDefaultAccountConfig`.
When set on a per-account config along with a `roleName` and no static
credentials, `DefaultAwsCredentialsManager` now retrieves credentials
by calling `AssumeRoleWithWebIdentity` directly using the file's
contents as the web identity token (via `fromTokenFile`). The token
file is re-read on each refresh, so an external process can rotate it
in place — the same mechanism EKS IRSA uses, where the kubelet rotates
a projected service account token at the path identified by
`AWS_WEB_IDENTITY_TOKEN_FILE`.

This unlocks multi-account `AssumeRoleWithWebIdentity` for backends
running outside AWS (GKE, Cloud Run, Vault sidecars, etc.) without
requiring every plugin to construct a custom `AwsCredentialsManager`.
Existing call sites and configurations are unaffected — the new path
is opt-in via the new optional field.

Validator rejects:

- `webIdentityTokenFile` combined with static credentials
  (`accessKeyId`/`secretAccessKey`) on the same account
- `webIdentityTokenFile` combined with `profile` on the same account
- `webIdentityTokenFile` without a `roleName` (matches the existing
  precedent for `externalId`/`region`/`partition` without `roleName`)
- `webIdentityTokenFile` combined with `externalId` (the STS
  `AssumeRoleWithWebIdentity` API does not accept an external ID)

Same rules apply at the `accountDefaults` level. The `!config.accessKeyId`
guard in `getSdkCredentialProvider` is defensive — it protects callers
that build an `AwsIntegrationAccountConfig` directly without going
through `readAwsIntegrationConfig`. In that case we fall through to the
existing static-creds AssumeRole path.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Signed-off-by: Brian Hudson <brian.r.hudson@gmail.com>
2026-05-07 07:43:47 -04:00
Andre Wanlin 11de61064c Merge pull request #34054 from backstage/analytics/instrumentation-skill
[Analytics] Instrumentation Agent Skill
2026-05-06 14:55:04 -05:00
Andre Wanlin fe697792c5 Merge pull request #34105 from awanlin/topic/non-breaking-typos
Fixes for non-breaking typos and typos configuration
2026-05-06 13:44:11 -05:00
Justin Bryant 964bc8694f fix: run prettier
Signed-off-by: Justin Bryant <justintbry@gmail.com>
2026-05-06 10:04:32 -04:00
Justin Bryant 4bcbd8245b Merge branch 'master' into master
Signed-off-by: Justin Bryant <justintbry@gmail.com>
2026-05-06 09:49:24 -04:00
Rickard Dybeck e68cb8ac0f feat(kubernetes-react): add optional getClusters() cache to KubernetesBackendClient (#34136)
fix(kubernetes-react): coalesce concurrent getClusters() fetches and validate TTL input

Signed-off-by: Rickard Dybeck <dybeck@spotify.com>
2026-05-06 09:16:24 -04:00
renovate[bot] 2f54d56a7c Update snyk/actions digest to 9cf6ca7
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-06 13:03:29 +00:00
backstage-goalie[bot] 548a5558f5 Merge pull request #34126 from backstage/renovate/npm-axios-vulnerability
Update dependency axios to v1.15.2 [SECURITY]
2026-05-06 12:55:51 +00:00
backstage-goalie[bot] ad7eaee232 Merge pull request #34064 from backstage/renovate/npm-postcss-vulnerability
Update dependency postcss to v8.5.10 [SECURITY]
2026-05-06 12:55:46 +00:00
Fredrik Adelöw a590d4ad96 Merge pull request #34130 from backstage/codex/turtle395-improve-mcp-auth-dialog
Show MCP client metadata in auth consent dialog
2026-05-06 14:56:34 +03:00
Djam 9d6edc0622 Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Djam <rdjamaile@gmail.com>
2026-05-06 13:02:43 +02:00
djamaile 4f62755eed feat(auth): TURTLE-395: show MCP client metadata
Signed-off-by: djamaile <rdjamaile@gail.com>
2026-05-06 11:19:17 +02:00
Fredrik Adelöw d047c50c4b Merge pull request #34102 from backstage/changeset-release/master
Version Packages (next)
2026-05-05 19:37:23 +03:00
github-actions[bot] b0bc1e5cc9 Version Packages (next) 2026-05-05 14:57:07 +00:00
Johan Persson 25909ba27a feat(ui): add searchDebounceMs/filterDebounceMs to useTable complete mode (#34127)
* feat(ui): add internal useDebouncedValue hook for Table

Signed-off-by: Johan Persson <johanopersson@gmail.com>

* feat(ui): expose searchDebounceMs and filterDebounceMs on UseTableCompleteOptions

Signed-off-by: Johan Persson <johanopersson@gmail.com>

* feat(ui): debounce search/filter in useTable complete mode pipeline

Signed-off-by: Johan Persson <johanopersson@gmail.com>

* docs(ui): add SearchWithDebounce Table dev story

Signed-off-by: Johan Persson <johanopersson@gmail.com>

* docs(ui): document searchDebounceMs/filterDebounceMs and fix Table search note

Signed-off-by: Johan Persson <johanopersson@gmail.com>

* docs(ui): add searchDebounceMs/filterDebounceMs to Table props reference

Signed-off-by: Johan Persson <johanopersson@gmail.com>

* docs(ui): note controlled-callback behavior on Table debounce props

Signed-off-by: Johan Persson <johanopersson@gmail.com>

* chore(ui): regenerate API report for useTable debounce options

Signed-off-by: Johan Persson <johanopersson@gmail.com>

* chore(ui): changeset for useTable complete-mode debounce options

Signed-off-by: Johan Persson <johanopersson@gmail.com>

* chore: accept 'debouncing' in Vale vocabulary

Signed-off-by: Johan Persson <johanopersson@gmail.com>

---------

Signed-off-by: Johan Persson <johanopersson@gmail.com>
2026-05-05 16:45:18 +02:00
James Brooks ddca41f775 Add Combobox component to Backstage UI (#34118)
Introduces a Combobox component to Backstage UI for times when you want to allow users to choose from a list of values but also specify their own in some cases.

---------

Signed-off-by: James Brooks <jamesbrooks@spotify.com>
2026-05-05 15:29:15 +01:00
Johan Persson 37535b2a60 feat(ui): add --bui-bg-inherit CSS variable (#34124)
* feat(ui): add --bui-bg-inherit CSS variable in core.css

Signed-off-by: Johan Persson <johanopersson@gmail.com>

* refactor(ui): remove duplicated data-bg painting from Box.module.css

Signed-off-by: Johan Persson <johanopersson@gmail.com>

* refactor(ui): remove duplicated data-bg painting from Flex.module.css

Signed-off-by: Johan Persson <johanopersson@gmail.com>

* refactor(ui): remove duplicated data-bg painting from Grid.module.css

Signed-off-by: Johan Persson <johanopersson@gmail.com>

* refactor(ui): centralize Accordion data-bg painting, preserve no-intent behavior

Signed-off-by: Johan Persson <johanopersson@gmail.com>

* refactor(ui): use --bui-bg-inherit for Card scroll-shadow gradients

Signed-off-by: Johan Persson <johanopersson@gmail.com>

* docs(ui): document --bui-bg-inherit token

Signed-off-by: Johan Persson <johanopersson@gmail.com>

* chore: changeset for --bui-bg-inherit

Signed-off-by: Johan Persson <johanopersson@gmail.com>

* docs(ui): add Storybook story for --bui-bg-inherit

Signed-off-by: Johan Persson <johanopersson@gmail.com>

* docs(ui): fold --bui-bg-inherit story into colors stories

Signed-off-by: Johan Persson <johanopersson@gmail.com>

* changeset: Reword for clarity.

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Johan Persson <johanopersson@gmail.com>

---------

Signed-off-by: Johan Persson <johanopersson@gmail.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-05-05 16:00:47 +02:00
renovate[bot] 9158f153d3 Update dependency postcss to v8.5.10 [SECURITY]
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-05 13:45:53 +00:00
dependabot[bot] c8813abee0 chore(deps-dev): Bump postcss from 8.5.8 to 8.5.10 in /docs-ui
Bumps [postcss](https://github.com/postcss/postcss) from 8.5.8 to 8.5.10.
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss/compare/8.5.8...8.5.10)

---
updated-dependencies:
- dependency-name: postcss
  dependency-version: 8.5.10
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-05 15:37:04 +02:00
renovate[bot] a0361e34c7 Update dependency axios to v1.15.2 [SECURITY]
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-05 13:27:28 +00:00