Compare commits

...

482 Commits

Author SHA1 Message Date
Nicola Mometto
22910e59b7 🤖 backported "Security Center" (#72346) (#72687)
* 🤖 backported "Security Center" (#72346)

* Security Center (#71661)

* security center data model (#71660)

* add security_center model

* wip: migration

* kondo

* Advisory security endpoints (#71704)

* Security center admin page and advisory list (#71707)

* Use :admin-security-center feature flag and restore premium-handler on route

* Reuse notification system components for security center channel config (#71723)

* Security center settings (#71807)

* feat: add security-center recipients settings

* feat(FE): add security-center settings

* tests

* feat(FE): hook to settings

* Security center matching engine (#71747)

* upgrade banner (#71800)

* added banner (#71816)

* moved the security center into the top bar (#71821)

* fixed an e2e test

* Gate Security Center for non-trial subscriptions (#71799)

* Gate Security Center for non-trial subscriptions

Trial subscriptions should not have access to Security Center to
prevent abuse via easily-obtainable trial enterprise tokens.

Adds `is-trial?` and `assert-not-trial` to the premium features
token check, and applies a `+require-non-trial` middleware to the
security-center route that returns 402 for trial tokens.

* Handle check-token exceptions in is-trial?

Fail open (return false) if the token status check throws, matching
the same pattern used by *token-features*. Prevents a 500 when
MetaStore is unreachable.

* Use token-status setting instead of check-token directly

Follow the existing pattern used by billing and cloud-add-ons.

* Use -token-status instead of the setting getter

* Gate Security Center for non-trial subscriptions

Trial subscriptions should not have access to Security Center to
prevent abuse via easily-obtainable trial enterprise tokens.

Adds is-trial? and security-center-enabled? to premium features
token check, and a +check-not-trial middleware on the security
center API routes that returns 402 for trial tokens.

* Security center notification (#71814)

* feat: add last_notified_at column

* feat: add security-advisory-match event

* feat: security advisory email template

* feat: add slack renderer

* feat: notify

* email fixes

* kondo

* fix: hydrate

* chore: quartz

* test

* send notification sync

* fix: guard against no smtp config

* fix: bcc

* more tests

* only on has feature

* switch to util

* move url builder

* feat: use all-admin-recipients

* Security center: fetch and scheduled evaulation (#71830)

* addressed stas feedback

* all-admins and recipients are no longer exclusive (#71895)

* Fix read only connection for security center (#71898)

* added sync button (#71905)

* Security center unify tasks + CI green (#71894)

* pull notify task into sync task

* make CI green

* chore: exclude security-advisory

* fmt

* require settings in init

* kondo

* set wor

* fixes

* exclude is-hosted

* check-enabled with open-api wrap

* change error

* missing

* fix: emails

* fix use an user-id

* fixes

* init test-users

* enable on dev

* rollback to enforce no writes

* fix: add index

* index before fk

* may not error

* Security center test notification (#71915)

* test notifications

Closes GDGT-2174

* test

* fix

* addressed PR feedback (#71919)

* fix parsing published_at timestamp durign fetch

* fix fetch test to use string published_at matching real API response

The test was using #t tagged literals for published_at which bypassed
the string→timestamp coercion path, masking the bug we just fixed.

* added tests for recipients settings (#71963)

* make recipients non nullable (#71967)

* Treat error match_status as affected (fail-open) (#71961)

* treat error match_status as affected (fail-open)

Per the matching engine spec, when a matching query fails, the advisory
should be treated as potentially affected. The isAffected check was only
looking for "active" status, missing the "error" case.

* fix type errors in createAdvisory mock

Add return type annotation so string literals narrow to the Advisory
type instead of widening to string when spread with Partial<Advisory>.

* Security center: force sync endpoint (#71899)

* Security center cursor (#71969)

* feat: add updated_at

* feat: cursor on updated_at

* feat: since tests

* fix fetch tests

* appease the linter

* fix test

* remove seed

* small fixes

* fix

* feature token properly propagates (#71970)

* added polling for sync button (#71971)

* fix

* fix

* fix

* Add Snowplow tracking for Security Center (#71972)

* Add Snowplow tracking for Security Center

Track 3 events using the existing simple_event schema:
- security_center_page_viewed (FE, on page mount)
- security_advisory_acknowledged (BE, with severity)
- security_advisory_notification_sent (BE, with channel/result/trigger)

* Derive notification channels from handlers instead of config

Instead of re-checking configured-channels at tracking time, derive
the channel list from the notification's actual handlers.

* Move last_notified_at update inside try block

* add :admin-security-center to excluded features in stats test

* kondo

* update schema (#72031)

* hook full feature logic to premium features exposed to the FE (#72026)

* hook full feature logic to premium features exposed to the FE

* tests

* fix test

* chore: error in FE

* fix

* fix e2e test

* lint

* tighten schemas

* fix hydration

* chore: defensively check-superuser

* tighter schemas

* fix test

* chore: simpler schema as we'd need to duplicate with :api/regex

* e2e test should only run on ee

* fix: recipients default (#72035)

* Add testing endpoint for security advisories (#71977)

* fix model boundary violations for SecurityAdvisory

* relax schema

* move to 45 (#72073)

* chore: migrations in 001 file for backporting to 45

* mark-ran preconds

* reorder

* consolidate

* add set null

* Mobile improvements (#72071)

* move to 55

* move severity->repeat-days into an overridable setting

Closes GDGT-2208

* reformat

* typo

* deal with nits

* switch to select-fn->fn

* explicit map building

* more nits

* align

* nit

* add not-empty

* use custom executor instead of future

* use semver4j

* fix test

* restrict queries to selects (#72162)

* reorder

* Security center no h2 (#72215)

* disable security-center for h2 appdbs

* tests

* fix last-checked at, store in setting

* fix tests

* enable for e2e tests

* fix merge conflicts

* Revert "Security center no h2 (#72215)"

This reverts commit 41dc93794d.

* fix: persist last-synced-at in a setting

* fix test

* disable on h2 (enabled for tests) (#72263)

* UI feedback on Security Center (#72214)

* fixed imports

* chore: max 2 mins for advisory query

* kondo

* chore: use sql-jdbc.execute

* kondo

---------

Co-authored-by: Ngoc Khuat <qn.khuat@gmail.com>
Co-authored-by: Sébastien <sebastien@metabase.com>

* fixed conflicts

* seed advisories on first run (#72446)

* Updated UI for Security Center (#72518)

Co-authored-by: Nicola Mometto <nicola.mometto@metabase.com>

* fix: re-evaluate active advisories even if they've been acked (#72610)

---------

Co-authored-by: Nicola Mometto <nicola.mometto@metabase.com>
Co-authored-by: Ngoc Khuat <qn.khuat@gmail.com>
Co-authored-by: Sébastien <sebastien@metabase.com>

* remove non related tests that snook in

* type

---------

Co-authored-by: github-automation-metabase <166700802+github-automation-metabase@users.noreply.github.com>
Co-authored-by: Ngoc Khuat <qn.khuat@gmail.com>
Co-authored-by: Sébastien <sebastien@metabase.com>
2026-04-16 13:47:10 +01:00
github-automation-metabase
2894d16264 🤖 backported "deps: upgrade lodash and lodash-es" (#72413)
deps: upgrade lodash and lodash-es (#72336)

Co-authored-by: Uladzimir Havenchyk <125459446+uladzimirdev@users.noreply.github.com>
2026-04-16 09:10:29 +00:00
github-automation-metabase
f062395204 🤖 backported "Add installation of Astral and Python3 pip" (#72675)
Add installation of Astral and Python3 pip (#72645)

* Add installation of Astral and Python3 pip

If you build Metabase with Docker it will fail unless uv and pip are installed

* Update Dockerfile to remove python3-pip installation

Removed installation of python3-pip from Dockerfile.

Co-authored-by: da <paoliniluis@gmail.com>
2026-04-15 23:50:50 +00:00
github-automation-metabase
28efc26db1 🤖 backported "Reduce memory usage of fingerprinting postgres" (#72580) 2026-04-15 15:49:19 -05:00
github-automation-metabase
e9ab13da08 🤖 backported "[QP] Change the nested query alias from source to __mb_source" (#71427)
* [QP] Change the nested query alias from `source` to `__mb_source` (#70955)

closes #70224
Fixes QUE2-396.

This is necessary because `source` is a reasonably common name for a
column, and databases diverge on how they treat a reference like
`"source"."source"`:

- Postgres et al see the relation `source` in scope, and access its
  column called `source`, and all is well.
- Athena et al:
  - See that there is a **column** `source` in scope that doesn't require a prefix.
  - Assume it's a nested column with `ROW` type, and try to access the
    nested `source` field.
  - Type mismatch! It's a string or whatever, not `ROW`.

This PR doesn't *eliminate* the problem, but there's not really anything
we can do to fix Athena's honestly pretty odd choice of how to resolve this
ambiguous parse tree. But by changing our hard-coded alias for all
nested queries from `source` to `__mb_source`, we can make it extremely
unlikely that it will collide with a column that's in scope.

* adjust a new test to use the old QP API

---------

Co-authored-by: Braden Shepherdson <braden@metabase.com>
2026-04-15 18:30:07 +00:00
github-automation-metabase
6fae742340 🤖 backported "Fix null effective_type for sample database fields (GHY-3367)" (#72627)
Fix null effective_type for sample database fields (GHY-3367) (#72571)

* Set effective_type for sample database fields (GHY-3367)

Every field entry in resources/sample-content.edn was missing :effective_type,
so CreateSampleContentV2 inserted metabase_field rows with null effective_type
on fresh installs. Default effective_type to match base_type for all 71 fields.

* Test that sample-db fields have non-null effective_type (GHY-3367)

Co-authored-by: Eric Normand <ericwnormand@gmail.com>
2026-04-15 17:47:48 +00:00
github-automation-metabase
cb85dedd81 🤖 backported "Fix BigQuery tests broken by #71771" (#72538)
* Fix BigQuery tests broken by #71771 (#72484)

* Dummy commit

* Fix inconsistent return values from run-transform!

These were tripping up Bigquery transforms; not sure why.

---------

Co-authored-by: metamben <103100869+metamben@users.noreply.github.com>
Co-authored-by: Tamás Benkő <tamas@metabase.com>
Co-authored-by: Braden Shepherdson <braden@metabase.com>
2026-04-15 16:19:42 +00:00
github-automation-metabase
46c477ce00 🤖 backported "Fix validation in public dashboard action endpoint" (#72160)
Fix validation in public dashboard action endpoint (#72088)

Co-authored-by: Ngoc Khuat <qn.khuat@gmail.com>
2026-04-15 16:35:38 +01:00
github-automation-metabase
7ad7f26241 🤖 backported "Grant admin access to Helping Hand support user" (#72576)
Grant admin access to Helping Hand support user (#72478)

fetch-or-create-support-user! now sets is_superuser=true on all paths
(new user, reactivation, and existing active user). On grant revocation,
is_superuser is set back to false. This ensures the support user has
full admin access as promised by the grant access dialog.

Fixes: UXW-3725

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2026-04-15 15:26:18 +00:00
github-automation-metabase
5366d034ed 🤖 backported "Downgrade all netty pins to 4.2.9.Final" (#72555)
Downgrade all netty pins to 4.2.9.Final (#72546)

Netty 4.2.12 introduced a breaking change in HttpObjectEncoder that
causes AWS SDK netty-nio-client to fail with "unexpected message type:
LastHttpContent" errors. Revert to 4.2.9.Final which is compatible
with the AWS SDK while still being in the 4.2.x line.

Closes: #72532

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2026-04-14 15:52:22 -05:00
github-automation-metabase
8e77883336 🤖 backported "Pick random host when testing Redshift from MB_REDSHIFT_TEST_HOSTS" (#72563)
Pick random host when testing Redshift from `MB_REDSHIFT_TEST_HOSTS` (#72498)

* Pick random host when testing Redshift from MB_REDSHIFT_TEST_HOSTS

* Debugging

* Update CI config

* Oops

* Simplify connection details

* Kicc CI

Co-authored-by: Cam Saul <1455846+camsaul@users.noreply.github.com>
2026-04-14 20:32:36 +00:00
github-automation-metabase
35aa858941 🤖 backported "Make CLJS dev port configurable in CSP via MB_CLJS_DEV_PORT" (#72544)
Make CLJS dev port configurable in CSP via MB_CLJS_DEV_PORT (#72530)

The frontend dev port was already configurable via MB_FRONTEND_DEV_PORT,
but the CLJS REPL port (shadow-cljs) was still hardcoded to 9630. This
causes CSP violations when running multiple Metabase instances with
dynamic port allocation.

Co-authored-by: Rodrigo López Dato <rodrigo@metabase.com>
2026-04-14 18:57:59 +00:00
github-automation-metabase
fea64c1f8f 🤖 backported "Fix dashboard PUT response" (#72266)
Fix dashboard PUT response (#72173)

Extract shared `apply-card-permission-filters` helper used by both GET and
PUT paths to ensure consistent card visibility filtering. Also fix
`set-download-perms-on-dashcards` to handle empty dataset_query maps
gracefully.

Fixes: UXW-3571

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2026-04-14 13:40:52 +00:00
github-automation-metabase
bfa0d575ea 🤖 backported "GDGT-2143 Use subscription creator's perms for attachment check" (#72440)
GDGT-2143 Use subscription creator's perms for attachment check (#72156)

Co-authored-by: Ngoc Khuat <qn.khuat@gmail.com>
2026-04-13 06:23:09 +00:00
github-automation-metabase
809ffc8d68 🤖 backported "fix n+1s in db, table, group creation" (#72258)
fix n+1s in db, table, group creation (#72087)

* fix n+1s in db, table, group creation

this batches permissions changes to fix cluster lock timeouts with large numbers of groups, database, and tables.

When we created a new group, table, or database, we obtained O(NxM) fine-grained cluster locks, and did NxM separate inserts into data permissions.

This does batch operations instead. Obtains a single cluster-wide shared lock for batch operations (which actually might not be necessary at all for database and group creation - think it's still needed for creating a table though), then does the insert in batches.

Reduces the total number of queries dramatically:

- group creation: scaling with NxM -> ~10

- db creation: scaling with NxM -> ~10

- table creation: scaling with NxM -> ~8

* Fixup tests, improve perf more

* comment cleanup

* fix test

* remove dead code + unnecessary api epxansion

* Fix cluster lock contention

This is a fairly big change on its own, but it's fairly straightforward
and an additional performance improvement that should help with
concurrent processes trying to modify permissions at the same time.

Essentially, I realized that currently our cluster lock system provides
exactly one type of lock, an exclusive lock. But that's not the only
type of potential lock! Both Postgres and MariaDB/MySQL support locking
a row as *shared*. This conflicts with exclusive locks (`FOR UPDATE`)
but does not conflict with other shared locks.

This way, we can design a two-level lock system in which:

- most operations require:
  - a *shared* lock on `::batch-permissions-update`, and
  - an *exclusive* lock on `::batch-permissions-update-<db>`

- some operations require only an *exclusive* lock on
  `::batch-permissions-update`.

As one example, modifying permissions with the graph API requires an
exclusive lock on `::batch-permissions-update`. We don't want sync
adding a table at the same time that someone is modifying permissions,
e.g. moving from granular -> coalesced or vice versa.

On the other hand, sync itself just requires a *shared* lock on
`::batch-permissions-update`, because it can happily coexist with other
syncs that are for different databases. But they'll all take exclusive
locks on `::batch-permissions-update-<db>`, so any permissions changes
they're making to the database will be serialized.

Co-authored-by: John Swanson <john.swanson@metabase.com>
2026-04-11 12:24:21 +00:00
github-automation-metabase
e17eaaec5c 🤖 backported "deps: bump com.taoensso/nippy" (#72393)
deps: bump com.taoensso/nippy (#72295)

* deps: bump com.taoensso/nippy

resolves a reported issue with a transitive dependency

* Update deps.edn

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2026-04-11 11:16:37 +00:00
github-automation-metabase
767ea1dadd 🤖 backported "Update cheshire version to 6.2.0" (#72396)
Update cheshire version to 6.2.0 (#72279)

* Update cheshire version to 6.2.0

https://github.com/dakrone/cheshire/commits/master/

patches the jackson-core dep issue

* Make JSON error test resilient to parser version changes

Use regex matching instead of exact string equality so the test
doesn't break when the JSON parser reports a different column offset.

---------

Co-authored-by: da <paoliniluis@gmail.com>
Co-authored-by: Edward Paget <ed.paget@gmail.com>
2026-04-11 02:42:40 +00:00
github-automation-metabase
4dc778b368 🤖 backported "Pin axios versoin" (#72407)
Pin axios versoin (#72405)

* pin axios versoin

* pin axios version

Co-authored-by: Ryan Laurie <30528226+iethree@users.noreply.github.com>
2026-04-10 23:18:55 +00:00
github-automation-metabase
1fb8f0167f 🤖 backported "Update Netty dependencies to version 4.2.12.Final" (#72309)
Update Netty dependencies to version 4.2.12.Final (#72274)

https://github.com/netty/netty/releases

Co-authored-by: da <paoliniluis@gmail.com>
2026-04-10 14:01:11 -03:00
github-automation-metabase
62ad84921d 🤖 backported "Add GitHub Action to auto-resolve backport conflicts with Claude" (#72358)
Add GitHub Action to auto-resolve backport conflicts with Claude (#71158)

* Add GitHub Action to auto-resolve backport conflicts with Claude

Adds a new workflow triggered by the `auto-resolve-conflicts` label (or
manual dispatch) that uses Claude Code to automatically resolve cherry-pick
conflicts on backport PRs. This eliminates the manual step of checking out
the branch, running backport.sh, and hand-resolving conflicts.

* Add kondo and typescript checks

* Add syntax validation and formatting to backport conflict resolver

- Prepare backend (JDK/Clojure) and frontend (Node/Bun) environments
- Run cljfmt and eslint --fix to auto-format resolved files
- Run clj-kondo and tsc to validate syntax before completing cherry-pick
- Claude loops on errors until files are clean before committing

* Make Claude max turns configurable in backport conflict resolver, default to 50

* Fix Bash permission pattern for cljfmt in backport conflict resolver

Use colon-star syntax (cljfmt:*) to match other Bash tool permission
patterns, fixing permission denial for ./bin/mage cljfmt-files.

* Detect yarn vs bun for older release branches in backport resolver

Release branches ≤58 use yarn, ≥59 use bun. Detect the package manager
by checking for bun.lock after checkout, then use it for the CLJS build
step, allowed_tools permissions, and Claude prompt instructions.

* Set NODE_VERSION=22 for claude-code-base-action step

The action internally runs setup-node with 18.x by default, overriding
the Node 22 installed by prepare-frontend. This caused yarn engine
check failures on older release branches. The action respects a
NODE_VERSION env var, so set it to 22.

* Improve backport resolver: detect max turns, add commit details to success message

- Bump default max turns from 50 to 75
- Detect when Claude exits due to max_turns exceeded and post a specific
  comment explaining the issue with a link to re-run the workflow
- Include a commit link and collapsible changed files list in the success comment

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2026-04-10 14:44:51 +00:00
github-automation-metabase
203e9d53d5 🤖 backported "Update commons-lang3 version to 3.20.0" (#72312)
Update commons-lang3 version to 3.20.0 (#72278)

https://commons.apache.org/proper/commons-lang/changes.html#a3.20.0

Co-authored-by: da <paoliniluis@gmail.com>
2026-04-10 11:01:27 +00:00
github-automation-metabase
5aa29746a2 🤖 backported "Remove accidental semicolon in JSX" (#72334)
Remove accidental semicolon in JSX (#72242)

Co-authored-by: Kamil Mielnik <kamil@kamilmielnik.com>
2026-04-10 08:08:09 +00:00
github-automation-metabase
fe7e1cc4f4 🤖 backported "deps: bump redshift to latest release" (#72317)
deps: bump redshift to latest release (#72294)

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2026-04-10 02:37:52 +00:00
github-automation-metabase
126c6c11e7 🤖 backported "Don't trigger result-metadata write based on non-default parameters" (#72276)
* Don't trigger result-metadata write based on non-default parameters (#72007)

If you have a parameterized card with computed columns, there is no Field from which to pull fingerprints, and the query-processor runs a fingerprint process based on the results of the query. Because the query is parameterized, the result is specific to whatever random parameter was used. `record-metadata!` saw this difference and updated the result-metadata on the card.

The fix: we will no longer persist `result_metadata` when non-default parameterized values are present.

* Add missing require

* stuff getting moved around but not really, just 'convenience facade' noise

---------

Co-authored-by: Timothy S. Dean <timothy.dean@metabase.com>
Co-authored-by: Timothy Dean <timothy@timothydean.dev>
2026-04-09 14:38:27 -07:00
github-automation-metabase
d0fc23c9e2 🤖 backported "docs: Update links in CONTRIBUTING.md to latest version" (#72302)
docs: Update links in CONTRIBUTING.md to latest version (#72300)

Update links in CONTRIBUTING.md to latest version

Co-authored-by: Alex Yarosh <alexandra@metabase.com>
2026-04-09 20:39:31 +00:00
github-automation-metabase
158c2756a6 🤖 backported "Use effective/base type info for casts if database-type is missing" (#72023)
Use effective/base type info for casts if database-type is missing (#71771)

* Use effective/base type info for casts if database-type is missing

Closes #68065
Closes #71551

Co-authored-by: metamben <103100869+metamben@users.noreply.github.com>
2026-04-09 18:17:08 +03:00
github-automation-metabase
3cd4d620f1 🤖 backported "Fixes the find and replace menu from dissapearing" (#72202)
Fixes the find and replace menu from dissapearing (#71780)

Fixes the find and remove menu from dissapearing

Co-authored-by: da <paoliniluis@gmail.com>
2026-04-09 01:19:40 +00:00
github-automation-metabase
1d929f082d 🤖 backported "Require authentication for eid-translation API endpoints" (#72183)
Require authentication for eid-translation API endpoints (#72174)

The /api/eid-translation routes were unauthenticated despite only being
used by frontend routes behind the IsAuthenticated guard. Wrap with +auth
and remove the stale "public facing" comment.

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2026-04-08 19:29:30 +00:00
github-automation-metabase
cc5b481b6d 🤖 backported "Search indexing memory and CPU improvements" (#72102)
Merged backport

Co-authored-by: Nathan Voxland <nathan@metabase.com>
2026-04-07 15:15:35 -07:00
github-automation-metabase
2320ccaa9a 🤖 backported "docs - clarify one dashboard per page" (#72108)
docs - clarify one dashboard per page (#72098)

* clarify one dashboard per page

* questions

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-04-07 17:21:20 +00:00
metamben
92cb9671a6 Preserve metadata edits for summary columns (#70235) (#71678)
* Preserve metadata edits for summary columns (#70235)

* Preserve metadata edits for summary columns

Closes QUE2-17

* Port bucketing suffix removal

* Fix modules
2026-04-07 19:26:01 +03:00
github-automation-metabase
79b04a2705 🤖 backported "Fix typo in settings documentation" (#72095)
Fix typo in settings documentation (#72074)

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-04-07 15:32:45 +00:00
John Swanson
34501b751e Query parameter cleanup (backport v59) (#72049) 2026-04-07 09:27:57 -05:00
github-automation-metabase
b2a53bad25 🤖 backported "Bundle airgap public key in standard Metabase JAR" (#72058)
Bundle airgap public key in standard Metabase JAR (#72046)

Co-authored-by: bryan <bryan.maass@gmail.com>
2026-04-06 20:08:11 +00:00
github-automation-metabase
a8c74764cb 🤖 backported "chore: replace vulnerable underscore with a util" (#72028)
chore: replace vulnerable underscore with a util (#70784)

* chore: replace vulnerable underscore with a util

* missed another function

* remove underscore

Co-authored-by: Uladzimir Havenchyk <125459446+uladzimirdev@users.noreply.github.com>
2026-04-06 10:06:09 +00:00
github-automation-metabase
3e703c87d3 🤖 backported "Block database routing when transforms already exist" (#71956)
Block database routing when transforms already exist (#71931)

Prevent enabling database routing on a database that already has transforms, since running transforms on databases with DB routing is not supported
Backend: added validation check in PUT /api/ee/database-routing/router-database/:id that returns 400 if transforms exist for the database
Frontend: disables the routing toggle in the UI when transforms exist, with a descriptive message
Also wired through the existing but unused database-id filter param in the transforms list API

Co-authored-by: Eric Normand <ericwnormand@gmail.com>
2026-04-03 16:39:36 -05:00
github-automation-metabase
253d7da575 🤖 backported "docs - Fix formatting of Agent API link in documentation" (#71943)
docs - Fix formatting of Agent API link in documentation (#71941)

Fix formatting of Agent API link in documentation

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-04-02 19:26:05 +00:00
github-automation-metabase
dcb87a825f 🤖 backported "add data image check to urlTransform" (#71826)
add data image check to urlTransform

Co-authored-by: Nick Fitzpatrick <nickfitz.582@gmail.com>
2026-04-02 23:17:52 +05:30
github-automation-metabase
f566d13220 🤖 backported "Fix document visibility in trash" (#71928)
Fix document visibility in trash (#71903)

Co-authored-by: John Swanson <john.swanson@metabase.com>
2026-04-02 17:45:17 +00:00
Sébastien
0852ecc973 Fixed doc backport (#71889) 2026-04-02 10:50:53 +02:00
github-automation-metabase
faa488d3ec 🤖 backported "Use safe identifier quoting in workspace grant statements" (#70945)
Use safe identifier quoting in workspace grant statements (#70869)

Co-authored-by: Ngoc Khuat <qn.khuat@gmail.com>
2026-04-02 08:42:18 +00:00
github-automation-metabase
b0281d4868 🤖 backported "Fix usage_info IN clause exceeding 65K parameter limit (GHY-2413)" (#71868)
Fix usage_info IN clause exceeding 65K parameter limit (GHY-2413) (#71856)

- Fixes `GET /api/database/:id/usage_info` failing when a database has more than 65K tables
- The segment count query was passing all table IDs as parameters to an `IN` clause, which exceeds PostgreSQL's 65,535 parameter limit
- Replaced the `IN` clause with a subselect (`SELECT id FROM metabase_table WHERE db_id = ?`), eliminating the parameter explosion
- Removed the now-unnecessary `select-pks-set` call and `table-ids` argument from `database-usage-query`

Co-authored-by: Eric Normand <ericwnormand@gmail.com>
2026-04-01 21:17:51 +00:00
Jeff Bruemmer
308273a861 docs - edits api agents (#71857)
edits
2026-04-01 14:29:05 -04:00
github-automation-metabase
6b384b6cf8 🤖 backported "Allow the test quarantine in Metabase internal forks" (#71847)
Allow test quarantine in Metabase internal forks (#71837)

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-04-01 17:25:10 +00:00
github-automation-metabase
94aa8dbc6d 🤖 backported "Fix sync_schema silently dropping when executor is busy (GHY-3254)" (#71843)
Fix sync_schema silently dropping when executor is busy (GHY-3254) (#71756)

* Add failing test reproducing GHY-3254: sync_schema silently drops when executor is busy

The quick-task executor uses a single thread. If any task gets stuck
(e.g., a hanging JDBC connection), all subsequent manual sync requests
queue forever while the endpoint returns 200.

* Add per-task timeout to quick-task executor

Each task submitted to the quick-task executor now runs on a child
thread with a configurable timeout (*task-timeout-ms*, default 2h).
If a task exceeds the timeout, it is cancelled and the executor moves
on to the next queued task. This prevents a single stuck task from
blocking all subsequent manual sync requests.

The stuck thread's stack trace is logged for diagnostics.

* Use MB_QUICK_TASK_TIMEOUT_MINUTES env var for task timeout

Replace the dynamic var with a real env var (default 120 minutes).

* Use config/config-int for MB_QUICK_TASK_TIMEOUT_MINUTES

Read the env var via metabase.config.core instead of System/getenv,
consistent with how other config values are read in the codebase.

Co-authored-by: Eric Normand <ericwnormand@gmail.com>
2026-04-01 17:13:32 +00:00
github-automation-metabase
eb958e082d Auto-update documentation for release-x.59.x (#71787)
Update generated docs (release-x.59.x)

Co-authored-by: github-actions <github-actions@github.com>
2026-03-31 18:27:04 -04:00
github-automation-metabase
70b24584b5 🤖 backported "Dedupe slack channels" (#71750)
Dedupe slack channels (#71653)

dedupe slack channels

Co-authored-by: Nicola Mometto <nicola.mometto@metabase.com>
2026-03-31 17:11:31 +00:00
github-automation-metabase
f9c3099179 🤖 backported "Fix support access grant password reset failing for deactivated users" (#71746)
Fix support access grant password reset failing for deactivated users (#71598)

* Fix support access grant password reset failing for deactivated users

When a support user was deactivated (e.g. after a previous grant expired),
creating a new grant would leave the user inactive. The password reset
token authentication would succeed, the :after method would consume the
token and change the password, but create-session! would then reject the
login because is_active was false. with-fallback would swallow this and
fall back to emailed-secret-password-reset which also failed, resulting
in an opaque "Invalid reset token" error with the token irreversibly
consumed.

Fix: fetch-or-create-support-user! now reactivates deactivated users.

Also adds tests for the deactivated user flow, pre-existing auth identity
cascade, with-fallback error swallowing behavior, and direct login! calls
for easier debugging.

* fixup! cljfmt

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2026-03-31 16:30:10 +00:00
github-automation-metabase
e6f420f09c 🤖 backported "[QP] Do coercions (eg. Unix timestamps) with native sandboxing (RCLS)" (#71234)
[QP] Do coercions (eg. Unix timestamps) with native sandboxing (RCLS) (#70885)

Fixes QUE2-376.

For MBQL queries, type coercions (like integers to Unix timestamps) only
get applied on the earliest stage where that field is introduced. When
the table the field comes from is sandboxed by a native query, an
extra stage is introduced but it doesn't do the coercion.

Decorates the metadata of any native sandbox column whose table counterpart had coercion defined.

It's unfortunately complicated inside lib since the metadata needs to be propagated through exactly one
stage boundary. If it propagates all the way then we get double-coercion and SQL errors.

Co-authored-by: Braden Shepherdson <braden@metabase.com>
2026-03-31 12:19:52 -04:00
github-automation-metabase
b4b8683862 🤖 backported "Do not show JWT shared secret as plaintext after it is saved" (#71528)
* Do not show JWT shared secret as plaintext after it is saved (#71165)

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Remove files not present in 59

---------

Co-authored-by: Metabase bot <metabase-bot@metabase.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Anderson <anderson@metabase.com>
2026-03-31 12:14:37 -03:00
github-automation-metabase
9a7d1e2727 🤖 backported "Fix notification send test retry config key (:max-attempts → :max-retries)" (#71729)
Fix notification send test retry config key (:max-attempts → :max-retries) (#71689)

The test overrode :max-attempts but diehard uses :max-retries, so the
override was silently ignored and all 6 retries ran with exponential
backoff (~31s). With the correct key the test finishes in ~1s.

Done: task/fix-notification-retry-key

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2026-03-31 14:35:56 +00:00
Riley Thompson
82e428e4f5 Reject multi statement queries (#71578)
* reject multi statement queries

* fix changelog

* remove join for clickhouse

* redshift only

* use str over toString
2026-03-31 10:20:16 -04:00
github-automation-metabase
c77cf12d6c 🤖 backported "Update permissions in embedding SDK tests to avoid permission errors in some cases" (#71709)
Co-authored-by: Timofey Kachalov <timofei@metabase.com>
2026-03-31 14:30:14 +04:00
github-automation-metabase
03ece506d6 🤖 backported "Bump databricks jdbc driver to 3.3.1" (#71690)
* Bump databricks jdbc driver to 3.3.1 (#71513)

* bump databricks jdbc

* trigger ci

* trigger ci

---------

Co-authored-by: Riley Thompson <riley@metabase.com>
Co-authored-by: Riley Thompson <rileythompson99@gmail.com>
2026-03-30 22:42:02 +00:00
github-automation-metabase
aefe53db17 🤖 backported "Include lock name in cluster lock log and error messages" (#71683)
Include lock name in cluster lock log and error messages (#71677)

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2026-03-30 21:41:04 +00:00
Rodrigo López Dato
72e1c0f0d7 Backport: Bump react-grid-layout to fix pointer desync (v59) (#71113)
* Bump react-grid-layout to ^1.5.3

Backport of #70453. Includes fix for pointer desync while resizing: https://github.com/react-grid-layout/react-grid-layout/pull/2043

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Add Cypress test fixes from #70760

- Add resize handle drift test (metabase#70451)
- Fix dashboard card indices in sections spec

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* adjustments

* Apply DashCardPlaceholder drag fix and test from #71274

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Nick Fitzpatrick <nickfitz.582@gmail.com>
2026-03-30 17:01:10 -03:00
github-automation-metabase
e2b1154ee9 🤖 backported "Fix field filter dropdowns for users without create-queries permission GHY-1605" (#71670)
Fix field filter dropdowns for users without create-queries permission GHY-1605 (#71046)

## Summary

Field filter dropdowns on native query cards show as text inputs ("Enter some text") for users who have view-data permission but lack create-queries permission on the underlying table.

**Root cause:** Two issues combined to break this:

1. **Frontend couldn't determine dropdown type** — The frontend needs `has_field_values` from field metadata to decide whether to show a dropdown vs text input. This metadata came from `GET /api/database/:id`, which returns 403 for users without `create-queries` permission. Without it, the widget falls back to a text input.

2. **Backend param values endpoint was too restrictive** — Even if the frontend showed a dropdown, the card param values endpoint (`GET /api/card/:id/params/:key/values`) would fail because `search-values-from-field-id` does `api/read-check` on the Field (which requires `create-queries`), and the QP permission check also required `create-queries`.

**Fix:**

- **Hydrate `param_fields` on Card API response** (matching existing Dashboard pattern) — includes `has_field_values` so the frontend can show the correct widget type without needing `GET /api/database/:id`
- **Populate metadata store with `param_fields`** on card load in the query builder
- **Bind `*param-values-query*`** in card param values endpoints (like dashboards already do) so the QP only checks `view-data` permission
- **Skip `api/read-check` on Field** in `search-values-from-field-id` when `*param-values-query*` is true

Co-authored-by: Eric Normand <ericwnormand@gmail.com>
2026-03-30 18:51:31 +00:00
github-automation-metabase
ac8513f332 🤖 backported "Fix flaky test" (#71645)
Fix flaky test (#71623)

Attempt to fix flake

Co-authored-by: Mahatthana (Kelvin) Nomsawadi <me@bboykelvin.dev>
2026-03-30 13:41:54 +00:00
github-automation-metabase
e2730f5313 Auto-update documentation for release-x.59.x (#71606)
Update generated docs (release-x.59.x)

Co-authored-by: github-actions <github-actions@github.com>
2026-03-27 18:20:23 -04:00
github-automation-metabase
f2f8771d1c 🤖 backported "Hide destination DBs from permissions" (#71567)
Hide destination DBs from permissions (#71395)

* FE: do not show destination DBs in permissions editor

If you add a destination database, don't show it in the perms editor.

This was a temporary bug (disappears on refresh) BUT if you edit permissions
for the destination database then that is persisted, which is not great. I
will fix that in a separate PR.

* Don't add data permissions rows for destination DBs

- Exclude destination databases from the permissions graph

- Don't add permissions for destination DBs when creating a new group

Co-authored-by: John Swanson <john.swanson@metabase.com>
2026-03-27 15:06:39 +00:00
github-automation-metabase
a00338f034 🤖 backported "feat: admin password reset link for users" (#71156)
* feat: admin password reset link for users (#70464)

* feat: admin password reset link for users

* fixup! add missing dep to modules.edn

* fixup! response schema position

* fixup! reset e2e tests

* fix: store temporary password in Redux after no-SMTP password reset

The handleResetConfirm function called updatePassword via RTK Query but
never dispatched storeTemporaryPassword, so the temporary password modal
never appeared.

* fix: replace smart quotes with straight apostrophes in password reset modal

The modal title and body strings used Unicode RIGHT SINGLE QUOTATION MARK
(U+2019) instead of ASCII apostrophe, causing E2E tests to fail on text
matching.

* fix: correct reset URL assertion in e2e test

The test expected "password-reset" but the actual URL path is
"reset_password".

* fix: add missing storeTemporaryPassword export and resolve duplicate interface name

The people.js module was missing the storeTemporaryPassword action creator
export, and UserPasswordResetModal.tsx had two interfaces with the same name
causing the test file to see the wrong type signature.

---------

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
Co-authored-by: Edward Paget <ed.paget@gmail.com>
2026-03-27 14:39:07 +00:00
github-automation-metabase
30cc6e5d31 Auto-update documentation for release-x.59.x (#71537)
Update generated docs (release-x.59.x)

Co-authored-by: github-actions <github-actions@github.com>
2026-03-26 18:49:53 -04:00
github-automation-metabase
b1f2680166 🤖 backported "Support non-datetime migration ids in tests" (#71523)
Support non-datetime migration ids in tests (#71471)

Co-authored-by: Chris Truter <crisptrutski@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 19:48:56 +00:00
github-automation-metabase
d01263160d 🤖 backported "Pin google auth dependency to avoid driver mismatches" (#71048)
Pin google auth dependency to avoid driver mismatches (#70958)

* pin dep

* trigger ci tests

* update test

Co-authored-by: Riley Thompson <riley@metabase.com>
2026-03-26 16:49:24 +00:00
github-automation-metabase
fa942f68be 🤖 backported "Wrap sqlserver boolean expressions in a case statement" (#70830)
Wrap sqlserver boolean expressions in a case statement (#67136)

* wrap in case

* wrap case in cast, cleanup

* comments

* rename

* add test

* move comparison operators to lib.schema.filter

* Add boolean ops

* add and, or, not. rename comparison to predicate

* clean up tests

Co-authored-by: Riley Thompson <riley@metabase.com>
2026-03-26 12:35:19 -04:00
github-automation-metabase
94f5fc574a 🤖 backported "Fix silent data loss when importing unparseable YAML files" (#71497)
Fix silent data loss when importing unparseable YAML files (#71421)

* Surface ingestion errors instead of silently skipping unparseable YAML files

The serdes ingestion layer was silently dropping YAML files that failed
to parse (introduced in #41887 as defensive coding for editor temp
files). This caused remote sync imports to silently lose entities when
YAML files were malformed or exceeded SnakeYAML's nesting depth limit,
with no error reported to the user.

Add `ingestion-errors` to the Ingestable protocol so the ingestion
layer collects parse failures and surfaces them through `load-metabase\!`.
When `continue-on-error` is false (default, used by remote sync), the
import fails immediately on ingestion errors. When true, errors are
collected and reported alongside load-phase errors.

The dotfile filter from #41567 is preserved — editor temp files are
still silently skipped before parsing is attempted.

Fixes #71257

* Rename ingestion-errors to ingest-errors, extract populate-cache\! helper, add e2e tests

- Rename protocol method to ingest-errors for consistency with ingest-list/ingest-one
- Extract populate-cache\! helper to DRY up duplicated cache-population logic
- Add e2e test for continue-on-error true/false with ingestion errors

* Add tests for ingest-errors on IngestableSnapshot and wrapper delegation

* Fix log/warnf misuse, tighten tests, remove stale comment

- log/warnf -> log/warn to prevent MissingFormatArgumentException
  when error messages contain % characters
- Add tests for ingest-errors ordering contract and multi-file corruption
- Tighten continue-on-error assertion to check exact error count
- Remove stale comment describing pre-fix behavior

* Include file names in ingestion error messages

Wrap parse/read exceptions with ex-info containing the file path,
so the error message shows which files failed, e.g.
"Failed to read 1 file(s) during ingestion: bad_card.yaml"

Co-authored-by: Ngoc Khuat <qn.khuat@gmail.com>
2026-03-26 15:11:45 +00:00
github-automation-metabase
bf971ca558 🤖 backported "[Params] Always return [] for param /values requests" (#71445)
[Params] Always return `[]` for param `/values` requests (#71302)

Fixes #71164.

On the BE, always return an empty list rather than nil. Old models with `:id` different from `:field_ref` in their metadata could result in `{:values nil ...}` being returned, which breaks the schema and FE. See #71164 for full details.

Co-authored-by: Braden Shepherdson <braden@metabase.com>
2026-03-26 13:18:25 +00:00
github-automation-metabase
2edc90fc28 🤖 backported "Support entityId for guest embedded questions" (#71477)
Support entityId for guest embedded questions (#71246)

Co-authored-by: Timofey Kachalov <timofei@metabase.com>
2026-03-26 11:12:24 +00:00
github-automation-metabase
c24acd9d64 🤖 backported "GDGT-2017 write watermark to the DB before setting "succeed" status t…" (#71430)
* backport https://github.com/metabase/metabase/pull/71334

* add save-watermark! to the declared function

* fixed "src/metabase/transforms/query_impl.clj:85:20: warning: unused binding exec-result"

* fixed "    :message "Syntax error compiling at (metabase/transforms/query_impl.clj:102:6).","

---------

Co-authored-by: Nicola Mometto <nicola.mometto@metabase.com>
Co-authored-by: Egor Grushin <egor@metabase.com>
2026-03-26 08:34:03 +00:00
github-automation-metabase
63e2011eec 🤖 backported "Remove sync buttons for managed cloud databases" (#71338)
Remove sync buttons for managed cloud databases (#71203)

* Remove sync buttons for managed cloud databases

* Remove sync settings button for table in attached data warehouse in admin > table metadata and data studio

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
2026-03-26 09:59:18 +11:00
github-automation-metabase
2c16742534 🤖 backported "Faster search index sync when loading snapshots" (#71458)
Faster search index sync when loading snapshots (#71410)

Co-authored-by: Chris Truter <crisptrutski@users.noreply.github.com>
2026-03-25 22:33:40 +00:00
github-automation-metabase
0a365ade4b 🤖 backported "Roll back transform perms" (#71449)
Roll back transform perms (#71094)

Co-authored-by: Nathan Voxland <nathan@metabase.com>
2026-03-25 20:55:36 +00:00
github-automation-metabase
58921c8a17 🤖 backported "Field filter does not show dropdown values" (#71263) 2026-03-25 15:26:55 -05:00
github-automation-metabase
0ff5741c32 🤖 backported "Update TablePicker when users publish/unpublish tables, change name" (#71436)
Update TablePicker when users publish/unpublish tables, change name (#70954)

* update TablePicker when users publish/unpublish tables, change name

* refetch tables in useTableLoader

* update table owners

Co-authored-by: Nick Fitzpatrick <nick@metabase.com>
2026-03-25 16:25:44 +00:00
github-automation-metabase
aa1742bdc8 🤖 backported "Allow changing conditional formatting to color range when rule condition is set" (#71433)
Allow changing conditional formatting to color range when rule condition is set (#71079)

Co-authored-by: Kevin Kelleher <kevin.kelleher@metabase.com>
2026-03-25 15:34:30 +00:00
github-automation-metabase
f7969cfa4a 🤖 backported "Fix flaky schema-change integration test (follow-up to #70863)" (#71422)
Fix flaky schema-change integration test (follow-up to #70863) (#71339)

Co-authored-by: Ngoc Khuat <qn.khuat@gmail.com>
2026-03-25 13:37:39 +00:00
github-automation-metabase
47deb3e113 🤖 backported "Small positioning adjustments to the data studio nav bar" (#71413)
Small positioning adjustments to the data studio nav bar (#71379)

* Small positioning adjustments to the data studio nav bar

* pr feedback

Co-authored-by: Nick Fitzpatrick <nick@metabase.com>
2026-03-25 12:39:36 +00:00
github-automation-metabase
15733229f6 🤖 backported "fixed flaky" (#71414)
fixed flaky (#71405)

Co-authored-by: Sébastien <sebastien@metabase.com>
2026-03-25 12:37:38 +00:00
github-automation-metabase
545b159f0d 🤖 backported "docs: update embedding skills" (#71418)
docs: update embedding skills (#71415)

Remove development note from SSO for embeds section

Co-authored-by: Alex Yarosh <alexandra@metabase.com>
2026-03-25 12:37:24 +00:00
github-automation-metabase
18a9882683 🤖 backported "Define additional metrics for release monitoring" (#71329)
Co-authored-by: Chris Truter <crisptrutski@users.noreply.github.com>
2026-03-25 12:09:57 +02:00
github-automation-metabase
80cf5eefbc 🤖 backported "display sql transforms errors in editor" (#71146)
display sql transforms errors in editor (#71092)

* update setupCardDataset to use named params

* display sql transform errors in editor

* improve mock data in test

* use isObject helper
# Conflicts:
#	enterprise/frontend/src/metabase-enterprise/tenants/components/CreateTenantsOnboardingStep/hooks/use-field-distinct-values.unit.spec.tsx

Co-authored-by: Jakub Chodorowicz <jakub.chodorowicz@metabase.com>
2026-03-25 10:39:33 +01:00
github-automation-metabase
8e7e0c6434 🤖 backported "Update response on set token with network error" (#71403)
Update response on set token with network error (#70959)

* Update response on set token with network error

* report error message from checker when setting token

Currently when anything goes wrong during token checking while we're
setting a token, we *always* report that the token is invalid. This is
incorrect.

The token checker already gives us a descriptive `status` for the token,
which can tell the user whether the token is invalid or if we just
weren't able to check it.

One slight change here is to add `:canonical? true` to responses we
receive from MetaStore directly. This allows us to respond with the
correct HTTP status, since if we receive a response from the MetaStore
that tells us the token is invalid, that's a 400 error, where if we
weren't able to get a canonical response at all, that's a 503.

* add unit test

---------

Co-authored-by: Nick Fitzpatrick <nick@metabase.com>
Co-authored-by: John Swanson <john.swanson@metabase.com>
2026-03-25 09:25:47 +00:00
github-automation-metabase
98ccad6677 🤖 backported "Fix search related testing race conditions " (#71402)
Fix search related testing race conditions  (#71290)

Closes [BOT-1105: Search API tests fail with missing temp table](https://linear.app/metabase/issue/BOT-1105/search-api-tests-fail-with-missing-temp-table)

Co-authored-by: Chris Truter <crisptrutski@users.noreply.github.com>
2026-03-25 07:46:11 +00:00
github-automation-metabase
ff01b51d16 🤖 backported "docs: tenant example" (#71383)
docs: tenant example (#71365)

* Refine tenant attributes and permissions documentation

* Update docs/embedding/tenants.md



* Update docs/embedding/tenants.md



---------

Co-authored-by: Alex Yarosh <alexandra@metabase.com>
Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-03-24 19:44:49 +00:00
github-automation-metabase
2853a52770 🤖 backported "Calculate init time reliably" (#71362)
Calculate init time reliably (#71356)

Co-authored-by: Chris Truter <crisptrutski@users.noreply.github.com>
2026-03-24 15:17:51 +00:00
github-automation-metabase
36e885ebd0 🤖 backported "Revive and merge PR #67694: disable sync_schema side-effect in db-operations-test" (#71361)
Revive and merge PR #67694: disable sync_schema side-effect in db-operations-test (#71201)

Fix H2 lock timeout in db-operations-test by mocking sync task

Split the monolithic db-operations-test into three focused tests:
- non-admin-sync-schema-test: mocks quick-task/submit-task! to prevent
  the actual sync job from running, eliminating the race condition with
  DATA_PERMISSIONS cleanup in mt/with-all-users-data-perms-graph!
- non-admin-discard-field-values-test: isolated test for discard_values
- non-admin-rescan-field-values-test: isolated test for rescan_values

Also renames update-database-test, delete-database-test, and fetch-db-test
to non-admin-* for consistency, and adds explicit permission-denial (403)
test cases to each test.

Revives the fix from closed PR #67694.
2026-03-24 14:32:28 +00:00
github-automation-metabase
08f886120e 🤖 backported "[QP] Override LIMIT for pivot queries to ensure consistent results" (#71358)
[QP] Override `LIMIT` for pivot queries to ensure consistent results (#71033)

Closes #70963
Fixes QUE2-431.

Previously, pivot queries got the same default row limits added as any
aggregated query. But since pivot queries synthesize the results from
several inner queries with different subsets of breakouts, they
have different row counts.

The main ("row details") query the user wrote has all the breakouts,
so it has the most rows. If that query gets truncated, only a subset
of the data is returned, leaving gaps in the pivot table. Worse, the
sub-queries with other subsets of the breakouts, intended to collect
group, column and row subtotals, and the grand total, are inconsistent
with the details in the cells, and with each other, because they can
all end up `SUM`ing (etc.) over different sets of the raw rows.

With this change, a new and much larger row limit is permitted for the
pivot sub-queries. The pivot table viz contains one cell for each
aggregation in the query, multiplied by the rows of the main query.
We budget for **200k cells**, divide by the number of aggregations,
and that becomes the row limit.

If the row details query reaches that limit, the query is rejected:
- Other sub-queries are skipped
- A `pivot-rows-truncated` flag in the results signal the FE
- Which shows an error suggesting the user add a filter or remove
  breakouts to lower the row count.

Some reasonable pivot queries might still be excluded, but now we never
run a pivot query with incorrect data in it. If we execute the query and
render the pivot results, then all the returned data should be correct.

Co-authored-by: Braden Shepherdson <braden@metabase.com>
2026-03-24 14:29:08 +00:00
github-automation-metabase
f84f2817db 🤖 backported "Don't generate join alias that matches source table name" (#71335)
Don't generate join alias that matches source table name (#70876)

* include source name in taken names

* add test

* Update src/metabase/lib/join.cljc



* fix tests

* fix test

* Fix test metadata for self-join test

* e2e test fix attempt

* second attempt

---------

Co-authored-by: Riley Thompson <riley@metabase.com>
Co-authored-by: metamben <103100869+metamben@users.noreply.github.com>
2026-03-24 10:24:18 -04:00
github-automation-metabase
b3ac52f27b 🤖 backported "Allow grid columns in Detail visualization to grow and shrink" (#71071) 2026-03-24 09:46:10 -04:00
github-automation-metabase
e04a8d7e69 🤖 backported "Use env var indirection in Loki stress-test workflow" (#71355)
Use env var indirection in Loki stress-test workflow (#71349)

Fix script injection via env var indirection in loki-stress-test-flake-fix.yml
2026-03-24 12:57:24 +00:00
github-automation-metabase
7f5d7490b4 🤖 backported "Delete Claude bug fix workflow" (#71352)
Delete Claude bug fix workflow (#70993)

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-03-24 12:01:54 +00:00
github-automation-metabase
5131f4f89f 🤖 backported "Fix clickhouse test flake" (#71343)
Fix clickhouse test flake (#71306)

Co-authored-by: Chris Truter <crisptrutski@users.noreply.github.com>
2026-03-24 09:12:48 +00:00
github-automation-metabase
ccf5334a8a 🤖 backported "Fix parameter tags reordering in the presence of snippet tags" (#71336)
Fix parameter tags reordering in the presence of snippet tags (#71209)

* Disregard snippet tags when reordering parameters

* Add repro for metabase#69160

* Wording



---------

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
Co-authored-by: Kamil Mielnik <kamil@kamilmielnik.com>
2026-03-24 02:06:07 +00:00
github-automation-metabase
67a95159ed Auto-update documentation for release-x.59.x (#71333)
Update generated docs (release-x.59.x)

Co-authored-by: github-actions <github-actions@github.com>
2026-03-23 19:11:29 -04:00
github-automation-metabase
47b8b89945 🤖 backported "Ghy-3258/table tag dependencies missing in incremental transforms" (#71330)
Ghy-3258/table tag dependencies missing in incremental transforms (#71316)

Include table tags as dependencies of native queries

Co-authored-by: Ben Grabow <ben.grabow@metabase.com>
2026-03-23 22:29:27 +00:00
github-automation-metabase
c9a032f04c 🤖 backported "Extend ci-report to accept branch names and commit SHAs" (#71332)
Extend ci-report to accept branch names and commit SHAs (#70742)

Co-authored-by: bryan <bryan.maass@gmail.com>
2026-03-23 21:59:55 +00:00
github-automation-metabase
770863c512 🤖 backported "docs - sdk playground" (#71331)
docs - sdk playground (#71314)

* sdk playground link

* edit

* image

* Optimized 1 images, saved 188.7 KB (35.5% smaller)

---------

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-03-23 21:54:57 +00:00
github-automation-metabase
285b2d5899 [59] "Sanitize database details during serialization import" (#71311) (#71320)
Sanitize database details during serialization import (#71311)

[59] Sanitize database details during serialization import (#335)

* Sanitize database details during serialization import

Strip low-level JDBC keys (classname, subprotocol, connection-uri, subname,
init) from database details during serialization import and reject h2 engine.

Also add subname and init to the connection-details dispatch blocklist and
sanitize details in h2 connection-details->spec as defense in depth.

* Use custom runners

* fix error printing and test

* rebind assert-not-h2! during tests

* kondo ignore

---------



# Conflicts:
#	.github/workflows/backend.yml
#	.github/workflows/cross-branch-migrations.yml
#	.github/workflows/tusk-sanity-check.yml

Co-authored-by: Ryan Laurie <30528226+iethree@users.noreply.github.com>
Co-authored-by: Nicola Mometto <nicola.mometto@metabase.com>
Co-authored-by: Ngoc Khuat <qn.khuat@gmail.com>
Co-authored-by: Nemanja <31325167+nemanjaglumac@users.noreply.github.com>
2026-03-23 21:26:38 +00:00
github-automation-metabase
f83a173c9f 🤖 backported "Fix bug with temporal values in bigquery incremental transforms" (#71312)
Fix bug with temporal values in bigquery incremental transforms (#71291)

* fix: coerce temporal values used in incremental transforms filters

* fallthrough on LocalDateTime



---------

Co-authored-by: Nicola Mometto <nicola.mometto@metabase.com>
Co-authored-by: metamben <103100869+metamben@users.noreply.github.com>
2026-03-23 20:09:16 +00:00
github-automation-metabase
794f66fe19 🤖 backported "fix: cancel serialization when client disconnects" (#71235)
fix: cancel serialization when client disconnects (#69864)

* fix: cancel serialization when client disconnects



* fix: complete serialization virtual thread streaming response

- Fix channel signal direction: use >!! to write to done-chan instead of <!! (read)
- Fix streaming response: use io/copy instead of .write for File objects
- Set explicit 200 status on success, set-status!/set-content-type! on error path
- Add Content-Disposition header on success for proper download behavior
- Clean up temp files on cancel and use finally for deterministic cleanup
- Remove commented-out old synchronous code
- Use canonical clojure.core.async alias (a instead of async)
- Add server module to enterprise/serialization allowed dependencies
- Relax full_stacktrace test threshold (200 -> 50 lines) to avoid JVM-dependent flakiness

---------

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
Co-authored-by: John Swanson <john.swanson@metabase.com>
2026-03-23 17:08:55 +00:00
github-automation-metabase
5a48e53721 Auto-update documentation for release-x.59.x (#71270)
Update generated docs (release-x.59.x)

Co-authored-by: github-actions <github-actions@github.com>
2026-03-23 12:37:50 -04:00
github-automation-metabase
3249a0d9a0 🤖 backported "Fixed dancing MB" (#71301)
Fixed dancing MB (#71211)

Co-authored-by: Sébastien <sebastien@metabase.com>
2026-03-23 16:18:56 +00:00
github-automation-metabase
b85cdf05be 🤖 backported "Clarify that SSO provisioning also allows reactivating accounts" (#70608)
Clarify that SSO provisioning also allows reactivating accounts (#67524)

* Clarify that SSO provisioning also allows reactivating accounts

* Update wording in docs

* ditto LDAP

* Use radio buttons instead of a toggle

* lint/wording

* lint

* Revert changes to autogenerated docs

* Fix eslint rule + improve wording

* Make OIDC provisioning setting consistent with other providers

* Add detailed descriptions only to env var docs, not UI

* Fix E2E test

* fix: update ESLint configuration file path from .eslintrc.js to eslint.config.mjs

* run lint when we change component tests specs

* fixing linting

* ignore linting issue in embedding test

---------

Co-authored-by: Rodrigo López Dato <rodrigo@metabase.com>
Co-authored-by: Nicolò Pretto <info@npretto.com>
Co-authored-by: Nick Fitzpatrick <nickfitz.582@gmail.com>
2026-03-23 11:59:36 -03:00
github-automation-metabase
24dda15422 🤖 backported "Remove hard-coded Trivy version" (#71293)
Remove hard-coded Trivy version (#71287)

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-03-23 14:13:17 +00:00
github-automation-metabase
31c9970d77 🤖 backported "Parameterize runners" (#71081)
* Add backport resolution script

* paramaterize runners

---------

Co-authored-by: Metabase bot <metabase-bot@metabase.com>
Co-authored-by: Ryan Laurie <iethree@gmail.com>
2026-03-23 15:06:46 +01:00
github-automation-metabase
115eb31977 🤖 backported "default transforms impls with informative errors" (#71219)
* default transforms impls with informative errors (#71145)

feat: provide default transforms impls with informative errors

* appease kondo

---------

Co-authored-by: Nicola Mometto <nicola.mometto@metabase.com>
2026-03-23 13:39:37 +00:00
github-automation-metabase
188f1cff7d 🤖 backported "Fix scatter plot flicker on hover" (#71286)
Fix scatter plot flicker on hover (#71036)

Co-authored-by: Kevin Kelleher <kevin.kelleher@metabase.com>
2026-03-23 12:06:13 +00:00
github-automation-metabase
abcab29f94 🤖 backported "Patch vulnerable Trivy action" (#71283)
Patch vulnerable Trivy action (#71282)

Resolves DEV-1712

Patches Trivy GitHub action to a version that is confirmed not to be affected by the supply chain attack. We're using SHA-1 instead of a tag for an improved security.

See: https://app.mendral.com/insights/01KM6NFNZPV1JS72KAPCA2K9XH

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-03-23 11:32:14 +00:00
github-automation-metabase
03709bf46a 🤖 backported "Fixes a loki flaky" (#71275)
Fixes a loki flaky (#71225)

* loki flaky

* .

* .

* fonts

Co-authored-by: Sébastien <sebastien@metabase.com>
2026-03-23 09:29:49 +00:00
github-automation-metabase
8b415bf3e2 🤖 backported "Fix timeline form icon input" (#71272)
Fix timeline form icon input (#71199)

* Add icon to timeline icons

* Use Select from mantine/ui for timeline form

* Add test for icon in timeline creation

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
2026-03-23 05:55:27 +00:00
github-automation-metabase
f8b799c7a9 🤖 backported "Convert dataref to ts" (#71269)
Convert dataref to ts (#71062)

* Convert dataref to ts

* Fix unit test

* Fix actions

* Fix field reference

* Fix native data reference

* Fix field pane

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
2026-03-23 02:38:04 +00:00
Ben Grabow
0b32c560f2 Use official images (#71121)
* Retire cicleci and cimg images in favor of official/metabase images
2026-03-20 14:21:20 -05:00
github-automation-metabase
2fedae4bd3 🤖 backported "Update account settings docs" (#71245)
Update account settings docs (#71240)

This is currently doable in version 59.3.



See this issue: https://github.com/metabase/metabase/issues/63581

Co-authored-by: ignacio <132273646+ignacio-mb@users.noreply.github.com>
2026-03-20 18:24:43 +00:00
github-automation-metabase
f814d08fef 🤖 backported "Fix action tag prefix" (#71230)
Fix trivy action tag prefix (#71213)

fix: use v prefix on aquasecurity/trivy-action@v0.29.0 tag reference
2026-03-20 15:27:02 +00:00
github-automation-metabase
cec133dc21 🤖 backported "docs - agent resources for embedding" (#71229)
docs - agent resources for embedding (#71108)

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-03-20 14:47:02 +00:00
github-automation-metabase
3ea012ae3d 🤖 backported "Fixed empty csv for adhoc pivot tables in SDK" (#71226)
Fixed empty csv for adhoc pivot tables in SDK (#71141)

Co-authored-by: Sébastien <sebastien@metabase.com>
2026-03-20 14:01:06 +00:00
github-automation-metabase
d33626730d 🤖 backported "Batch metabase_table update migration " (#71150)
Batch metabase_table update migration  (#70996)

* fix: batched metabase_table update on data_layer

* don't replace inline

* preserve

* no need for rollback in liquidbase

* run outside of a transaction

* runInTransaction:false

Co-authored-by: Nicola Mometto <nicola.mometto@metabase.com>
2026-03-20 10:03:24 +00:00
github-automation-metabase
f6bc25f9e4 🤖 backported "Server-side rendering for comment emails" (#71215)
Server-side rendering for comment emails (#70938)

Co-authored-by: Ngoc Khuat <qn.khuat@gmail.com>
2026-03-20 08:46:44 +00:00
github-automation-metabase
1a9f51c1fc 🤖 backported "Hide 'New metric' and 'Publish a table' actions on Data Studio Library empty state when in read-only mode" (#71198)
Hide 'New metric' and 'Publish a table' actions on Data Studio Library empty state when in read-only mode (#71112)

* Fix: Hide metric creation and table publishing actions in read-only mode

In read-only instances (remote sync read-only mode), the Library still showed:
- 'New metric' action link in the Metrics empty state
- 'Publish a table' action button in the Data empty state
- 'New snippet' action link in the SQL snippets empty state

While the +New button was already hidden in read-only mode, the empty state
action links were not checking for this permission, allowing users to attempt
actions that should be disabled.

Changes:
- Add read-only mode check to EmptyStateAction component in LibrarySectionLayout
- Empty state actions now return null when in remote sync read-only mode
- Add e2e test to verify actions are hidden in read-only mode

* Refactor: use hideAction param and call-site guard instead of returning null from EmptyStateAction

Leverage the existing third param of createEmptyStateItem to suppress
actionUrl for metrics/snippets in read-only mode (consistent with how
the snippet tree handles it). Guard the 'Publish a table' button at
the EmptyStateAction call site in LibrarySectionContent, outside the
component itself. Reorganise the e2e test into the empty state describe
block.

Co-authored-by: Anderson <ands.alves.nunes@gmail.com>
2026-03-20 00:11:15 +00:00
github-automation-metabase
5b5dfa4a66 🤖 backported "Add database_engine to enhanced tables" (#71189)
Add database_engine to enhanced tables (#70968)

Co-authored-by: lbrdnk <lbrdnk@users.noreply.github.com>
2026-03-19 20:39:55 +00:00
github-automation-metabase
ed63b8c048 🤖 backported "Fix flaky test in sidebar content" (#71190)
Fix flaky test in sidebar content (#71135)

Fix flaky test

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
2026-03-19 20:27:23 +00:00
github-automation-metabase
3abe71e466 🤖 backported "Fix StackOverflowError in deduplicated column name resolution" (#71169)
* Fix StackOverflowError in deduplicated column name resolution (#71096)

Add a dynamic guard `*in-deduplicated-column-resolution?*` and convert the
mutual recursion between `resolve-nonexistent-deduplicated-column-name` and
`resolve-from-previous-stage-or-source` into a loop. Previously, resolving
a field like `name_5000` would create O(N) deep mutual recursion, overflowing
the JVM stack at ~3000-4000 frames.

* Remove cherry-picked tests that depend on features not in 1.59

The resolve-in-implicit-join-should-use-source-field-join-alias and
resolve-in-implicit-join-should-use-source-field-name tests were
cherry-picked from master but test features (source-field-join-alias
disambiguation) not present on the 1.59 branch.

* Remove remaining master-only tests from backport

Remove resolve-field-ref-missing-table-previous-stage-metadata-test,
resolve-field-ref-wrong-join-alias-missing-card-previous-stage-metadata-test,
and resolve-field-ref-missing-parent-field-test which were accidentally
brought over from master during the cherry-pick conflict resolution.

---------

Co-authored-by: Eric Normand <ericwnormand@gmail.com>
2026-03-19 20:21:24 +00:00
github-automation-metabase
469754e234 🤖 backported "Remove X-Metabase-Session from autogenerated API docs in favor of X-API-Key" (#71185)
Remove `X-Metabase-Session` from autogenerated API docs in favor of `X-API-Key` (#71155)

* X-API-Key capitalization in docs

* Use X-API-Key instead of X-Metabase-Session in Scalar API docs

Co-authored-by: Rodrigo López Dato <rodrigo@metabase.com>
2026-03-19 20:04:18 +00:00
github-automation-metabase
27d5b25a0b 🤖 backported "Fix string field IDs leaking into bulk-metadata queries" (#71177)
Fix string field IDs leaking into bulk-metadata queries (#71167)

Add pos-int? guard to all-implicitly-joined-field-ids pattern match,
matching the guard already used by all-field-ids. String field names
(e.g. from native/model sources) were being collected and passed to
bulk-metadata, causing Postgres type mismatch errors.

Co-authored-by: Eric Normand <ericwnormand@gmail.com>
2026-03-19 19:42:00 +00:00
github-automation-metabase
fff211419f 🤖 backported "Add mechanism for more reliably renaming settings" (#71174)
Add mechanism for more reliably renaming settings (#71088)

Co-authored-by: Chris Truter <crisptrutski@users.noreply.github.com>
2026-03-19 18:50:39 +00:00
github-automation-metabase
539e71b4c1 🤖 backported "Add ci:run-<driver> and ci:run-all-drivers labels to mage driver decisions" (#71163)
Add ci:run-<driver> and ci:run-all-drivers labels to mage driver decisions (#70894)

* Add ci:run-<driver> and ci:run-all-drivers labels to mage driver decisions

Allow force-running specific drivers or all drivers via PR labels,
overriding quarantine. Inserted at priority 3 (after H2/Postgres
always-run, before quarantine check). Added Labels of Interest and
All Drivers sections to help output.

* Add hint about ci:run labels in CI driver decisions output

Shows a helpful message in CI logs pointing users to the new labels
and the local help command for more info.

---------

Co-authored-by: bryan <bryan.maass@gmail.com>
Co-authored-by: Ben Grabow <ben.grabow@gmail.com>
2026-03-19 16:49:11 +00:00
github-automation-metabase
df021d9ed3 🤖 backported "fix: remove logging from session api" (#71160)
fix: remove logging from session api (#70444)

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2026-03-19 16:40:22 +00:00
github-automation-metabase
c15e5ad693 Auto-update documentation for release-x.59.x (#71131)
Update generated docs (release-x.59.x)

Co-authored-by: github-actions <github-actions@github.com>
2026-03-19 09:33:15 -04:00
github-automation-metabase
0199f899e3 🤖 backported "remove claude from mise as it's not a required tool" (#71140)
remove claude from mise as it's not a required tool (#71138)

Co-authored-by: Nicolò Pretto <info@npretto.com>
2026-03-19 09:32:00 +00:00
github-automation-metabase
09df48ad8f 🤖 backported "fix: handle recycled jetty http response objects" (#71122)
fix: handle recycled jetty http response objects (#70674)

* fix: handle recycled jetty http response objects

In the streaming response handler. Make sure that the response object is
both committed and that its AsyncContext has not been timedout.
Attempting the write after the timeout results in an NPE.

* fixup! missing reify method

* make async-context-completed? private

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2026-03-18 22:24:24 +00:00
github-automation-metabase
65a31ab4c7 🤖 backported "Fix pivot text overlapping when next header column is collapsed" (#71117)
Fix pivot text overlapping when next header column is collapsed (#71104)

Co-authored-by: Kevin Kelleher <kevin.kelleher@metabase.com>
2026-03-18 20:20:57 +00:00
github-automation-metabase
f5fb3410e9 🤖 backported "Docs: improve embedding appearance theming section" (#71109)
Docs: improve embedding appearance theming section (#70967)

* Docs: improve embedding appearance theming section

Rewrite the basic theming section for clarity: rename to "Dark mode and
light mode", simplify the explanation, and preserve the old
#basic-theming anchor for existing links.



* Update docs/embedding/appearance.md



---------

Co-authored-by: Rodrigo López Dato <rodrigo@metabase.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-03-18 18:43:02 +00:00
github-automation-metabase
c7c38ac0ff 🤖 backported "Rework Pivot QP to add pivot-grouping in post-processing" (#71057)
Rework Pivot QP to add `pivot-grouping` in post-processing (#70986)

* Rework Pivot QP to add `pivot-grouping` in post-processing

* PR feedback

* Fix MongoDB test failures

* Fix test failures

* cljfmt

* Fix calculating pivot group for queries with remaps

* cljfmt

* Test fix 🔧

* Test fix 🔧

* Delete unused code

Co-authored-by: Cam Saul <1455846+camsaul@users.noreply.github.com>
2026-03-18 11:31:37 -07:00
github-automation-metabase
3241598a6c 🤖 backported "Add snowplow events when creating new job" (#71056)
Add snowplow events when creating new job (#70279)

* Add snoplow events when creating new job

* Fix e2e

Co-authored-by: Anderson <ands.alves.nunes@gmail.com>
2026-03-18 15:30:21 -03:00
github-automation-metabase
409c8e6b11 🤖 backported "docs - agent demo link" (#71106)
docs - agent demo link (#71074)

* agent demo link

* Optimized 1 images, saved 125.8 KB (45.1% smaller)

---------

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-03-18 18:05:40 +00:00
github-automation-metabase
f9b728a61e 🤖 backported "Correctly hide/show card filters based on permissions" (#71084)
Correctly hide/show card filters based on permissions (#70980)

Backend (query_processor/dashboard.clj): Added an explicit view-data permission check using most-permissive-database-permission-for-user. This returns 403 when a user has no view-data access, taking precedence over parameter validation errors (400).

Frontend (DashCardVisualization.tsx): Decoupled the three concerns:

* Inline parameters render when inlineParameters.length > 0 AND the user has view access (no 403 on the card result)
* DashCardMenu (download button) renders when DashCardMenu.shouldRender() is true (requires canEditQuestion or canDownloadResults)
* 403 from backend hides both inline params and menu — no point showing UI for data the user can't access

Co-authored-by: Eric Normand <ericwnormand@gmail.com>
2026-03-18 16:13:45 +00:00
github-automation-metabase
74ec9313b3 🤖 backported "Fix flaky metabase-enterprise.dependencies.api-test" (#71087)
Fix flaky metabase-enterprise.dependencies.api-test (#71024)

* Drain the single-threaded async executor to ensure all pending dependency work completes before model cleanup deletes cards, avoiding lock timeouts.

* Use fresh-dependency-async-executor-fixture on every test

Co-authored-by: Ben Grabow <ben.grabow@metabase.com>
2026-03-18 15:27:58 +00:00
github-automation-metabase
084d08a80e 🤖 backported "docs: new incremental transforms" (#71091)
docs: new incremental transforms (#71080)

* incremental transforms

* Apply suggestions from code review



---------

Co-authored-by: Alex Yarosh <alexandra@metabase.com>
Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-03-18 15:23:32 +00:00
github-automation-metabase
2b3c1fd8c3 🤖 backported "Fixed flaky e2e test" (#71078)
Fixed flaky e2e test (#71019)

Co-authored-by: Sébastien <sebastien@metabase.com>
2026-03-18 14:16:28 +00:00
Phoomparin Mano
b5c3d92072 Manual Backport: Fix SSO docs link in embedding hub (#70919)
update embedding hub authentication path
2026-03-18 12:08:58 +00:00
github-automation-metabase
993fb6f5cf 🤖 backported "chore: upgrade underscore" (#71039)
chore: upgrade underscore (#70778)

Co-authored-by: Uladzimir Havenchyk <125459446+uladzimirdev@users.noreply.github.com>
2026-03-17 21:05:34 +00:00
github-automation-metabase
b9a3e7f3f5 🤖 backported "Clear ChartSettingSelect display value on remove" (#71038)
Clear ChartSettingSelect display value on remove (#70957)

Co-authored-by: Nick Fitzpatrick <nick@metabase.com>
2026-03-17 20:40:38 +00:00
github-automation-metabase
d682b0a1cf 🤖 backported "Improve search endpoint performance with many disabled tables" (#71029)
Improve search endpoint performance with many disabled tables (#70982)

Co-authored-by: Nathan Voxland <nathan@metabase.com>
2026-03-17 18:50:20 +00:00
github-automation-metabase
076d70c8b0 🤖 backported "Fixed metrics not being translated in guest embeds" (#71021)
Fixed metrics not being translated in guest embeds (#70484)

Co-authored-by: Sébastien <sebastien@metabase.com>
2026-03-17 16:27:34 +00:00
github-automation-metabase
ca82a09384 🤖 backported "docs - Fix typo in JWT group mapping documentation" (#71022)
docs - Fix typo in JWT group mapping documentation (#71017)

Fix typo in JWT group mapping documentation

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-03-17 16:19:03 +00:00
github-automation-metabase
ea9ec35040 🤖 backported "Fix mage mise-diagnosis" (#71018)
Fix mage mise-diagnosis (#71012)

Co-authored-by: Chris Truter <crisptrutski@users.noreply.github.com>
2026-03-17 14:43:49 +00:00
Nemanja Glumac
1977f48828 [Backported v59] Add retry loop to fetch-artifact action's download step (#70513) (#71005)
Add retry loop to fetch-artifact download step

Wrap the downloadArtifact API call with a retry loop (3 attempts,
exponential backoff at 15s/30s) to handle transient GitHub API 500
errors that have been causing e2e and health-check job failures.

Co-authored-by: mendral-app[bot] <233154221+mendral-app[bot]@users.noreply.github.com>
2026-03-17 08:39:56 -06:00
github-automation-metabase
b512b183b9 🤖 backported "Show expected type in custom expression error message" (#71007)
Show expected type in custom expression error message (#70400)

* initial attempt at better error message

* clean up

* Clean up

* improve doc string

* fix cljc test

* add test

* fix test

* exclude perf functions

* have schema produce user facing expected type

* clean up

* Add test

* fix kondo

* defer i18n

* try test fix

* address comments

* update tests

Co-authored-by: Riley Thompson <riley@metabase.com>
2026-03-17 13:37:43 +00:00
github-automation-metabase
9cd7ea3c79 🤖 backported "Increase the polling timeout" (#71008)
Increase the polling timeout (#70999)

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-03-17 13:29:04 +00:00
github-automation-metabase
8f69a2389f Auto-update documentation for release-x.59.x (#70989)
Update generated docs (release-x.59.x)

Co-authored-by: github-actions <github-actions@github.com>
2026-03-17 08:53:17 -04:00
github-automation-metabase
b3d464e1fb 🤖 backported "fix: perf improvements for documents" (#70995)
fix: perf improvements for documents (#70802)

* fix: perf improvements for documents

* fix unit test

* address comments

Co-authored-by: Uladzimir Havenchyk <125459446+uladzimirdev@users.noreply.github.com>
2026-03-17 11:22:32 +00:00
github-automation-metabase
c62eaae635 🤖 backported "fix self-heal openapi job and update openapi.json" (#70578)
* fix self-heal openapi job and update openapi.json (#70499)

* Update OpenAPI schema (aafb270...3b32bf9)

---------

Co-authored-by: Jakub Chodorowicz <jakub.chodorowicz@metabase.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-03-17 10:28:22 +00:00
github-automation-metabase
aafb2706d5 🤖 backported "Update Athena parameter suggestions to JDBC v3 driver" (#70983)
Update Athena parameter suggestions to JDBC v3 driver (#62689)

Co-authored-by: Rodrigo López Dato <rodrigo@metabase.com>
2026-03-17 00:22:04 +00:00
github-automation-metabase
d270dc5dcb 🤖 backported "Support MB_MONITOR_PERFORMANCE to write as files to a directory" (#70746)
Support MB_MONITOR_PERFORMANCE to write as files to a directory (#69582)

Co-authored-by: Nathan Voxland <nathan@metabase.com>
2026-03-16 23:03:42 +00:00
github-automation-metabase
9850313451 🤖 backported "Correctly detect funnel chart config in static-viz" (#70970)
Correctly detect funnel chart config in static-viz (#68158)

Co-authored-by: Nathan Voxland <nathan@metabase.com>
2026-03-16 21:12:43 +00:00
github-automation-metabase
924e8e3113 🤖 backported "Fix trend visualizations that rely on aggregated datetimes" (#70961)
Fix trend visualizations that rely on aggregated datetimes (#70941)

Co-authored-by: Kevin Kelleher <kevin.kelleher@metabase.com>
2026-03-16 19:24:13 +00:00
github-automation-metabase
b28406a706 🤖 backported "Fix sunburst chart labels not appearing" (#70960)
Fix sunburst chart labels not appearing (#70889)

Co-authored-by: Kevin Kelleher <kevin.kelleher@metabase.com>
2026-03-16 19:04:41 +00:00
github-automation-metabase
a23538fea9 🤖 backported "incremental transforms with source filter" (#70956)
incremental transforms with source filter

Co-authored-by: Nicola Mometto <nicola.mometto@metabase.com>
2026-03-16 17:57:11 +00:00
github-automation-metabase
2906b4043b 🤖 backported "Inline parameter in clickhouse honeysql method" (#70953)
Inline parameter in clickhouse honeysql method (#70905)

* suggested fix and test

* Clean up test

* clean up test

Co-authored-by: Riley Thompson <riley@metabase.com>
2026-03-16 16:53:27 +00:00
github-automation-metabase
18c7b41cf8 🤖 backported "Aliases for table template tags" (#70944)
Aliases for table template tags (#70893)

* auto include aliases

* simplify hover info

* add unit test for emit tables toggle

---------

Co-authored-by: Nicola Mometto <nicola.mometto@metabase.com>
Co-authored-by: Jakub Chodorowicz <jakub.chodorowicz@metabase.com>
2026-03-16 16:44:32 +00:00
github-automation-metabase
355e23a4ca 🤖 backported "Fix 500 error in check-card endpoint for cards with broken dependents" (#70946)
Fix 500 error in check-card endpoint for cards with broken dependents (#70828)

Fix unhandled exception in POST /api/ee/dependencies/check-card that causes a 500 when a transitive dependent card fails to compile

 When check-query-soundness iterates over all dependents, if any card's query throws during compilation (e.g. alias resolution errors), the exception propagated uncaught and crashed the entire endpoint
 
Added try/catch around check-entity calls in check-query-soundness, returning a validation-exception-error instead of crashing — consistent with the pattern already used in `/dependencies/findings.clj`

On the stats instance, card 4523 has 2,557 transitive card dependents. One of those dependents (a native query referencing card 34523 via a template tag) fails during query compilation with `Missing ::desired-alias->escaped for "email_domain"`. This compilation error is unrelated to the proposed edit but was bringing down the whole endpoint.

Test plan

  - Verify POST /api/ee/dependencies/check-card returns 200 with {success: false, bad_cards: [...]} instead of 500 when a dependent card has a query compilation error
  - Verify that cards with compilation errors appear in the response as validation-exception-error findings
  - Existing dependency check tests still pass

Co-authored-by: Eric Normand <ericwnormand@gmail.com>
2026-03-16 15:29:49 +00:00
github-automation-metabase
2b7e15785b 🤖 backported "Table tags filters" (#70939)
Table tags filters (#70699)

* add source-filters to table template tags in the BE

* chore: test

* chore: restrict ops

* extend schema

* chore: extract ->sql util

* deal with review comments

* feat: emit via honeysql instead of string interpolation

* fix check

* chore: also add to lib/schema

Co-authored-by: Nicola Mometto <nicola.mometto@metabase.com>
2026-03-16 15:13:46 +00:00
github-automation-metabase
b2d676e8f0 🤖 backported "Track OSS transform usage in Snowplow" (#70931)
Track OSS transform usage in Snowplow (#70925)

move snowplow transform metrics to OSS, as transforms are now available on OSS

Co-authored-by: Nicola Mometto <nicola.mometto@metabase.com>
2026-03-16 13:50:06 +00:00
github-automation-metabase
b68c5b5ff6 🤖 backported "Skip running transform jobs if there are no transforms to run" (#70929)
Skip running transform jobs if there are no transforms to run (#70926)

* fix: don't run transform jobs if there are no tranforms to run

* chore: add test

Co-authored-by: Nicola Mometto <nicola.mometto@metabase.com>
2026-03-16 13:49:30 +00:00
github-automation-metabase
3310c14fb7 🤖 backported "untgz: use resolveIn to prevent zip slip" (#70932)
untgz: use resolveIn to prevent zip slip (#70921)

Co-authored-by: Nicola Mometto <nicola.mometto@metabase.com>
2026-03-16 13:19:28 +00:00
github-automation-metabase
cea470201a 🤖 backported "Reduce number of tests kept in memory for embedding SDK component tests" (#70930)
Reduce number of tests kept in memory for embedding SDK component tests (#70928)

* Add memory management settings to SDK component test Cypress config

Add experimentalMemoryManagement: true and numTestsKeptInMemory: 0 to
the embedding SDK component test config. The config spreads defaultConfig
which lacks these settings, causing Cypress to retain 50 DOM snapshots
per test (the default). This leads to Chrome renderer OOM crashes during
content-translations.cy.spec.tsx.

- experimentalMemoryManagement: true triggers gc() between tests
- numTestsKeptInMemory: 0 prevents DOM snapshot heap accumulation

* Use numTestsKeptInMemory: 1 to match main CI config convention

Change from 0 to 1 per review feedback. This matches the value used in
the main e2e config (config.js:190) and keeps the last snapshot available
for debugging while still preventing OOM from the default of 50.
2026-03-16 13:14:57 +00:00
github-automation-metabase
18baa80f2f 🤖 backported "New password generation for users" (#70826)
* New password generation for users (#70646)

* New password generation for users

* update to use window.crypto

* updating types

---------

Co-authored-by: Nick Fitzpatrick <nick@metabase.com>
Co-authored-by: Nick Fitzpatrick <nickfitz.582@gmail.com>
2026-03-16 09:49:13 -03:00
github-automation-metabase
0618246200 🤖 backported "Fix pivot table drill through when binning a datetime by day" (#70927)
Fix pivot table drill through when binning a datetime by day (#70680)

Co-authored-by: Kevin Kelleher <kevin.kelleher@metabase.com>
2026-03-16 12:33:10 +00:00
github-automation-metabase
4303f048ea 🤖 backported "Fix flaky schema-change integration test on Redshift" (#70922)
Fix flaky schema-change integration test on Redshift (#70863)

Fix flaky python-transform-schema-change-integration-test on Redshift

Replace fixed Thread/sleep with polling for correct field metadata.
The transform pipeline sets run status to :succeeded before
complete-execution! (which runs the metadata sync) finishes. On
Redshift, the sync takes longer due to network latency, so the
2-second sleep was insufficient — the QP would query with stale
Field records (still referencing the old "age" column).

Co-authored-by: Ngoc Khuat <qn.khuat@gmail.com>
2026-03-16 11:38:27 +00:00
github-automation-metabase
1f4897edc5 🤖 backported "Fix flaky scoring-test/mine-test on H2" (#70923)
Fix flaky scoring-test/mine-test on H2 (#70852)

Co-authored-by: Ngoc Khuat <qn.khuat@gmail.com>
2026-03-16 11:12:36 +00:00
github-automation-metabase
f25dc037a4 🤖 backported "Add 403 error handling to rerun-workflows.yml" (#70917)
Add 403 error handling to rerun-workflows.yml (#70916)

Handle 403 errors in rerun-workflows.yml

Wrap the reRunWorkflowFailedJobs API call in a try/catch that
gracefully handles HTTP 403 errors. This prevents false-positive CI
failures when the target run is cancelled, a PR run, or otherwise
ineligible for retry.

Also adds missing await to the API call so errors are properly caught.
2026-03-16 07:51:46 +00:00
github-automation-metabase
7e56c60902 🤖 backported "Add side-panel to Tables and Metrics in the Library" (#70906)
Add side-panel to Tables and Metrics in the Library (#69673)

* Temp

* Add full implementation

* Add e2e tests

* Remove excess image file

* Temp

* Address design issues

* Fix design review comments

* One more fix

* Fix e2e tests

* Remove empty source gotcha

* Address review issues

* Revert graphy changes

Co-authored-by: Denis Berezin <denis.berezin@metabase.com>
2026-03-14 00:09:28 +00:00
github-automation-metabase
bbb3eea7ef 🤖 backported "Fix MySQL 8.4 app-db test failures in dependencies tests" (#70903)
Fix MySQL 8.4 app-db test failures in dependencies tests (#70897)

Co-authored-by: bryan <bryan.maass@gmail.com>
2026-03-13 22:34:52 +00:00
github-automation-metabase
fc9dbf6d62 🤖 backported "UXW-3177 batch dashcard queries by 5" (#70896)
UXW-3177 batch dashcard queries by 5 (#70542)

* UXW-3177 batch dashcard queries by 5

* Add unit tests

* Remove fetch limit for HTTP2+
# Conflicts:
#	frontend/src/metabase/dashboard/actions/data-fetching.unit.spec.js

Co-authored-by: Denis Berezin <denis.berezin@metabase.com>
2026-03-13 22:08:12 +00:00
github-automation-metabase
8859afe1fe 🤖 backported "Fix broken deps not surfaced for missing fields in :fields (GHY-3157)" (#70898)
Fix broken deps not surfaced for missing fields in :fields (GHY-3157) (#70865)

- The `:soft?` marking in `find-bad-refs-with-source` was too broad — it marked **all** bad refs in `:fields` clauses as soft, even when the field was completely missing from the source (not just inactive).
- Added `(not (:active column true))` guard so only **inactive** fields in `:fields` are marked `:soft?`. Missing/unresolvable fields remain hard errors and are properly surfaced by dependency analysis.
- This preserves the GHY-3044 fix (inactive fields the QP can drop are still soft) while fixing GHY-3157 (genuinely missing fields are reported).

Co-authored-by: Eric Normand <ericwnormand@gmail.com>
2026-03-13 21:51:21 +00:00
github-automation-metabase
d16bc7573f 🤖 backported "Update HAR file creation instructions for sensitive data" (#70902)
Update HAR file creation instructions to include sensitive data (#70394)

Updated the documentation to clarify that the HAR file contains sensitive data and revised the instructions for saving the HAR file accordingly. Also added a screenshot of the settings in Chrome.

---------

Co-authored-by: Robert Kosara <rkosara@me.com>
Co-authored-by: Rodrigo López Dato <rodrigo@metabase.com>
2026-03-13 21:30:44 +00:00
github-automation-metabase
057081f1a2 🤖 backported "Disable blocking dependency checks on save" (#70871)
Co-authored-by: bryan <bryan.maass@gmail.com>
2026-03-13 14:00:12 -06:00
github-automation-metabase
d2a5450958 🤖 backported "Enable old clickhouse tests" (#70883)
Enable old clickhouse tests (#70756)

* enable clickhouse tests

* enable more tests

* fix kondo and test

Co-authored-by: Riley Thompson <riley@metabase.com>
2026-03-13 19:33:34 +00:00
github-automation-metabase
46dc356244 🤖 backported "Handle clickhouse dbname when it has spaces in it" (#70886)
Handle clickhouse dbname when it has spaces in it (#70822)

* take first name

* Add test

* fix test

* Add comment

* fix typos

Fix typo in comment regarding legacy `dbname` handling.

Co-authored-by: Riley Thompson <riley@metabase.com>
2026-03-13 19:33:16 +00:00
github-automation-metabase
bd17ba5cb2 🤖 backported "docs: it's writable not writeable" (#70882)
docs: it's writable not writeable (#70877)

* it's writable

* no md in redirect dummy

Co-authored-by: Alex Yarosh <alexandra@metabase.com>
2026-03-13 18:18:18 +00:00
github-automation-metabase
4114d8d7ac 🤖 backported "Fix token check errors on startup" (#70880)
Fix token check errors on startup (#70789)

During startup, the database isn't migrated yet, so we can't check the
token hash.

If the database hasn't been started yet, skip checking the token hash in
the DB and just delegate to the lower-level checker that actually hits
the store.

Co-authored-by: John Swanson <john.swanson@metabase.com>
2026-03-13 17:27:29 +00:00
github-automation-metabase
95eedf292d 🤖 backported "Can't use regex filter with \b on non-ascii names" (#70878)
Can't use regex filter with \b on non-ascii names (#70838)

Co-authored-by: Nathan Voxland <nathan@metabase.com>
2026-03-13 17:14:41 +00:00
github-automation-metabase
ae418335ad 🤖 backported "measure table names in tree in v1 data model page" (#70874)
measure table names in tree in v1 data model page (#70657)

Co-authored-by: Nick Fitzpatrick <nick@metabase.com>
2026-03-13 16:01:55 +00:00
github-automation-metabase
068cdac6e5 🤖 backported "Fixed color flickering for sdk question titles" (#70856)
Fixed color flickering for sdk question titles (#70842)

Co-authored-by: Sébastien <sebastien@metabase.com>
2026-03-13 13:38:33 +00:00
github-automation-metabase
536dc1b71d 🤖 backported "add missing tags to enterprise settings" (#70858)
add missing tags to enterprise settings (#70846)

fix: add missing tags to enterprise settings

Co-authored-by: Nicola Mometto <nicola.mometto@metabase.com>
2026-03-13 13:37:43 +00:00
github-automation-metabase
c13f86e74c 🤖 backported "Ignore unknown settings in clickhouse" (#70853)
Ignore unknown settings in clickhouse (#70799)

* move additional options to clickhouse settings

* add test

* add test description

* add prefix and keep in subname

* just ignore unknown settings

* fix test

Co-authored-by: Riley Thompson <riley@metabase.com>
2026-03-13 13:37:23 +00:00
github-automation-metabase
da1a343eb4 🤖 backported "Fixed issue when hiding SDK banner" (#70854)
Fixed issue when hiding SDK banner (#70727)

Co-authored-by: Sébastien <sebastien@metabase.com>
2026-03-13 13:30:39 +00:00
github-automation-metabase
7316cc6f03 🤖 backported "Add workflow_dispatch action to reset cloud datasets" (#70850)
Add workflow_dispatch action to reset cloud datasets (#70744)

Co-authored-by: Ngoc Khuat <qn.khuat@gmail.com>
2026-03-13 12:29:46 +00:00
github-automation-metabase
3cffdd7498 🤖 backported "fix: use the correct setting for enabling metabot in the embed wizard" (#70843)
fix: use the correct setting for enabling metabot in the embed wizard (#70820)

Co-authored-by: Nicolò Pretto <info@npretto.com>
2026-03-13 09:21:01 +00:00
github-automation-metabase
fe25d44fed 🤖 backported "Fix cloud driver tests skipped when deps.edn changes [DEV-1672]" (#70836)
Fix cloud driver tests skipped when deps.edn changes [DEV-1672] (#70833)

Co-authored-by: bryan <bryan.maass@gmail.com>
2026-03-12 22:34:23 +00:00
github-automation-metabase
e9e375d6b4 🤖 backported "Fix flaky sync-materialized-views-test with auto-retry" (#70834)
Fix flaky sync-materialized-views-test with auto-retry (#70750)

Co-authored-by: bryan <bryan.maass@gmail.com>
2026-03-12 22:30:58 +00:00
github-automation-metabase
9e43cae0c8 🤖 backported "docs - clickhouse server setting prefix" (#70829)
docs - clickhouse server setting prefix (#70827)

clickhouse server setting prefix

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-03-12 21:03:43 +00:00
github-automation-metabase
c87ecc2a2c 🤖 backported "Fix SDK subscription not working under StrictMode" (#70801)
Fix SDK subscription not working under StrictMode (#70663)

* Fix can't click on the time dropdown on subscription sidebar in StrictMode

* Add tests

* update e2e test

* Fix unit tests

* improve code clarity

* Fix E2E tests

* Simplify code

* Make default value consistent

* Make the new Select button have dynamic size

* Fix unit tests

* Fix E2E tests

Co-authored-by: Mahatthana (Kelvin) Nomsawadi <me@bboykelvin.dev>
2026-03-12 16:28:50 +00:00
github-automation-metabase
6a144caac1 🤖 backported "Fix reflection warnings in tests + add linter" (#70796)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Chris Truter <crisptrutski@users.noreply.github.com>
Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
Fix reflection warnings in tests + add linter (#70551)
2026-03-12 18:02:17 +02:00
github-automation-metabase
a96bd0c948 🤖 backported "Use virtualized table for data perms" (#70637) 2026-03-12 10:18:07 -04:00
github-automation-metabase
5d05d57d2f 🤖 backported "Upgrade toucan2 to 1.0.571" (#70794)
Upgrade toucan2 to 1.0.571 (#70771)

Co-authored-by: Chris Truter <crisptrutski@users.noreply.github.com>
2026-03-12 13:47:45 +00:00
github-automation-metabase
9f633fc41a 🤖 backported "Fix flakes because we used JS instead of CSS" (#70782)
Fix flakes because we used JS instead of CSS (#70718)

Co-authored-by: Mahatthana (Kelvin) Nomsawadi <me@bboykelvin.dev>
2026-03-12 13:10:31 +00:00
github-automation-metabase
5e7da554b6 🤖 backported "homepage redirect in useLayoutEffect" (#70786)
homepage redirect in useLayoutEffect (#70658)

Co-authored-by: Nick Fitzpatrick <nick@metabase.com>
2026-03-12 13:00:55 +00:00
github-automation-metabase
0a5b403392 🤖 backported "docs: maybe not deprecating" (#70791)
docs: maybe not deprecating (#70790)

Revise guidance on using Transforms over models

Updated recommendation for using Transforms instead of models.

Co-authored-by: Alex Yarosh <alexandra@metabase.com>
2026-03-12 12:58:59 +00:00
github-automation-metabase
b2b3da94d4 🤖 backported "Embedding upsells now open data studio modal in cloud" (#70781)
Embedding upsells now open data studio modal in cloud (#70565)

Co-authored-by: Sébastien <sebastien@metabase.com>
2026-03-12 12:31:45 +00:00
Kevin Kelleher
1d66a571c2 Backport: Fix race condition in FormattingWidget initialization (#69778) (#70632) 2026-03-12 07:18:42 -04:00
github-automation-metabase
0d6bac3e04 🤖 backported "Add transform python stress test and stabilize tests" (#69752)
Fix bigquery/snowflake transforms tests (#69566)

* Add python transforms .yml for manually verifying flakes

* Fix bigquery/snowflake failing tests

* Fix bigquery name quoting

* Use explicit schema in table gens

* Schema fixes for bigquery

Co-authored-by: Dan Stone <wotbrew@gmail.com>
Co-authored-by: Ngoc Khuat <qn.khuat@gmail.com>
Co-authored-by: Nicola Mometto <nicola.mometto@metabase.com>
2026-03-12 10:38:01 +00:00
Chris Truter
4131715d0a Delete changesets orphaned by move from 58 -> 59 (#70716) 2026-03-12 08:48:26 +00:00
github-automation-metabase
f9226352d1 🤖 backported "Fix flakes" (#70752)
Fix flakes (#70296)

* Fix flake

* Wait for unreferenced entities

* Wait for unreferenced entities

* Fix helper

* Fix test

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
2026-03-12 01:29:45 +00:00
github-automation-metabase
d969df6ad5 🤖 backported "Fix dataset-already-loaded?-test flake on Redshift" (#70753)
Fix dataset-already-loaded?-test flake on Redshift (#70748)

Co-authored-by: bryan <bryan.maass@gmail.com>
2026-03-11 22:44:14 +00:00
github-automation-metabase
9c80bebdaa 🤖 backported "Show read-only mode banner to all users" (#70751)
Show read-only mode banner to all users (#70529)

Co-authored-by: Ben Grabow <ben.grabow@metabase.com>
2026-03-11 22:16:40 +00:00
github-automation-metabase
ff4efd68c0 🤖 backported "Get default port from nested connection properties" (#70736)
Get default port from nested connection properties (#70713)

* search for port in group fields

* add test

* update test

* simplify test

* fix sqlite

Co-authored-by: Riley Thompson <riley@metabase.com>
2026-03-11 20:16:29 +00:00
github-automation-metabase
99e0b7d74d 🤖 backported "Prefer SQL DML for insert-from-source! to fix bigquery metadata consistency" (#70197)
Prefer SQL DML for insert-from-source! to fix bigquery metadata consistency (#69753)

The legacy .insertAll API (and newer Storage API) do not work well with
tables that are created/dropped frequently. This is because their
metadata caches can take a long time to up date.

Python transforms use the drop-recreate fallback strategy for bigquery
so we observe this inconsistency for every run after the first, even
with absurd multi minute timeouts.

The SQL API does not have a problem, so we'll use that. We expect a
performance regression but its better to work slowly than not work at
all.

Other changes:

- Removed now redundant bigquery retry loop

- Dropped dictionary support, we cannot support it easily and it cannot be
considered higher prio than bigquery working at all.

- Added correct parameter typing for JSON.

- Fixed ordering issues in tests (assumed row order when it is
non-deterministic)

Co-authored-by: Dan Stone <wotbrew@gmail.com>
Co-authored-by: Nicola Mometto <nicola.mometto@metabase.com>
2026-03-11 20:02:46 +00:00
github-automation-metabase
01fb062df6 🤖 backported "Upgrade Jetty to 12.1.7" (#70738)
Upgrade Jetty to 12.1.7 (#70731)

CVE fix

Co-authored-by: da <paoliniluis@gmail.com>
2026-03-11 19:39:05 +00:00
github-automation-metabase
8f9673be53 🤖 backported "fix expected status of bigquery tests after #62351" (#70722)
fix expected status of bigquery tests after #62351  (#70710)

Co-authored-by: Nicola Mometto <nicola.mometto@metabase.com>
2026-03-11 18:30:59 +00:00
github-automation-metabase
5739d02d71 🤖 backported "Add retry + checksum to Clojure install, remove continue-on-error" (#70732)
Add retry + checksum to Clojure install, remove continue-on-error (#70700)

* Add retry + checksum to Clojure install, remove continue-on-error

Remove continue-on-error: true from the Install Clojure CLI step so failures
surface immediately instead of silently propagating to downstream steps.

Add retry logic (3 attempts with curl --retry and --fail) and a post-install
clojure --version gate to handle transient download failures from
download.clojure.org.

* Add explicit error message when all Clojure install retries fail
2026-03-11 17:53:00 +00:00
github-automation-metabase
0718a75ee6 🤖 backported "Run Mage Tests on all PRs and fix module count" (#70659)
Co-authored-by: bryan <bryan.maass@gmail.com>
fix module count (#70656)
2026-03-11 11:35:28 -06:00
github-automation-metabase
a055d2235e 🤖 backported "Log the migrations blocking the downgrade" (#70705)
Log the migrations blocking the downgrade (#70701)

Co-authored-by: Chris Truter <crisptrutski@users.noreply.github.com>
2026-03-11 14:06:05 +00:00
Chris Truter
11a61ed128 Move migrations that missed 59 to the correct version (#70702) 2026-03-11 15:08:30 +02:00
github-automation-metabase
106a7778da Auto-update documentation for release-x.59.x (#70691)
Update generated docs (release-x.59.x)

Co-authored-by: github-actions <github-actions@github.com>
2026-03-11 08:52:17 -04:00
github-automation-metabase
f3f3d7fc2f 🤖 backported "Fix nested button DOM nesting in StepperWithCards" (#70697)
Fix nested button DOM nesting in StepperWithCards (#70667)

Co-authored-by: Nicolò Pretto <info@npretto.com>
2026-03-11 09:53:03 +00:00
github-automation-metabase
d553ae26f3 🤖 backported "docs - notes on timeouts" (#70676)
docs - notes on timeouts (#70468)

notes on timeouts

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-03-10 21:35:59 +00:00
github-automation-metabase
ee7b8dc5ae 🤖 backported "Handle Data Analyst group name conflict" (#70677)
Handle Data Analyst group name conflict (#70594)

There are 30 instances on stats with groups named "Data Analysts". We
need to handle this case.

First, we modify the migration:

- set `validCheckSum` to `ANY` to handle the case where this migration
already ran

- skip if there's already a `data-analyst` magic group

- insert a group named "Data Analysts", if one doesn't already exist

- otherwise name it "Metabase Data Analysts" (there are 0 groups on
with this name in cloud, theoretically it's possible but someone would
have to have BOTH `Metabase Data Analysts` and `Data Analysts` for this
to be an issue).

Similarly, we create a "Data Analysts" group on startup in OSS if one
doesn't already exist. This group is an invisible placeholder, that will
become visible if the instance ever upgrades. Adopt similar logic here:
if the existing group for data analysts is called "Metabase Data
Analysts", rename it to "Metabase Data Analysts (converted)" and create
the new placeholder group as "Metabase Data Analysts".

Co-authored-by: John Swanson <john.swanson@metabase.com>
2026-03-10 21:32:39 +00:00
github-automation-metabase
bb877735e4 🤖 backported "Clean up CODEOWNERS" (#70668) 2026-03-10 19:15:46 +00:00
github-automation-metabase
21ebfbc331 🤖 backported "Fix broken pie chart colors for some strings in static-viz" (#70665)
Fix broken pie chart colors for some strings in static-viz (#70640)

Co-authored-by: Kevin Kelleher <kevin.kelleher@metabase.com>
2026-03-10 18:31:32 +00:00
github-automation-metabase
304696bc91 🤖 backported "Fixed extraneous item in filter popover in embeds" (#70648)
Fixed extraneous item in filter popover in embeds (#70634)

Co-authored-by: Sébastien <sebastien@metabase.com>
2026-03-10 16:23:16 +00:00
github-automation-metabase
4e866507fd 🤖 backported "Fix missing translation in guest embed filters" (#70651)
Fix missing translation in guest embed filters (#70583)

Co-authored-by: Sébastien <sebastien@metabase.com>
2026-03-10 16:19:22 +00:00
github-automation-metabase
1e152e0d8e 🤖 backported " Add configurable CSV field separator setting " (#70643)
Add configurable CSV field separator setting  (#69827)

* Add configurable CSV field separator setting

- Adds csv-field-separator setting for configuring CSV export delimiter
- Supports comma (default), semicolon, tab, and other delimiters
- Useful for European locales where semicolon is standard
- Configurable via MB_CSV_FIELD_SEPARATOR environment variable
- Includes tests for different separator types and quoting behavior

Fixes #10256

* Split CSV separator tests into smaller deftests and clean up comments

Break the monolithic csv-field-separator-test into four focused tests:
- csv-field-separator-default-test
- csv-field-separator-semicolon-test
- csv-field-separator-tab-test
- csv-separator-quoting-test (already separate, just removed extra nesting)

Remove the "Changed from hardcoded" comment in csv.clj and the unused
metabase.test.util require.

* fixup! eastwood and serialization baseline

* fixup! whitespace

---------

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
Co-authored-by: kevin raymond <kevray39@gmail.com>
2026-03-10 15:44:54 +00:00
github-automation-metabase
45ed90ba76 🤖 backported "docs: clarify transform perms" (#70652)
docs: clarify transform perms (#70650)

clarify perms

Clarified the permissions required for viewing and executing transforms in Metabase.

Co-authored-by: Alex Yarosh <alexandra@metabase.com>
2026-03-10 15:38:34 +00:00
github-automation-metabase
500181e007 🤖 backported "Use lowest cardinality dimension as default for boxplot" (#70635)
Use lowest cardinality dimension as default for boxplot (#70569)

Co-authored-by: Kevin Kelleher <kevin.kelleher@metabase.com>
2026-03-10 13:21:59 +00:00
github-automation-metabase
75fd57ea28 🤖 backported "Fix handling of object columns in pie charts" (#70631)
Fix handling of object columns in pie charts (#68095)

Co-authored-by: Kevin Kelleher <kevin.kelleher@metabase.com>
2026-03-10 11:58:37 +00:00
github-automation-metabase
680404c1e5 🤖 backported "Improve modular embedding analytics" (#70630)
Improve modular embedding analytics (#70449)

* Add v3 for modular embedding analytics

* Add implementation

* Improve test readability

* Improve code format

* Make the code autocomplete-able to prevent human-error

* Add missing default value tests

* Format

* Ensure we assert all properties

* fix "id_new" and "id_new_native" tracking

* Update the implementation so it count 0 like before

* Fix logic

* Fix snowplow schema lint

* Remove too much linear ticket number references

Co-authored-by: Mahatthana (Kelvin) Nomsawadi <me@bboykelvin.dev>
2026-03-10 11:37:10 +00:00
github-automation-metabase
c84f1012bf 🤖 backported "[MBQL lib] Ignore inherited-temporal-unit on bucketed columns" (#70606)
[MBQL lib] Ignore `inherited-temporal-unit` on bucketed columns (#70512)

Fixes QUE2-394.

This issue was caused by losing the thread of a column between stages in
the case where it has a different `:inherited-temporal-unit` than its
proper `:temporal-unit`.

`lib.equality/=` was checking the `:temporal-unit`s, which match, and
then returning `false` because only one column had
`:inherited-temporal-unit` for a different, finer unit. That shouldn't
fail the match, since the `:inherited-temporal-unit` is obsolete when
the column has just been bucketed differently.

Co-authored-by: Braden Shepherdson <braden@metabase.com>
2026-03-10 09:52:15 +00:00
github-automation-metabase
8551af6837 🤖 backported "test(eajs): handleLink should prevent default behavior when returning {handled:true}" (#70627)
test(eajs): handleLink should prevent default behavior when returning `{handled:true}` (#70592)

test(eajs): handleLink should  prevent default behavior when returning {handled:true}

Co-authored-by: Nicolò Pretto <info@npretto.com>
2026-03-10 08:59:14 +00:00
github-automation-metabase
64a3be5111 🤖 backported "Fix broken e2e test for #68998" (#70620)
Fix broken e2e test for #68998 (#70585)

Co-authored-by: Denis Berezin <denis.berezin@metabase.com>
2026-03-10 00:39:09 +00:00
github-automation-metabase
be513aee1f 🤖 backported "SSO users can reset password if provider disabled" (#70330)
SSO users can reset password if provider disabled (#70219)

Previously, password-reset-disabled? blocked password reset for all
SSO users unconditionally (except Google when SSO was globally
disabled). After a license downgrade, EE SSO users were locked out —
they couldn't use SSO (no license) and couldn't reset their password
either.

Introduce sso-source-enabled? which checks whether a user's specific
SSO provider is currently active, using setting/get to respect the
:feature guards on EE settings. password-reset-disabled? now delegates
to this function, so password reset is only blocked when the provider
is actually usable.

Co-authored-by: John Swanson <john.swanson@metabase.com>
2026-03-10 00:17:17 +00:00
github-automation-metabase
7b9c34544d 🤖 backported "Preserve expression names when fixing bad field refs" (#70599)
Preserve expression names when fixing bad field refs (#70530)

Closes QUE2-397

Co-authored-by: metamben <103100869+metamben@users.noreply.github.com>
2026-03-09 23:08:18 +00:00
github-automation-metabase
90cc3ad011 🤖 backported "Remove minimally useful semantic search log messages" (#70605)
Remove minimally useful semantic search log messages (#70524)

Co-authored-by: Ben Grabow <ben.grabow@metabase.com>
2026-03-09 21:37:24 +00:00
github-automation-metabase
fd8aafccd1 🤖 backported "docs - remote sync limitations" (#70603)
docs - remote sync limitations (#70598)

* branch limitations

* edits

* link

* Apply suggestions from code review



---------

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
Co-authored-by: Alex Yarosh <alexandra@metabase.com>
2026-03-09 20:53:54 +00:00
github-automation-metabase
f51a919dfe 🤖 backported "fix: NLQ profile incorrectly used for SQL editor requests" (#70519)
fix: NLQ profile incorrectly used for SQL editor requests (#70436)

* fix: NLQ profile incorrectly used for SQL editor requests

* fix: tests

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-03-09 17:24:12 +00:00
github-automation-metabase
8b4b23a82a 🤖 backported "Data migration to fix clickhouse upload dbs with missing schema" (#70466)
Data migration to fix clickhouse upload dbs with missing schema (#70363)

* testing

* add migration

* add test

* reorder test

* improve migration

* improve test

* add comment explanation

* fmt

Co-authored-by: Riley Thompson <riley@metabase.com>
2026-03-09 12:40:01 -04:00
github-automation-metabase
a47a3c4ab6 🤖 backported "remove ThemeProvider from sdk component test" (#70590)
remove ThemeProvider from sdk component test (#70568)

Co-authored-by: Nicolò Pretto <info@npretto.com>
2026-03-09 16:39:24 +00:00
github-automation-metabase
0bd44c5499 🤖 backported "fix: Metabot not receiving transform errors from transforms" (#70591)
fix: Metabot not receiving transform errors from transforms (#70462)

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-03-09 16:33:43 +00:00
github-automation-metabase
11f18aca0a 🤖 backported "fix: allow dashboard caching in read-only mode" (#70587)
fix: allow dashboard caching in read-only mode (#70511)

* fix: allow dashboard caching in read-only mode

* fix: split out cache permissions from can-write?

We were denying changing caching policy for dashboards on read-only
remote-synced instances because we set can-write? to false for
dashboards when we are in read-only mode.

we also need to create a new boolean flag we can return to the frontend
to indicate that caching is still allowed even when editing a dashboard
is otherwise disabled.

* fixup! PR feedback

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2026-03-09 16:25:35 +00:00
github-automation-metabase
4bab80c529 🤖 backported "Pivot Table shows a blank card when rendered on a dashboard" (#70582)
Pivot Table shows a blank card when rendered on a dashboard (#70385)

Co-authored-by: Denis Berezin <denis.berezin@metabase.com>
2026-03-09 16:00:59 +00:00
github-automation-metabase
cc83ff191b 🤖 backported "Upgrade clickhouse to 0.9.7 with pinned dependencies" (#70581)
Upgrade clickhouse to 0.9.7 with pinned dependencies (#70448)

* upgrade clickhouse jdbc to 0.9.7

* clean up todos

* update deps

Co-authored-by: Riley Thompson <riley@metabase.com>
2026-03-09 15:57:55 +00:00
github-automation-metabase
9ba7fa64e7 🤖 backported "fix: update ESLint configuration file path for eslint config" (#70575)
fix: update ESLint configuration file path for eslint config (#70507)

* fix: update ESLint configuration file path from .eslintrc.js to eslint.config.mjs

* run lint when we change component tests specs

Co-authored-by: Nicolò Pretto <info@npretto.com>
2026-03-09 15:29:01 +00:00
github-automation-metabase
0b53689b2a 🤖 backported "add another feature flag for transforms" (#70570) 2026-03-09 17:56:25 +03:00
github-automation-metabase
2ca028df70 Auto-update documentation for release-x.59.x (#70563)
Update generated docs (release-x.59.x)

Co-authored-by: github-actions <github-actions@github.com>
2026-03-09 09:28:36 -04:00
github-automation-metabase
b8ab03e15c 🤖 backported "Stop using 2am in tests to avoid DST issues" (#70564)
Stop using 2am in tests to avoid DST issues (#70562)

* Stop using 2am in tests to avoid DST issues

* Scope to table cell data

Co-authored-by: Fraser <fraser@metabase.com>
2026-03-09 08:42:19 +00:00
github-automation-metabase
edf4d88f0b 🤖 backported "Fix typo in self-dependency removal GHY-3198" (#70554)
Fix typo in self-dependency removal GHY-3198 (#70535)

There was a typo in a transducer where the cat and remove were swapped. The cat was meant to combine collections (`#{x})` and the remove was looking for `x`, but since it happened in the wrong order, it never removed them. This led to self-dependent entities, and therefore cycles which caused infinite loops.

Co-authored-by: Eric Normand <ericwnormand@gmail.com>
2026-03-07 22:47:48 +00:00
github-automation-metabase
ca309ce35b 🤖 backported "Switch component improvements" (#70539)
Switch component improvements (#70520)

* fix toggle alignment

* reduce space above description

* change usage guidelines to recommend sm

* Update Loki Snapshots

---------

Co-authored-by: Maz Ameli <maz@metabase.com>
2026-03-06 23:25:11 +00:00
github-automation-metabase
a985dc6d94 🤖 backported "fix: only skip deleting commonpy not pushing it" (#70488)
fix: only skip deleting commonpy not pushing it (#70439)

* fix: only skip deleting commonpy not pushing it

* fixup! kondos

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2026-03-06 21:35:58 +00:00
github-automation-metabase
84cebc8ce9 🤖 backported "Omit pivot-grouping from window function OVER PARTITION BY and ORDER BY expressions" (#70457)
Omit `pivot-grouping` from window function `OVER` `PARTITION BY` and `ORDER BY` expressions (#70273)

* Experimental fix for #70088

* cljfmt

* Document the new key

* Cleanup

Co-authored-by: Cam Saul <1455846+camsaul@users.noreply.github.com>
2026-03-06 13:32:55 -08:00
github-automation-metabase
eaad1ed358 🤖 backported "ignore linting issue in embedding test" (#70523)
ignore linting issue in embedding test (#70514)

Co-authored-by: Nick Fitzpatrick <nick@metabase.com>
2026-03-06 20:51:35 +00:00
github-automation-metabase
65703e390a 🤖 backported "Fix numbered list for row and column security section" (#70527)
Fix numbered list for row and column security section (#70525)

Co-authored-by: Jacob Joseph <likeshumidity@users.noreply.github.com>
2026-03-06 20:33:18 +00:00
github-automation-metabase
ec6f7e3eeb 🤖 backported "fixing linting" (#70509)
fixing linting (#70504)

Co-authored-by: Nick Fitzpatrick <nick@metabase.com>
2026-03-06 17:34:29 +00:00
github-automation-metabase
9152261a5e 🤖 backported "bump c3p0 to 0.12.0" (#70502)
bump c3p0 to 0.12.0 (#70494)

Co-authored-by: dpsutton <dan@dpsutton.com>
2026-03-06 16:25:32 +00:00
github-automation-metabase
73e339c4f0 🤖 backported "remove noisy logs from sdk component tests" (#70501)
remove noisy logs from sdk component tests (#70416)

* should fix clj files imported from sdk component tests

* reduce noise when not finding the sdk package

* remove mantine from tests that don't need it

* eslint rule

Co-authored-by: Nicolò Pretto <info@npretto.com>
2026-03-06 16:11:35 +00:00
github-automation-metabase
e529efa441 🤖 backported "Allow loading of 58 serialized tables in 59+" (#70495)
Allow loading of 58 serialized tables in 59+ (#70486)

* fix: allow importing 58 serialized data-layer values

* add test

Co-authored-by: Nicola Mometto <nicola.mometto@metabase.com>
2026-03-06 15:28:42 +00:00
Nicolò Pretto
64b941ce26 backport gitignore change for sdk (#70500) 2026-03-06 15:28:00 +00:00
github-automation-metabase
4972373d11 🤖 backported "Fix duplicate alerts/subscriptions firing in multi-pod clusters" (#70490)
Fix duplicate alerts/subscriptions firing in multi-pod clusters (#70474)

* Fix duplicate alerts/subscriptions firing in multi-pod clusters

Set acquireTriggersWithinLock=true to force pessimistic locking during
trigger acquisition. Without this, Quartz uses an optimistic UPDATE that
is vulnerable to an ABA race condition where multiple cluster nodes can
acquire and fire the same trigger simultaneously.

* Add *warn-on-reflection* to custom_migrations/util

Fixes clj-kondo warning triggered by Java interop (System/setProperty,
System/clearProperty) added in the acquireTriggersWithinLock fix.

Co-authored-by: Ngoc Khuat <qn.khuat@gmail.com>
2026-03-06 14:28:35 +00:00
github-automation-metabase
559044ccc3 🤖 backported "fixed table width in guest embed" (#70487)
fixed table width in guest embed (#70418)

* fixed table width in guest embed

* fixed test

Co-authored-by: Sébastien <sebastien@metabase.com>
2026-03-06 13:39:17 +00:00
github-automation-metabase
fca7fac641 🤖 backported "GDGT-1872: Change transform metering to tier-based keys" (#70473)
GDGT-1872: Change transform metering to tier-based keys (#70366)

Co-authored-by: Ngoc Khuat <qn.khuat@gmail.com>
2026-03-06 15:55:02 +07:00
github-automation-metabase
2bbce4a3fc 🤖 backported "Filter out inactive tables for metabot" (#70469)
Filter out inactive tables for metabot (#70440)

* Filter out inactive tables for metabot

* fix another spot

Co-authored-by: Noah Moss <32746338+noahmoss@users.noreply.github.com>
2026-03-06 00:13:15 +00:00
github-automation-metabase
72475910c3 🤖 backported "fix: metabot returns null for pasted question references" (#70455)
fix: metabot returns null for pasted question references (#70388)

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-03-05 19:10:43 +00:00
github-automation-metabase
d1a605cddd 🤖 backported "Fix incomplete URL substring sanitization in LeafletMap" (#70431)
Fix incomplete URL substring sanitization in LeafletMap (#70428)

The previous check used `.includes("openstreetmap.org")` which could be
bypassed by malicious domains like `openstreetmap.org.evil.com` or
`fake-openstreetmap.org`.

This fix validates that the hostname is either exactly `openstreetmap.org`
or a legitimate subdomain ending with `.openstreetmap.org`.

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-05 15:18:10 +00:00
github-automation-metabase
dc5df2e0f4 Auto-update documentation for release-x.59.x (#70413)
Update generated docs (release-x.59.x)

Co-authored-by: github-actions <github-actions@github.com>
2026-03-05 09:26:57 -05:00
github-automation-metabase
147a7de372 🤖 backported "EMB-1329: update embed wizard terms copy and add link" (#70421)
EMB-1329: update embed wizard terms copy and add link (#69856)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Phoomparin Mano <poom@metabase.com>
Co-authored-by: Nicolò Pretto <info@npretto.com>

closes #69302
Closes linear.app/metabase/issue/EMB-1329/embedding-tooltip-directs-you-to-read-license-text-linked-above-no

Co-authored-by: Alberto Perdomo <albertoperdomo@users.noreply.github.com>
2026-03-05 12:51:13 +00:00
github-automation-metabase
c6d1f36222 🤖 backported "fix(sdk): Fix the empty container detection in SDK question layouts" (#70420)
fix(sdk): Fix the empty container detection in SDK question layouts (#70389)

Co-authored-by: Timofey Kachalov <timofei@metabase.com>
2026-03-05 12:17:06 +00:00
github-automation-metabase
05dd03f7e2 🤖 backported "Wrap buttons and title on smaller screens" (#70414)
Wrap buttons and title on smaller screens (#67681)

* Wrap title and buttons earlier when nav bar is open

* Wrap title in header at wider breakpoint

* Left align ad-hoc questions too

* Add gap when question title collapses

* Increase breakpoint

* Fix padding on ViewSection

* Use container query for query builder breakpoints

* Make padding more consistent with other headers on small screens

* Tweak question action buttons on small screens

* Add separator for actions

* Fix padding on filter panel

* Fix padding on back button

* Fix padding to match header

* Break sooner

* Do not break subheader as soon

* Fix test

* Remove reliance on query-builder from FilterPanel component

* Remove spurious margin

* Fix gap between header items

* Move container to header and footer

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
2026-03-05 04:41:32 +00:00
github-automation-metabase
dc94aa66af 🤖 backported "Don't call trial check EE endpoint in OSS for Remote Sync upsell" (#70412)
Don't call trial check EE endpoint in OSS for Remote Sync upsell (#70349)

Co-authored-by: Anderson <ands.alves.nunes@gmail.com>
2026-03-05 02:46:32 +00:00
github-automation-metabase
f5829dfe7c 🤖 backported "Add snowplow events when creating measures and segments" (#70307)
Add snowplow events when creating measures and segments (#70218)

* Add snowplow events when creating measures

* Track also from the table measures page

* Add tracking events when creating segments

* Fix e2e

Co-authored-by: Anderson <ands.alves.nunes@gmail.com>
2026-03-04 21:16:37 -05:00
github-automation-metabase
11ad685080 🤖 backported "Revert "Upgrade clickhouse jdbc driver to 0.9.7"" (#70410)
Revert "Upgrade clickhouse jdbc driver to 0.9.7" (#70403)

Revert "Upgrade clickhouse jdbc driver to 0.9.7 (#70387)"

This reverts commit 3a69ad8f49.

Co-authored-by: Riley Thompson <riley@metabase.com>
2026-03-05 01:35:16 +00:00
github-automation-metabase
22585ef8b7 🤖 backported "Add writable-connection feature flag " (#70404)
Add `writable-connection` feature flag  (#70287)

Co-authored-by: Alexander Polyankin <alexander.polyankin@metabase.com>
2026-03-04 23:46:25 +00:00
github-automation-metabase
afc5a3b76f 🤖 backported "docs - keys to data studio" (#70406)
docs - keys to data studio (#70405)

* keys to data studio

* link

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-03-04 23:07:25 +00:00
github-automation-metabase
cbf67b61c6 🤖 backported "Update jspdf to fix security issues" (#70399)
Update jspdf to fix security issues (#70393)

Co-authored-by: Denis Berezin <denis.berezin@metabase.com>
2026-03-04 22:50:19 +00:00
github-automation-metabase
8d7831fbb5 🤖 backported "Polish transform template tag frontend" (#70401)
Polish transform template tag frontend (#70095)

* Rename confusingly named setParameterAttribute

* Remove unnecessary check

* Add options to disable parameter settings

* Disable parameters settings in transform sidebar

* Add e2e test for parameter field settings

* Rename disableParamaterSettings to parametersAreUserVisible

* Make parametersAreUserVisible configurable all the way up to QueryEditor

* Update copy when parameters aren't visible to user

* Fix test

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
2026-03-04 22:34:39 +00:00
github-automation-metabase
d8409f66ce 🤖 backported "Upgrade clickhouse jdbc driver to 0.9.7" (#70397)
Upgrade clickhouse jdbc driver to 0.9.7 (#70387)

* upgrade clickhouse jdbc to 0.9.7

* clean up todos

Co-authored-by: Riley Thompson <riley@metabase.com>
2026-03-04 22:08:12 +00:00
github-automation-metabase
09f14942f4 🤖 backported "Make excluded-datetime return integers for days too" (#70392)
Make excluded-datetime return integers for days too (#69915)

* Make excluded-datetime return integers for days too

Closes QUE2-254

Co-authored-by: metamben <103100869+metamben@users.noreply.github.com>
2026-03-04 19:30:26 +00:00
github-automation-metabase
f013a54e3f 🤖 backported "DEV-1599 DEV-1598 fix flakiness" (#70390)
DEV-1599 DEV-1598 fix flakiness (#70166)

Co-authored-by: Egor Grushin <egor@metabase.com>
2026-03-04 19:00:50 +00:00
github-automation-metabase
d746fe0a8d Auto-update documentation for release-x.59.x (#70352)
Update generated docs (release-x.59.x)

Co-authored-by: github-actions <github-actions@github.com>
2026-03-04 12:17:31 -05:00
github-automation-metabase
2ea0a88582 🤖 backported "Restrict notification schema and allowed template values" (#70381)
Restrict notification schema and allowed template values (#70261)

* fix: restrict channel renderer to hbs files in the template path

* restricted api schemas

* explicit validation

* chore: tests

* fix: test

Co-authored-by: Nicola Mometto <nicola.mometto@metabase.com>
2026-03-04 16:28:47 +00:00
github-automation-metabase
4cbe8be3d0 🤖 backported "Conceal JWT signing secret by default" (#70376)
Conceal JWT signing secret by default (#70329)

Co-authored-by: Rodrigo López Dato <rodrigo@metabase.com>
2026-03-04 15:54:26 +00:00
github-automation-metabase
f95d6cf061 🤖 backported "Add cache restore keys for M2 and Node modules" (#70373)
Add cache restore keys for M2 and Node modules (#70370)

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-03-04 15:00:58 +00:00
github-automation-metabase
cda3ab37c3 🤖 backported "Fix clickhouse transform flake, hopefully" (#70357)
Co-authored-by: Chris Truter <crisptrutski@users.noreply.github.com>
Fix clickhouse transform flake, hopefully (#70316)
2026-03-04 11:40:03 +02:00
github-automation-metabase
3f46bc6c18 🤖 backported "improved doc generation for EAJS" (#70355)
improved doc generation for EAJS (#69890)

Co-authored-by: Sébastien <sebastien@metabase.com>
2026-03-04 06:57:28 +00:00
github-automation-metabase
bdb50b1cd7 🤖 backported "Implement auto-generated props tables for modular embedding" (#70319)
Implement auto-generated props tables for modular embedding (#69407)

* Add TypeDoc-friendly interfaces for EAJS web component documentation

* Add TypeDoc config for EAJS web component docs generation

* Generate EAJS web component props tables via TypeDoc

* Replace manual parameter lists with auto-generated props tables

* Fixed file references in components.md and enforced types in embed.ts

* .

* .

* .

* added detail on a prop and uncommited *.md files

* added info about attributes needing to be stringified

* .

Co-authored-by: Sébastien <sebastien@metabase.com>
2026-03-04 07:47:16 +01:00
github-automation-metabase
5374ef8b97 🤖 backported "Don't fail on unknown settings when calling set-many" (#70344)
Don't fail on unknown settings when calling set-many (#70282)

Co-authored-by: Nathan Voxland <nathan@metabase.com>
2026-03-03 22:39:17 +00:00
github-automation-metabase
f2f1054aeb 🤖 backported "Track whether column is :lib/from-model?" (#70274)
Track whether column is `:lib/from-model?` (#70128)

* Track whether column is `:lib/from-model?`

* Additional fix 🔧

* Fix GH issue number

* (Try an evil hacc)

* Explain the HACC

Co-authored-by: Cam Saul <1455846+camsaul@users.noreply.github.com>
2026-03-03 21:49:16 +00:00
github-automation-metabase
a76d7609e5 🤖 backported "docs: a lot of updates" (#70340)
docs: a lot of updates (#70176)

* oops

* links

* more links

* Update docs/configuring-metabase/appearance.md

* Apply suggestions from code review



* Apply suggestions from code review



---------

Co-authored-by: Alex Yarosh <alexandra@metabase.com>
Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-03-03 20:41:24 +00:00
github-automation-metabase
beb3e2c76e 🤖 backported "docs: transform screenshots" (#70333)
docs: transform screenshots (#70225)

* transform updates

* more transform

* Optimized 11 images, saved 1015.9 KB (45.3% smaller)

* screenshot typo

---------

Co-authored-by: Alex Yarosh <alexandra@metabase.com>
2026-03-03 19:23:27 +00:00
github-automation-metabase
a4a07c001f 🤖 backported "docs - embedded Metabot" (#70331)
docs - embedded Metabot (#70275)

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-03-03 18:52:06 +00:00
github-automation-metabase
663fa376b5 🤖 backported "feat: improve mention menu in metabot" (#70325)
feat: improve mention menu in metabot (#69650)

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-03-03 18:08:54 +00:00
github-automation-metabase
cb96cbf45c 🤖 backported "docs: start redirect" (#70324)
docs: start redirect (#70323)

start redirect

Co-authored-by: Alex Yarosh <alexandra@metabase.com>
2026-03-03 17:29:44 +00:00
github-automation-metabase
5edd23c5ad 🤖 backported "Gdgt 1801 visualization typescript conversions leafletmap.tsx" (#70321)
Gdgt 1801 visualization typescript conversions leafletmap.tsx (#70248)

Co-authored-by: Jakub Chodorowicz <jakub.chodorowicz@metabase.com>
2026-03-03 16:57:25 +00:00
github-automation-metabase
a2c1913f61 🤖 backported "Set team.json and assign modules:" (#70318)
Set team.json and assign modules: (#70309)

team:

```javascript
    {
      "name": "Graphy",
      "label": ".Team/Graphy",
      "members": [
        "ranquild",    // alex p
        "romeovs",     // romeo
        "ericnormand", // eric
        "galdre",      // timothy
        "dpsutton",    // dan
        "escherize",   // bryan
        "bgrabow"      // ben
      ]
    }
```

Modules:
- analyze
- graph
- sync
- enterprise/dependencies

Co-authored-by: dpsutton <dan@dpsutton.com>
2026-03-03 16:48:43 +00:00
github-automation-metabase
d3c6113973 🤖 backported "Missing space + log4j capitalization" (#70315)
Missing space + log4j capitalization (#70271)

* Missing space + log4j capitalization

* Don't make changes in autogenerated MD files

Co-authored-by: Rodrigo López Dato <rodrigo@metabase.com>
2026-03-03 15:28:07 +00:00
github-automation-metabase
134a752793 🤖 backported "Remove obsolete LeafletHeatMap and leaflet.heat" (#70310)
Remove obsolete LeafletHeatMap and leaflet.heat (#70301)

Co-authored-by: Jakub Chodorowicz <jakub.chodorowicz@metabase.com>
2026-03-03 14:58:50 +00:00
github-automation-metabase
36660add67 docs(sdk): Update SDK version to 0.59.0 (#70312)
docs(sdk): Update Readme version references and published npm version to 0.59.0
2026-03-03 14:35:46 +00:00
Sébastien
892f2f0804 Post release checklist -> 59 (#70303)
post release checklist
2026-03-03 15:11:16 +01:00
github-automation-metabase
a6ca6bb69a 🤖 backported "Add snowplow events when creating a metric" (#70295)
Add snowplow events when creating a metric (#69990)

* Add snowplow events when creating a metric

* Fix tests in data-studio-metrics.cy.spec.ts

* Fix prettier

Co-authored-by: Anderson <ands.alves.nunes@gmail.com>
2026-03-03 06:39:43 +00:00
github-automation-metabase
daf7d9964c 🤖 backported "Diagnostics cleanup pulled from the metrics branch" (#69952)
* Diagnostics cleanup pulled from the metrics branch (#69926)

* fix test

---------

Co-authored-by: Alexander Polyankin <alexander.polyankin@metabase.com>
2026-03-02 22:50:16 -05:00
github-automation-metabase
aad8c16fce 🤖 backported "Use the search cluster lock for both init indexing and re-indexing" (#70285)
Use the search cluster lock for both init indexing and re-indexing (#70272)

Co-authored-by: Nathan Voxland <nathan@metabase.com>
2026-03-03 00:58:39 +00:00
github-automation-metabase
3c88af7275 🤖 backported "Convert parameters to typescript" (#70238)
Convert parameters to typescript (#70137)

* Convert parameters to TypeScript

* Fix types

* Fix types in normalizeValue

* Fix types in dashboard tests

* Fix more types

* Fix test

* Remove duplicate check

* Naming

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
2026-03-02 23:29:55 +00:00
github-automation-metabase
924247b679 🤖 backported "docs - fix summary formatting in users-roles-privileges.md" (#70278)
docs - fix summary formatting in users-roles-privileges.md (#70277)

Fix summary formatting in users-roles-privileges.md

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-03-02 21:54:42 +00:00
github-automation-metabase
d609bf8303 🤖 backported "GDGT-1859: Fix enabling Advanced Transforms" (#70265)
GDGT-1859: Fix enabling Advanced Transforms (#70183)

* GDGT-1859: Fix Python transforms not enabled after adding to the trial

* GDGT-1859: Add page refresh after enabling Advanced Transforms

* GDGT-1859: Update unit tests

Co-authored-by: Stas Gavrylov <stas@metabase.com>
2026-03-02 19:20:02 +00:00
github-automation-metabase
4600dc1797 🤖 backported "docs: update plans for writeable connection" (#70266)
docs: update plans for writeable connection (#70264)

* 😑

* remove blockquotes

* Update docs/databases/users-roles-privileges.md



---------

Co-authored-by: Alex Yarosh <alexandra@metabase.com>
Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-03-02 19:11:20 +00:00
github-automation-metabase
bf9f30f005 🤖 backported "fix stress tests for sdk component tests" (#70257)
fix stress tests for sdk component tests (#70253)

Co-authored-by: Nicolò Pretto <info@npretto.com>
2026-03-02 17:00:20 +00:00
github-automation-metabase
0fc67c5b14 🤖 backported "Replace 'Set up git sync' with 'Set up remote sync' on Data Studio sidebar" (#69925)
Replace 'Set up git sync' with 'Set up remote sync' on Data Studio sidebar (#69883)

Co-authored-by: Anderson <ands.alves.nunes@gmail.com>
2026-03-02 11:46:29 -05:00
github-automation-metabase
1a16dd80ea 🤖 backported "[deps] Ignore "soft" refs (in :fields clauses) in deps analysis" (#69669)
[deps] Ignore "soft" refs (in `:fields` clauses) in deps analysis (#69198)

Fixes QUE-3044.

The QP will ignore refs in `:fields` clauses which cannot be resolved, since they're output only and not critical to the meaning of the query. This change makes the deps analysis treat these "soft" refs the same way - they are not considered to break the queries.

I added some commented tests that are now captured as part of QUE-3081 rather than part of this PR.

Co-authored-by: Braden Shepherdson <braden@metabase.com>
2026-03-02 18:22:14 +03:00
github-automation-metabase
bee470d80a 🤖 backported "Add toggle to enable/disable the Metabot" (#70240)
Add toggle to enable/disable the Metabot (#70111)

Co-authored-by: Oleksandr Solovyov <alexander@solovyov.net>
2026-03-02 09:16:46 +00:00
github-automation-metabase
4cced7ef9c 🤖 backported "Docs: Tenant attributes and collections improvements" (#70220)
Docs: Tenant attributes and collections improvements (#70179)

* Tenant attributes and collections improvements

First round of edits to add the ability to create tenant attributes using SSO.

* Revise tenant-specific access for non-admin internal users

* Edits based on Alberto's comments

* Move tenant claims info to claims section, link to it from attributes

* Apply suggestion from @alexyarosh



* Moved tenant attribute logic and simplified sentence

* Fix a sentence, improve code example, and clean up permissions bullet points

---------

Co-authored-by: Robert Kosara <rkosara@me.com>
Co-authored-by: Alex Yarosh <alexandra@metabase.com>
2026-02-27 21:53:14 +00:00
github-automation-metabase
9c60b0cc6a 🤖 backported "docs: writeable connection" (#70212)
docs: writeable connection (#70210)

* writeable connection

* Optimized 1 images, saved 89.0 KB (46.9% smaller)

* routing notes

* typos

---------

Co-authored-by: Alex Yarosh <alexandra@metabase.com>
2026-02-27 19:35:59 +00:00
github-automation-metabase
769015ed36 🤖 backported "Increase viewport to reduce "extract column" flakes" (#70209)
Increase viewport to reduce "extract column" flakes (#70206)

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-02-27 19:21:23 +00:00
github-automation-metabase
244e9d4cff 🤖 backported "Add snowplow event for opening Data Studio" (#70208)
Add snowplow event for opening Data Studio (#69880)

* Add snowplow event for when opening Data Studio

* Update triggered_from

Co-authored-by: Anderson <ands.alves.nunes@gmail.com>
2026-02-27 18:58:18 +00:00
github-automation-metabase
fcaaa115ec 🤖 backported "Migrate away from deprecated Cypress.env() API" (#70205)
Migrate away from deprecated Cypress.env() API (#70189)

As of Cypress 15.10.0, `Cypress.env()` is deprecated. This commit migrates
all usages to the new recommended APIs:

- Non-sensitive config values → `Cypress.expose()` (synchronous)
- Sensitive token values → `cy.env()` (asynchronous)

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-27 18:39:03 +00:00
github-automation-metabase
ac6796158c 🤖 backported "Improve logging around notifications" (#70202)
Improve logging around notifications (#70099)

Co-authored-by: Ngoc Khuat <qn.khuat@gmail.com>
2026-02-27 17:40:45 +00:00
github-automation-metabase
bfb41c44fd 🤖 backported "Add position field to dashboard parameters for stable serialization" (#70200)
Add position field to dashboard parameters for stable serialization (#70107)

* revert sorting by id on parameters serialization, parameters ordering is significant and must be preserved

* revert, we're storing position

* feat: add :position to parameters, backfill

* feat: backfill position on imported parameters

* chore: tests

* FE: update position

* chore: gitignore python-sources.lock

* chore: ensure we get position

* restrict to dashboard params

* tests

* simpler approach: just sort by position on serialization export/import

Co-authored-by: Nicola Mometto <nicola.mometto@metabase.com>
2026-02-27 17:05:53 +00:00
github-automation-metabase
22eb03248a 🤖 backported "Fix bigquery routing test" (#70184)
Fix bigquery routing test (#70154)

- Was using wrong project / creds
- Using two different sha names only worked when shas were not used as
qualifiers in the query (they are for bigquery)

Added the ability to override the hash-key used for tx/hash-dataset to
support forcing a hash collision (as is required by routing).

Co-authored-by: Dan Stone <wotbrew@gmail.com>
2026-02-27 15:53:22 +00:00
github-automation-metabase
c3496cc5ca 🤖 backported "feat: error code on streaming response throw/fail" (#70192)
feat: error code on streaming response throw/fail (#62351)

* fix: real error codes in streaming responses

* fixup! try faking old errors deeper in the stack

* fixup! wrap fetch endpoint in embedding too

* fixup! treat string only errors differently

* fixup! handle errors in a couple other places

* fixup! hard to figure out what kind of error it is

* fixup! typecasts

* fixup! test arity

* fixup! remove blanket 403 page from dataset

* fixup! simplify backend 403 responses

* fixup! a couple missed tests

* fixup! add mockresponse for mockclient

* fixup! other failing tests

* fixup! last failing test

* fixup! add another OSS check

* fixup! one more oss test

* fixup! update status codes on some more tests

* fixup! use committed function

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2026-02-27 15:30:08 +00:00
github-automation-metabase
84bbe48672 🤖 backported "Simplify notification result data flow" (#70194)
Simplify notification result data flow (#70115)

Co-authored-by: Ngoc Khuat <qn.khuat@gmail.com>
2026-02-27 15:27:21 +00:00
github-automation-metabase
f3cd2f14dd 🤖 backported "remove sdk import error on core app e2e tests" (#70191)
remove sdk import error on core app e2e tests (#70188)

try to untangle imports

Co-authored-by: Nicolò Pretto <info@npretto.com>
2026-02-27 14:26:51 +00:00
github-automation-metabase
ea7a741667 🤖 backported "fix: new SQL questions automatically open DataReference sidebar" (#70173)
fix: new SQL questions automatically open DataReference sidebar (#70120)

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-02-26 21:58:09 +00:00
github-automation-metabase
f9ab72eda0 🤖 backported "[Metabot] Prevent OSS SQL gen UI from showing in cloud migrated instances" (#70170)
[Metabot] Prevent OSS SQL gen UI from showing in cloud migrated instances (#69649)

prevent oss sql gen ui from showing for customsers with had set it up locally and migrated to cloud

Co-authored-by: Sloan Sparger <sloansparger@users.noreply.github.com>
2026-02-26 19:50:31 +00:00
github-automation-metabase
147758c45e 🤖 backported "Ring middleware for public sharing endpoints" (#70163)
Ring middleware for public sharing endpoints (#70153)

* Ring middleware for public sharing endpoints

* Refactor test

* move +public-sharing-enabled to address module lint

* Fix documents test

Co-authored-by: Noah Moss <32746338+noahmoss@users.noreply.github.com>
2026-02-26 19:12:18 +00:00
github-automation-metabase
4055a16376 🤖 backported "fix content translations break visualization settings" (#70155)
fix content translations break visualization settings (#70054)

* fix content translation produces unstable translated keys in viz settings

Co-authored-by: Aleksandr Lesnenko <alxnddr@users.noreply.github.com>
2026-02-26 19:07:29 +00:00
github-automation-metabase
7523bff623 🤖 backported "Filter transforms based on permissions GHY-3152" (#70151)
* Filter transforms based on permissions GHY-3152 (#70125)

Filter transforms based on permissions

We were leaking transforms in the :bad_transforms key

* Use underscore for old route.

---------

Co-authored-by: Eric Normand <ericwnormand@gmail.com>
2026-02-26 19:02:22 +00:00
Nemanja Glumac
dc7e3460dc Bump Cypress retries to two (#70157) (#70159) 2026-02-26 18:05:34 +01:00
github-automation-metabase
6b97999534 🤖 backported "Fix e2e dashboard-questions.cy.spec.js scrollTo flakes" (#70149) 2026-02-26 15:40:41 +00:00
github-automation-metabase
fa4d3b990c 🤖 backported "Move pulse preview endpoints to dev-only" (#70103)
Move pulse preview endpoints to dev-only (#70068)

Co-authored-by: Ngoc Khuat <qn.khuat@gmail.com>
2026-02-26 14:25:23 +00:00
Nemanja Glumac
661444c30c Upgrade Cypress to v15.10.0 (#69839) (#70146) 2026-02-26 14:00:57 +00:00
github-automation-metabase
0c6873e05d 🤖 backported "Pin patched libraries to the patched version" (#70145)
Pin patched libraries to their patched version (#70143)

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-02-26 13:04:04 +00:00
github-automation-metabase
cdc74c95be 🤖 backported "Update v59 sample Examples visualizations and dashboard." (#70142)
Update v59 sample Examples visualizations and dashboard. (#70075)

Adds Box Plot viz and a Scalar viz with conditional colors to the Example dashboard.
The resources/sample-content.edn was regenerated from the live instance content.

Co-authored-by: Katya Voropaieva <110612633+KorowkaMu@users.noreply.github.com>
2026-02-26 10:22:15 +00:00
github-automation-metabase
464e5bcfcf 🤖 backported "Remove deprecated unit test helpers" (#70134)
Remove deprecated unit test helpers (#69275)

* Replace createQueryWithClauses with createTestQuery

# Conflicts:
#	frontend/src/metabase-lib/test-helpers.ts
#	frontend/src/metabase/querying/filters/hooks/use-date-filter/use-date-filter.unit.spec.ts

* Remove unnused helpers

# Conflicts:
#	frontend/src/metabase-lib/test-helpers.ts

* WIP

* Export createMetadataProvider

* Use Lib.createTestHelper

* Remove createQuery helper usage

* Remove createQuery helper

* Remove unneeded getJoinQueryHelpers

* Fix test

* Remove DEFAULT_QUERY

* Move or remove unneeded test helpers

* Fix lint

* Allow auto binning in test spec

* Fix test

* Allow disamiguating column name by index

* Fix tests

* Fix imports

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
2026-02-26 03:19:18 +00:00
github-automation-metabase
767232316d 🤖 backported "Metakey helper" (#70131)
Metakey helper (#68987)

* Use H.metaKey where applicable

* Add helper for meta key options

* Fix import

* Update more instances

* Fix test

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
2026-02-26 02:17:18 +00:00
github-automation-metabase
fc52077358 🤖 backported "Always run Metabot-triggered refingerprinting in admin context to match sync behavior" (#70091)
Always run Metabot-triggered refingerprinting in admin context to match sync behavior (#70087)

* always run fingerprinting in admin perms context

* address comment

Co-authored-by: Noah Moss <32746338+noahmoss@users.noreply.github.com>
2026-02-25 16:01:00 -05:00
github-automation-metabase
c6ccf94430 🤖 backported "Fix OpenAPI 3.1.0 validation errors and add CI workflow" (#70026)
Fix OpenAPI 3.1.0 validation errors and add CI workflow (#69948)

Co-authored-by: bryan <bryan.maass@gmail.com>
2026-02-25 17:46:54 +00:00
github-automation-metabase
372e8a813f 🤖 backported "Updated Chromium to v144 in Cypress" (#70098) 2026-02-25 18:23:47 +01:00
github-automation-metabase
1546ca172c 🤖 backported "Only switch to full-width native preview at small breakpoint" (#70101)
Only switch to full-width native preview at small breakpoint (#70048)

* Only switch to full-width native preview at small breakpoint

* Add e2e test for metabase#67767

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
2026-02-25 10:02:58 +00:00
github-automation-metabase
8db1c2f989 🤖 backported "re-generate lock file to remove stale deps" (#70079)
re-generate lock file to remove stale deps (#70062)

* re-generate lock file to remove stale deps

* add sample apps to the deps for the package

Co-authored-by: Nicolò Pretto <info@npretto.com>
2026-02-24 18:45:50 +00:00
github-automation-metabase
15bb33df54 🤖 backported "Add diagnostic logging for duplicate alert investigation" (#70072)
Add diagnostic logging for duplicate alert investigation (#70020)

Co-authored-by: Ngoc Khuat <qn.khuat@gmail.com>
2026-02-24 17:52:45 +00:00
github-automation-metabase
7d2b7288b3 🤖 backported "Ensure we can resolve map lookups" (#70064)
Ensure we can resolve map lookups (#70060)

* feat: explicit handlebars context

* chore: unit tests

Co-authored-by: Nicola Mometto <nicola.mometto@metabase.com>
2026-02-24 14:26:00 +00:00
github-automation-metabase
c35516bc23 🤖 backported "emb-1300: use plugin for handleLink in eajs and fix double sdk plugin init" (#70058)
emb-1300: use plugin for handleLink in eajs and fix double sdk plugin init (#69961)

* emb-1300: use plugin for handleLink in eajs and fix double sdk plugin init

* typo and fix unit test

* restore old comment

Co-authored-by: Nicolò Pretto <info@npretto.com>
2026-02-24 08:57:24 +00:00
github-automation-metabase
eddcf754a2 🤖 backported "[QP] Move logging-only work inside the log/* call" (#70042)
[QP] Move logging-only work inside the `log/*` call (#68362)

Move some logging-only computations into the `(log/* ...)` call so it won't be executed
unless the log level is sufficiently verbose for the log to actually be output.

Co-authored-by: Braden Shepherdson <braden@metabase.com>
2026-02-23 22:05:58 +00:00
github-automation-metabase
8d5c0819f8 🤖 backported "Add tests for calculated display_name and fix nested name handling" (#70039)
Add tests for calculated display_name and fix nested name handling (#69982)

Closes QUE2-288

Co-authored-by: metamben <103100869+metamben@users.noreply.github.com>
2026-02-23 21:22:11 +00:00
github-automation-metabase
ae08dbd39e 🤖 backported "Add some better defaults & limits to agent API" (#70041)
Add some better defaults & limits to agent API (#70033)

Co-authored-by: Noah Moss <32746338+noahmoss@users.noreply.github.com>
2026-02-23 21:19:17 +00:00
github-automation-metabase
cab2fefc13 🤖 backported "Support all kinds of identity types on sqlserver" (#70037)
Support all kinds of identity types on sqlserver (#69871)

Closes QUE2-251

Co-authored-by: metamben <103100869+metamben@users.noreply.github.com>
2026-02-23 21:13:48 +00:00
github-automation-metabase
d82b20c155 🤖 backported "Fix flaky count-of-grouping-test for Redshift by using UTC timezone" (#70034)
Fix flaky count-of-grouping-test for Redshift by using UTC timezone (#67196)

Co-authored-by: bryan <bryan.maass@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-02-23 20:07:17 +00:00
github-automation-metabase
0d091a57f4 🤖 backported "docs - table variables and snippets" (#70027)
docs - table variables and snippets (#69983)

table variables and snippets

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-02-23 16:37:54 +00:00
github-automation-metabase
ece1a985c8 🤖 backported "Drop table created in a e2e test" (#70025)
Drop table created in a e2e test (#70023)

* drop table created in a e2e test

* fix

Co-authored-by: Alexander Polyankin <alexander.polyankin@metabase.com>
2026-02-23 16:00:39 +00:00
github-automation-metabase
e075dbc36b 🤖 backported "Write Connections for Actions, Model Persistence, Uploads" (#70022)
Write Connections for Actions, Model Persistence, Uploads (#69878)

Co-authored-by: Timothy S. Dean <timothy.dean@metabase.com>
2026-02-23 14:57:13 +00:00
github-automation-metabase
d5e3790258 🤖 backported "[match] Implement replace-lite and use it instead of replace" (#69985)
[match] Implement replace-lite and use it instead of replace (#69270)

Co-authored-by: Oleksandr Yakushev <alex@bytopia.org>
2026-02-21 00:09:25 +00:00
github-automation-metabase
af827b54bd 🤖 backported "Show Python upsell on self hosted" (#69989)
Show Python upsell on self hosted (#69759)

* Show Python upsell on self hosted

* Add e2e tests

* Fix unit test

* Simplify TransformsUpsellPage a bit more, fix tests

* Simplify logic

* Fix e2e and unit test

* Update self-hosted python upsell as per new design / Code clean up

* Fix unit test and also add a new one for useTransformsBilling

* Remove e2e tests to be moved to a new PR

* Fix cta link and bullet points icon alignment

Co-authored-by: Anderson <ands.alves.nunes@gmail.com>
2026-02-20 23:32:20 +00:00
github-automation-metabase
228b5c1c06 🤖 backported "Improve event creation remote-sync" (#69830)
Improve event creation remote-sync (#69768)

Co-authored-by: Nathan Voxland <nathan@metabase.com>
2026-02-20 22:41:04 +00:00
github-automation-metabase
7fb69f150c 🤖 backported "fix: better check for dirty collection state" (#69979)
* fix: better check for dirty collection state (#69974)

Our frontend code that prevents sending unchanged collections missed
tenant collections being added to the payload. This fixes both the
frontend to make sure we don't send when there are no changed
collections and it updates the backend actually check if collections are
being changed rather than just checking if the collections map exists.

* Update RemoteSyncSettingsForm.unit.spec.tsx

---------

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2026-02-20 21:32:27 +00:00
github-automation-metabase
b2a5d65f41 🤖 backported "fix(EmbedJS): Downloads fail on guest embedded questions" (#69977)
fix(EmbedJS): Downloads fail on guest embedded questions (#69972)

Co-authored-by: Timofey Kachalov <timofei@metabase.com>
2026-02-20 19:43:19 +00:00
github-automation-metabase
833b511fe6 🤖 backported "fix: transforms collections set setting on import" (#69973)
fix: transforms collections set setting on import (#69852)

* fix: transforms collections set setting on import

Also turns off the transforms sync setting if there are not transform
related models in the import

* fix: transform/snippet settings on collection sync

Updates our check for 'did transforms or snippets change on remote' to
examine collections in the respective namespaces so an import with only
transform collections (or snippet collection) creates the correct
settings on the importing instance.

* fixup! better handling for custom vs builtin tags

* fixup! better conflict checking of namespaced cols

* fixup! explicit connectionb for token cache

* fixup! PR feedback

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2026-02-20 17:27:46 +00:00
github-automation-metabase
0cdbfb034e 🤖 backported "feat(dashboard): move subscriptions to action menu" (#69959)
feat(dashboard): move subscriptions to action menu (#64950)

* feat(dashboard): move subscriptions to action menu

* fix unit tests

* fix e2e tests

* fix console warning about uncontrolled component

* fix more tests

* fix remaining test

* bring test back

Co-authored-by: Uladzimir Havenchyk <125459446+uladzimirdev@users.noreply.github.com>
2026-02-20 09:25:19 +00:00
github-automation-metabase
4988141085 🤖 backported "Transforms with params UI" (#69954)
Transforms with params UI (#69728)

* Validate transform queries can be preprocessed

* remove prn

* update backend error messages

* Add support for custom toggleTemplateTagEditor

* Allow passing setTemplateTagConfig to TagEditorParam

* Add support for storing parameter values when question changes

* Add template-tags tab

* Add template tag sidebar

* Allow saving optional template tags or tags with a default value

* Show error message on save

* Add new spec for transform template tags

* Avoid sharing state when navigating

* Add combination test for template tag types in transforms

* Add definitionTab helper

* Add test for multiple template tags

* Fix error message

* Fix tooltips in test

* Remove tooltip check in tests

* Use getErrorMessage to get error message in toast

* Only return message if it is not empty

* Wrap error message in form

* Use H.createTestNativeQuery helper

* Move variableTemplateTags and isVariableTemplateTag to Lib

* Use more conventional key to reset uistate

* update backend error messages again

* Revert "Wrap error message in form"

This is now handled in the api

This reverts commit 9efecaf261.

* Fix test

---------

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
Co-authored-by: William Zimrin <william@metabase.com>
2026-02-20 02:47:43 +00:00
github-automation-metabase
fefc22953a 🤖 backported "Remove Exit sidebar menu item now that app switcher exists" (#69950)
Remove Exit sidebar menu item now that app switcher exists (#69886)

Co-authored-by: Anderson <ands.alves.nunes@gmail.com>
2026-02-20 00:40:03 +00:00
dpsutton
6dce81c58c [59] Security fix (#69923)
* security fixes

* Use actions dataset

Symptom:
We started having tests failing

like:

```
expected: {:has_more_values false,
           :values [["African"] ["American"] ["Artisan"]]}
  actual: {:has_more_values false, :values (("American") ("Artisan") ("Asian"))}
    diff: - {:values [["African"] ["American"] ["Artisan"]]}
          + {:values [["American"] ["Artisan"] ["Asian"]]}
```

and

```
expected: {:has_more_values true,
           :values [["African"] ["American"] ["Artisan"] ["Asian"] ["BBQ"]]}
  actual: {:has_more_values true,
           :values (("American")
                    ("Artisan")
                    ("Asian")
                    ("BBQ")
                    ("European Shop"))}
    diff: - {:values [["African"] ["American"] ["Artisan"] ["Asian"] ["BBQ"]]}
          + {:values [["American"]
                      ["Artisan"]
                      ["Asian"]
                      ["BBQ"]
                      ["European Shop"]]}
```

Identify:
```
modified   src/metabase/actions/execution.clj
@@ -35,6 +35,10 @@
                                                               [:model_id      ::lib.schema.id/card]
                                                               [:dataset_query ::lib.schema/native-only-query]]
    request-parameters]
+  (let [db-name (-> ((requiring-resolve 'metabase.test/db)) :name)]
+    (when-not (.startsWith db-name "actions-test-data")
+      (println clojure.test/*testing-vars*)
+      #_(clojure.repl/pst (Exception. "how here?") 500)))
   (log/tracef "Executing action\n\n%s" (u/pprint-to-str action))
   (try
     (let [parameters (for [parameter (:parameters action)]
@@ -61,6 +65,10 @@
 (defn- execute-custom-action! [action request-parameters]
   (let [{action-type :type} action]
     (actions/check-actions-enabled! action)
+    (let [db-name (-> ((requiring-resolve 'metabase.test/db)) :name)]
+      (when-not (.startsWith db-name "actions-test-data")
+        (println clojure.test/*testing-vars*)
+        #_(clojure.repl/pst (Exception. "how here?") 500)))
     (let [model (t2/select-one :model/Card :id (:model_id action))]
       (when (and (= action-type :query) (not= (:database_id model) (:database_id action)))
         ;; the above check checks the db of the model. We check the db of the query action here
@@ -165,8 +173,14 @@
   (let [k (keyword (:kind action-instance))]
     (legacy->current k k)))

+(require 'clojure.repl)
+
 (defn- execute-implicit-action!
   [action request-parameters]
+  (let [db-name (-> ((requiring-resolve 'metabase.test/db)) :name)]
+    (when-not (.startsWith db-name "actions-test-data")
+      (println clojure.test/*testing-vars*)
+      #_(clojure.repl/pst (Exception. "how here?") 500)))
   (let [model-id        (:model_id action)
         implicit-action (parse-implicit-action action)
         {:keys [query row-parameters]} (build-implicit-query action implicit-action request-parameters)
```

I modified the action execution to print out test vars that weren't
using the correct dataset. A few need cross datasets to ensure can't run
on different dbs, and a few don't matter because they assert that
permissions fail or data is missing. But this
execute-action-permission-test didn't, and it's last branch asserts
"Admin can still execute actions" and that seems to have been the cause
of our troubles
2026-02-19 15:16:46 -08:00
github-automation-metabase
b0c138c240 🤖 backported "Use core.setFailed instead of throw for missing artifacts" (#69944)
Use `core.setFailed` instead of throw for missing artifacts (#69897)

When an artifact doesn't exist (expected for new commits), the
fetch-artifact action was using throw new Error() which causes
GitHub Actions to report "Unhandled error" - confusing and noisy.

Using core.setFailed() cleanly marks the step as failed without
the scary error message.

Fixes: DEV-1581

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-19 22:59:45 +00:00
github-automation-metabase
23bd845015 🤖 backported "Mention that the appdb schema must always be public" (#69938)
Mention that the appdb schema must always be public (#69905)

Co-authored-by: Rodrigo López Dato <rodrigo@metabase.com>
2026-02-19 22:01:52 +00:00
github-automation-metabase
1874ea4f44 🤖 backported "Add debug echo to driver-decisions CI step" (#69937)
Add debug echo to driver-decisions CI step (#69881)

Prints the mage command and args before execution so we can quickly
see what labels/flags were passed when debugging CI driver issues.

Closes: DEV-1577

Co-authored-by: bryan <bryan.maass@gmail.com>
2026-02-19 21:32:45 +00:00
github-automation-metabase
597d5bf7a5 🤖 backported "docs: Fix step numbering + add details on how to confirm if using H2" (#69940)
docs: Fix step numbering + add details on how to confirm if using H2 (#69581)

* Fix step numbering + add details on how to confirm if using H2

* fix anchor links

Co-authored-by: Rodrigo López Dato <rodrigo@metabase.com>
2026-02-19 21:22:07 +00:00
github-automation-metabase
fbebc5be68 🤖 backported "Remove unused HTTP action code paths" (#69929)
Remove unused HTTP action code paths (#69764)

* Remove dead code for actions

* Disable HTTP action type at API level

* clarify thrown exceptions

* Remove HTTP action tests

HTTP actions are now blocked at the API level; these tests cover
functionality that's no longer accessible.

* Remove remaining HTTP action references from api_test

The previous commit missed several HTTP action usages:
- all-actions-default helper function
- list-actions-test action-1 binding
- action-parameters-test (now uses query action)

Co-authored-by: bryan <bryan.maass@gmail.com>
2026-02-19 21:17:28 +00:00
github-automation-metabase
b55da30d87 🤖 backported "Update model index limit in docs" (#69935)
Update model index limit in docs (#69933)

Co-authored-by: Rodrigo López Dato <rodrigo@metabase.com>
2026-02-19 21:10:48 +00:00
github-automation-metabase
4d9d58db43 🤖 backported "More robust visualization settings normalization" (#69884)
More robust visualization settings normalization (#69860)

* More robust visualization settings normalization

* Remove stray `println`

Co-authored-by: Cam Saul <1455846+camsaul@users.noreply.github.com>
2026-02-19 19:15:33 +00:00
github-automation-metabase
6dcbc528c5 🤖 backported "Transforms with parameters" (#69916)
Transforms with parameters (#69592)

We want to support transforms with template tags, as long as those tags aren't required or have default values. However, if we do that, the backend should actually verify that we do in fact have values for all relevant template tags. This pr adds basic validation logic to transform creation and update routes -- essentially, we just run qp.preprocess/preprocess and see if we get an error.

Co-authored-by: William <william@metabase.com>
2026-02-19 18:52:33 +00:00
github-automation-metabase
5054950598 🤖 backported "Fix narrow symbol downloads with tests" (#69914)
Fix narrow symbol downloads with tests (#69811)

* Fix downloading currency values in narrowSymbol format (#69779)

* Add tests for narrowSymbol currency style in downloads

---------

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
Co-authored-by: Will Bryant <will.bryant@gmail.com>
2026-02-19 18:45:09 +00:00
github-automation-metabase
7d604e3260 🤖 backported "Move transform metering back into EE module" (#69911)
Move transform metering back into EE module (#69840)

* Move transform metering back into EE module

The defenterprise shadowing was not working as the metering function was
moved

* Add test of EE stats

Co-authored-by: Dan Stone <wotbrew@gmail.com>
2026-02-19 16:54:31 +00:00
github-automation-metabase
d323d90619 🤖 backported "Capitalize Jar -> JAR" (#69908)
Capitalize Jar -> JAR (#69900)

Co-authored-by: Rodrigo López Dato <rodrigo@metabase.com>
2026-02-19 14:28:53 +00:00
github-automation-metabase
97382820cc 🤖 backported "Introduce Copilot code review instructions" (#69894)
Introduce Copilot code review instructions (#69846)

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-02-19 10:17:22 +00:00
Jeff Bruemmer
3daf734ca8 docs - sql table variable (#69817) (#69877) 2026-02-18 20:05:59 -05:00
Timothy S. Dean
a4158267a3 Backported "Transforms DB Connection" (#69876)
Problem: When a database is configured for both SQL access and Transforms, any feature with SQL access (like raw SQL questions) inherits the elevated permissions (CREATE, DROP, INSERT, etc.) that Transforms need.

Solution: Admins can _optionally_ configure write credentials alongside existing read credentials. One logical database, two connection types. Specific code paths opt in to using write credentials; by default everything uses a read-only connection.

How: This PR adds a new `write_data_details` column on `Database`. If `write_data_details` isn't configured, everything will still use `details` as before. When it is configured, it acts as a set of overrides on top of `details`, but only in code paths that require write permissions. There should be no behavioral change for existing deployments.
2026-02-19 00:05:48 +00:00
github-automation-metabase
bfce9f07fc 🤖 backported "fix: log parameter not nil value" (#69869)
fix: log parameter not nil value (#68200)

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2026-02-18 21:18:29 +00:00
github-automation-metabase
f554c3dcbd 🤖 backported "Explain how DB routing and query caching work together" (#69862)
Explain how DB routing and query caching work together (#69855)

* Explain how DB routing and query caching work together

* Update docs/configuring-metabase/caching.md



---------

Co-authored-by: Rodrigo López Dato <rodrigo@metabase.com>
Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-02-18 19:40:43 +00:00
github-automation-metabase
0daacbe3ef 🤖 backported "Prevent expression editor from forcing literal types" (#69469)
Prevent expression editor from forcing literal types (#67647)

* Prevent expression editor from forcing literal types

Closes #63910

Co-authored-by: metamben <103100869+metamben@users.noreply.github.com>
Co-authored-by: Tamás Benkő <tamas@metabase.com>
2026-02-18 19:39:08 +00:00
github-automation-metabase
54a7743295 🤖 backported "Add missing multimethods for datetime-subtract" (#69584)
Add missing multimethods for datetime-subtract (#69324)

Closes QUE2-336

Co-authored-by: metamben <103100869+metamben@users.noreply.github.com>
2026-02-18 17:02:34 +00:00
github-automation-metabase
da0da43cff 🤖 backported "Clean up more unneeded dependency "resolutions"" (#69849)
Clean up more unneeded dependency "resolutions" (#69837)

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-02-18 16:57:43 +00:00
github-automation-metabase
ac58dfc377 🤖 backported "Split long running specs into smaller chunks" (#69850)
Split long running e2e specs into smaller chunks (#69844)

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-02-18 16:46:30 +00:00
github-automation-metabase
3d38eb0e6d 🤖 backported "Add &parents to match-lite and rewrite remaining match/match-one usages" (#69845)
Add &parents to match-lite and rewrite remaining match/match-one usages (#69259)

Co-authored-by: Oleksandr Yakushev <alex@bytopia.org>
2026-02-18 13:57:10 +00:00
github-automation-metabase
f264073d45 🤖 backported "Fix unreferenced dependency flakes" (#69835)
Fix unreferenced dependency flakes (#69535)

* Scroll item into view

* Fix sidebar test

* Wait for page to be visible

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
2026-02-18 04:00:56 +00:00
github-automation-metabase
8a2015b706 🤖 backported "Dashboard category filter not correctly populated when using multiple datasources in one graph" (#69660)
Dashboard category filter not correctly populated when using multiple datasources in one graph (#69318)

* Add repro e2e test

* Dashboard filter values when connected to card with multiple datasets

* Fix kondo

Co-authored-by: Denis Berezin <denis.berezin@metabase.com>
2026-02-17 23:48:54 +00:00
github-automation-metabase
282b2716f3 🤖 backported "Merge remaining match -> match-many rewrites" (#69826)
Merge remaining match -> match-many rewrites (#69686)

* [match] Implement match-many as a replacement for match

* [match] Add proper docs to match-lite and match-many

Co-authored-by: Oleksandr Yakushev <alex@bytopia.org>
2026-02-17 23:23:22 +00:00
github-automation-metabase
2146389c42 🤖 backported "fix: cancelling remote sync tasks dismisses modal" (#69819)
fix: cancelling remote sync tasks dismisses modal (#67613)

* fix: cancelling remote sync tasks dismisses modal

Previously we didn't close this modal until the task reached a
'cancelled' state which could take several seconds.

* fixup! PR feedback

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2026-02-17 21:50:19 +00:00
github-automation-metabase
95fa7a1a73 🤖 backported "visualizer trend lines and bug fixes" (#69818)
Visualizer trend lines and bug fixes: colors, settings, legends, axes (#69296)

Co-authored-by: Kevin Kelleher <kevin.kelleher@metabase.com>
2026-02-17 21:46:29 +00:00
github-automation-metabase
b51f006452 🤖 backported "split large data model shared spec cypress file" (#69816)
split large data model shared spec cypress file (#69744)

* split large data model shared spec cypress file

* split 2nd group further, rename files

Co-authored-by: Jakub Chodorowicz <jakub.chodorowicz@metabase.com>
2026-02-17 20:29:58 +00:00
github-automation-metabase
8dc228464e 🤖 backported "fix: allow uploads when schema is unrestricted" (#69813)
fix: allow uploads when schema is unrestricted (#69657)

* fix: allow uploads when schema is unrestricted

* fixup! add upload enabled flag

* Update impl.clj

* fixup! where upload flag is set

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2026-02-17 20:15:58 +00:00
github-automation-metabase
eb9b78f290 🤖 backported "Docs v59: Nav UI update -- Grid icon and Admin rename" (#69812)
Docs v59: Nav UI update -- Grid icon and Admin rename (#69803)

* Update gear icon

* Update docs/data-modeling/json-unfolding.md



* Update docs/data-modeling/json-unfolding.md



* Update docs/embedding/sdk/quickstart-with-sample-app.md



* Update docs/embedding/sdk/quickstart.md



* Update docs/embedding/full-app-embedding-quick-start-guide.md



* Update docs/embedding/full-app-embedding-quick-start-guide.md



* Update docs/people-and-groups/user-provisioning.md



* Update docs/permissions/application.md



* Update docs/permissions/data.md



* Update docs/util/resources/introduction.md



* Update docs/usage-and-performance-tools/audit.md



* Apply suggestion from @jeff-bruemmer



* Update docs/embedding/public-links.md



* Update docs/embedding/public-links.md



* Update docs/people-and-groups/api-keys.md



* Update docs/people-and-groups/api-keys.md



* Update docs/people-and-groups/api-keys.md



* Remove few "ons"

---------

Co-authored-by: Abed Habli <154609371+abdhabli@users.noreply.github.com>
Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-02-17 19:22:55 +00:00
github-automation-metabase
e846028b56 🤖 backported "Un-publishing remote-sync'ed library tables should remove them from the git repo" (#69805)
Un-publishing remote-sync'ed library tables should remove them from the git repo (#69757)

Co-authored-by: Nathan Voxland <nathan@metabase.com>
2026-02-17 16:41:33 +00:00
github-automation-metabase
edb50a8978 🤖 backported "Docs: Add screenshots to Data Studio docs" (#69806)
Docs: Add screenshots to Data Studio docs (#69634)

* Add screenshots to Data Studio docs

* Optimized 8 images, saved 757.5 KB (38.2% smaller)

* Update docs/data-studio/data-structure.md



* Delete docs/data-studio/images/sync-settings.png

---------

Co-authored-by: Abed Habli <154609371+abdhabli@users.noreply.github.com>
Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-02-17 16:04:39 +00:00
github-automation-metabase
011804996f 🤖 backported "docs - one-shot sql gen" (#69802)
docs - one-shot sql gen (#69766)

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-02-17 15:38:36 +00:00
github-automation-metabase
ef80de5aea 🤖 backported "GDGT-1781 Fix flaky "should check out transform into a new workspace from the transform page" e2e test" (#69792) 2026-02-17 14:41:47 +00:00
github-automation-metabase
b2bdf3f507 🤖 backported "docs - embedding native question" (#69793)
resolve conflicts

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-02-17 14:31:30 +00:00
github-automation-metabase
cbf737d4c9 🤖 backported "chore: cleanup moment leftovers" (#69796)
chore: cleanup moment leftovers (#69733)

Co-authored-by: Uladzimir Havenchyk <125459446+uladzimirdev@users.noreply.github.com>
2026-02-17 14:16:25 +00:00
github-automation-metabase
b4b59d007c 🤖 backported "Remove set-value and unset-value from "resolutions"" (#69791)
Remove `set-value` and `unset-value` from "resolutions" (#69787)

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-02-17 13:55:42 +00:00
github-automation-metabase
9077aa0339 🤖 backported "Fix flaky view-and-curate-content.cy.spec.ts" (#69785)
Fix flaky view-and-curate-content.cy.spec.ts (#69749)

Fix flaky test

Co-authored-by: Mahatthana (Kelvin) Nomsawadi <me@bboykelvin.dev>
2026-02-17 10:18:12 +00:00
github-automation-metabase
757dd4c753 🤖 backported "Map Snowflake big integers to :type/BigInteger " (#69775)
Map Snowflake big integers to :type/BigInteger  (#67609)

* Map Snowflake big integers to :type/BigInteger (fix #63600)

* Test fixes 🔧

* Test fixes 🔧

* Test fix 🔧

* More test fixes 🔧

* Another round of test fixes 🔧

* (Hopefully) final test fix 🔧

* Code cleanup

* Revert changes that broke Clickhouse test

* Test fix 🔧

Co-authored-by: Cam Saul <1455846+camsaul@users.noreply.github.com>
2026-02-17 01:48:45 +00:00
github-automation-metabase
a9a3842387 🤖 backported "Fix navigate_to not doing anything in full-app embedding" (#69771)
Fix navigate_to not doing anything in full-app embedding (#69761)

Co-authored-by: Rodrigo López Dato <rodrigo@metabase.com>
2026-02-17 00:29:41 +00:00
github-automation-metabase
cc3e316480 🤖 backported "Fix missing availableHeight on model native editor" (#69769)
Fix missing availableHeight on model native editor (#69723)

* Fix missing availableHeight on model native editor

* Add repro for metabase#69722

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
2026-02-17 00:14:46 +00:00
github-automation-metabase
83560992dd 🤖 backported "Default viz behavior fixes" (#69767)
Default viz behavior fixes (#69664)

Co-authored-by: Kevin Kelleher <kevin.kelleher@metabase.com>
2026-02-16 23:31:07 +00:00
github-automation-metabase
6022b770ad 🤖 backported "Gdgt 1774 incremental update field not displaying in transforms" (#69765)
Gdgt 1774 incremental update field not displaying in transforms (#69740)

* GDGT-1774 fetch metadata to enable field picking in incremental transform settings

* GDGT-1774 add e2e reproduction

Co-authored-by: Egor Grushin <egor@metabase.com>
2026-02-16 23:02:21 +00:00
github-automation-metabase
1e72b533fc 🤖 backported "Include the relevant step outcome in Trunk inputs" (#69550)
Include the relevant step outcome in Trunk inputs (#68947)

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-02-16 22:34:24 +00:00
github-automation-metabase
eaaf784cb0 🤖 backported "Fix more measure unit tests" (#69725)
Fix more measure unit tests (#69596)

* Rewrite test to use Lib.createTestQuery

* Force OpaqueDatasetQuery to be used

* Break cyclic imports
# Conflicts:
#	frontend/src/metabase/querying/expressions/test/shared.ts

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
2026-02-16 22:45:59 +01:00
github-automation-metabase
bd208d624f 🤖 backported "record group membership removals in activity log" (#69624)
record group membership removals in activity log (#69316)

* record group membership removals in activity log

Previously the `PUT /api/membership/:group-id/clear` and
`DELETE /api/membership/:id` endpoints did not emit group membership
deletion events.

In the long run it would be better if `t2` were the interface for
PermissionsGroupMembership, so users didn't need to call these "blessed"
functions. But for now, let's go along with the existing pattern here,
have some blessed functions for doing things, and throw exceptions if
someone does a direct `t2/delete!` on a `:model/PermissionsGroupMembership`.

* use macro for more obvious workaround

Co-authored-by: John Swanson <john.swanson@metabase.com>
2026-02-16 21:38:30 +00:00
github-automation-metabase
cec7ea3baf 🤖 backported "Add tracking events for when Dependency Graph is opened for an entity" (#69756)
Add tracking events for when Dependency Graph is opened for an entity (#69604)

* Add events for transform run tags and dependency diagnostics row selection

* Fix e2e test

* Adjust event as per review / Fix e2e tests

* Add tracking events for when Dependency Graph is opened for an entity

* Add remaining e2e tests

* Update simple_event/jsonschema/1-0-0

Co-authored-by: Anderson <ands.alves.nunes@gmail.com>
2026-02-16 19:51:13 +00:00
github-automation-metabase
9ec22c88bd 🤖 backported "feat: add @ mention to metabot placeholders" (#69745)
feat: add @ mention to metabot placeholders (#69374)

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-02-16 17:04:39 +00:00
github-automation-metabase
fb878ec345 🤖 backported "fix: double new lines are not pasted correctly into metabot prompt input" (#69746)
fix: double new lines are not pasted correctly into metabot prompt input (#69493)

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-02-16 16:52:29 +00:00
Aleksandr Lesnenko
4f30e7085f Backport boxplot (#69684)
* Add boxplot visualization (#68104)

* add boxplot visualization type

* Add boxplot viz type visual tests (#68327)

boxplot visual tests

* rework chart selection ui (#69289)
2026-02-16 10:37:59 -05:00
github-automation-metabase
b475aa0a32 🤖 backported "docs - box plot" (#69738)
docs - box plot (#69689)

* box plot docs

* Optimized 3 images, saved 221.8 KB (44.8% smaller)

* Apply suggestion from @jeff-bruemmer

---------

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-02-16 13:26:57 +00:00
github-automation-metabase
c75fec8181 🤖 backported "[match] Implement match-many as a replacement for match" (#69679)
[match] Implement match-many as a replacement for match (#68659)

[match-lite] Add support for &match anaphor and better nil handling

Co-authored-by: Oleksandr Yakushev <alex@bytopia.org>
2026-02-15 16:07:55 +00:00
github-automation-metabase
36b6a52d5d 🤖 backported "Restore 60 minute timeout for BigQuery and Snowflake" (#69688)
Restore 60 minute timeout for BigQuery and Snowflake (#69687)

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-02-15 14:02:12 +00:00
github-automation-metabase
c8ba8fc32b 🤖 backported "Fix Circular Dependency in useGetPlan" (#69680)
Fix Circular Dependency in useGetPlan (#69672)

fix circular dependency

Co-authored-by: Ryan Laurie <30528226+iethree@users.noreply.github.com>
2026-02-14 20:31:41 +00:00
github-automation-metabase
c6272a3660 🤖 backported "Reduce the CI test timeout to 40 minutes" (#69678)
Reduce the CI test timeout to 40 minutes (#69625)

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-02-14 13:18:33 +00:00
github-automation-metabase
5c06ebb9fe 🤖 backported "Add tracking events for transform run tags update and dependency diagnostics row selection" (#69676)
Add tracking events for transform run tags update and dependency diagnostics row selection (#69531)

* Add events for transform run tags and dependency diagnostics row selection

* Fix e2e test

* Adjust event as per review / Fix e2e tests

Co-authored-by: Anderson <ands.alves.nunes@gmail.com>
2026-02-14 00:16:56 +00:00
github-automation-metabase
f6d8d25f9f 🤖 backported "Fix docs link on incremental transforms section" (#69668)
Fix docs link on incremental transforms section (#69648)

Co-authored-by: Anderson <ands.alves.nunes@gmail.com>
2026-02-13 23:45:32 +00:00
github-automation-metabase
b299e3857a 🤖 backported "Prevent editing snippets from question editor when remote sync is read-only" (#69671)
Prevent editing snippets from question editor when remote sync is read-only (#69147)

* Prevent snippets to be edited from question editor when remote sync is read-only

* Fix test

Co-authored-by: Anderson <ands.alves.nunes@gmail.com>
2026-02-13 23:41:58 +00:00
github-automation-metabase
0e129fc422 🤖 backported "Python library upsell" (#69674)
Python library upsell (#69600)

* Temp

* Separate EE and OSS transforms upsell logic

* Remove upsell

Co-authored-by: Denis Berezin <denis.berezin@metabase.com>
2026-02-13 23:32:21 +00:00
github-automation-metabase
0dbda96523 🤖 backported "fixes for email clients in dark mode" (#69670)
Fixes for email clients in dark mode (#69023)

Co-authored-by: Kevin Kelleher <kevin.kelleher@metabase.com>
2026-02-13 22:44:50 +00:00
github-automation-metabase
9c0e313a95 🤖 backported "Dont show hosting upsell to pro self hosted users" (#69654)
Dont show hosting upsell to pro self hosted users (#69522)

dont show hosting upsell to pro self hosted users

Co-authored-by: Ryan Laurie <30528226+iethree@users.noreply.github.com>
2026-02-13 20:55:59 +00:00
github-automation-metabase
c70e79458d 🤖 backported "Remove forced jsdom resolution" (#69652)
Remove forced jsdom resolution (#69575)

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-02-13 19:53:52 +00:00
github-automation-metabase
f84190cca2 🤖 backported "docs - agent API" (#69651)
docs - agent API (#69647)

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-02-13 19:02:15 +00:00
github-automation-metabase
cd795ee427 🤖 backported "Remove Claude review workflows" (#69638)
Remove Claude review workflows (#69632)

[ci skip]

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-02-13 19:20:17 +01:00
github-automation-metabase
3e6ead3d9f 🤖 backported "Fixes isSticky class not being properly applied to dashboard parameters" (#69639)
Fixes isSticky class not being properly applied to dashboard parameters (#69623)

Co-authored-by: Sébastien <sebastien@metabase.com>
2026-02-13 18:10:09 +00:00
github-automation-metabase
b55ff59a61 🤖 backported "Revert "Do a rollback before discard all (#69026)"" (#69640)
Revert "Do a rollback before discard all (#69026)" (#69633)

This reverts commit 42d0d35dbd.

Co-authored-by: Nathan Voxland <nathan@metabase.com>
2026-02-13 17:51:39 +00:00
github-automation-metabase
daa8770eb6 🤖 backported "Improve remote sync errors with missing objects" (#69636)
Improve remote sync errors with missing objects (#69591)

Co-authored-by: Nathan Voxland <nathan@metabase.com>
2026-02-13 16:58:14 +00:00
github-automation-metabase
77166ce155 🤖 backported "Audit DB should exclude databasechangeloglock" (#69586)
Audit DB should exclude databasechangeloglock (#69487)

auditdb should exclude databasechangeloglock as well

Co-authored-by: Nathan Voxland <nathan@metabase.com>
2026-02-13 16:27:54 +00:00
github-automation-metabase
86287229e3 🤖 backported "Remove LIMIT in query builder transforms" (#69557)
Remove LIMIT in query builder transforms (#69347)

* feat(python-transforms): massage query

* feat(transforms-util): disable-max-results

* feat(QP): respect disable-max-results

* feat(transforms/ui): set disable-max-results

* add tests

* export function in lib

* use disableMaxResults

* more tests

* add e2e test

* 0 max rows is no limit

* fix test

* comment

* address review comments

* Remove trailing newline

Co-authored-by: Nicola Mometto <nicola.mometto@metabase.com>
2026-02-13 15:13:53 +00:00
github-automation-metabase
f2e78bf393 🤖 backported "docs - remove auth" (#69628)
docs - remove auth (#69594)

remove auth

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-02-13 14:39:20 +00:00
github-automation-metabase
b8accb84be 🤖 backported "GDGT-1761 Remove Grid component" (#69621)
GDGT-1761 Remove Grid component (#69351)

Co-authored-by: Kamil Mielnik <kamil@kamilmielnik.com>
2026-02-13 12:18:21 +00:00
github-automation-metabase
0a4e1319c9 🤖 backported "Fix ci-test-config driver quarantine name translation" (#69616)
Fix ci-test-config driver quarantine name translation (#69615)

The ci-test-config.json uses driver directory names (e.g., "bigquery-cloud-sdk")
but the mage code uses internal driver keywords (e.g., :bigquery). This mismatch
meant quarantined drivers like bigquery were not being recognized.

Now uses the existing driver-directory->drivers mapping to translate config names
to internal keywords, with fallback to direct keyword conversion for names that
match (like "databricks").

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-13 10:37:27 +00:00
github-automation-metabase
8a7bf5f10c 🤖 backported "Correct the modular embedding preview usage count" (#69613)
Correct the modular embedding preview usage count (#69473)

* Correct the modular embedding preview count as :internal

* Add tests

* Fix the modular embedding preview count while not breaking alerts emails

* Fix E2E tests

* Fix wrong e2e syntax

Co-authored-by: Mahatthana (Kelvin) Nomsawadi <me@bboykelvin.dev>
2026-02-13 10:25:05 +00:00
github-automation-metabase
1546653de8 🤖 backported "Native query test helper" (#69607)
Native query test helper (#69402)

* Add schema for test-native-query-spec

* Implement test-native-query helper

* Add js wrapper for test-native-query

* Add ts wrapper for test-native-query

* Make common parts optional

* Fix types

* Fix temporal-unit test spec

* Handle snippet tags

* Fix temporal-unit tags

* Fix card tag spec

* Simplify schema

* Add unit tests for createNativeQuery

* Add tests for test-native-query

* Add missing options

* Fix types

* Actually resolve field ref

* Code style

* Add native-query api endpoint

* Add h.createTestNativeQuery helper

* Add test for required, widget-type and default options

* Move parsing into test-spec module as it is part of the implementation

* Add example e2e test use of H.createTestNativeQuery

* Use coercer instead of decoder to validate spec too

* Fix lint

* Move adjust to update-vals



* Match threading style

* Add test for optional template tagsfg

---------

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
Co-authored-by: Braden Shepherdson <braden@metabase.com>
2026-02-13 03:44:03 +00:00
github-automation-metabase
af89fc2cbb 🤖 backported "When instance is not on trial, still allow them to start Transforms trial if available" (#69605)
When instance is not on trial, still allow them to start Transforms trial if available (#69499)

* show both transforms tiers even when on trial

* Show upgrade modal in place when clicking Upgrade to Pro

* Improve comments

* Show upsell transforms trial variant when available for instance not on trial

* Fix ts

* Say 'Start trial' when trial is available

Co-authored-by: Anderson <ands.alves.nunes@gmail.com>
2026-02-13 01:54:39 +00:00
github-automation-metabase
2dac4b0cca 🤖 backported "Move test helper parser to lib" (#69602)
Move test helper parser to lib (#69405)

* Use correct type for order-bys

* Move parser for test-query-spec into implementation

* Be more strict in test

* Convert another e2e test to prove the parsing works

* Make args optional in test-query-spec

* Use threading instead of partial



---------

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
Co-authored-by: Braden Shepherdson <braden@metabase.com>
2026-02-12 23:56:27 +00:00
github-automation-metabase
6dfb951270 🤖 backported "Don't attempt to add revisions for viewing docs" (#69501)
Don't attempt to add revisions for viewing docs (#69305)

Luckily a bug saved us from *actually* creating revisions here (the
`before-update` hook doesn't get an actual instance in this case). But
... we shouldn't be attempting it.

Co-authored-by: John Swanson <john.swanson@metabase.com>
2026-02-12 23:45:42 +00:00
github-automation-metabase
d2121e6a89 🤖 backported "Do not allow publishing tables without query perms" (#69390)
Do not allow publishing tables without query perms (#69171)

* Do not allow publishing tables without query perms

Publishing a table changes query permissions. So you shouldn't be able
to publish a table that you don't have query permissions on, and then be
able to query it.

* fns for `can-publish?`, `can-publish-all-table?`

* switch to `library` ff

Co-authored-by: John Swanson <john.swanson@metabase.com>
2026-02-12 23:37:23 +00:00
github-automation-metabase
a364dc5f23 🤖 backported "Correct function for fetching field values in Metabot tools" (#69598)
Correct function for fetching field values in Metabot tools (#69589)

* switch function for metabot fetching field values

* refactor tests

* fix lint

* fix tests - keep existing behavior of auto-creating field values if needed

Co-authored-by: Noah Moss <32746338+noahmoss@users.noreply.github.com>
2026-02-12 22:50:23 +00:00
github-automation-metabase
537658187b 🤖 backported "Move app switcher into Dependency Graph" (#69599)
Move app switcher into Dependency Graph (#69128)

* move app switcher into Dependency Graph

* adjusting unit test

* remove z-index nonsense

* moving the app switcher up to DependencyGraphPage, small change to SelectItem

Co-authored-by: Nick Fitzpatrick <nick@metabase.com>
2026-02-12 22:41:23 +00:00
github-automation-metabase
a4d68c8bea 🤖 backported "Move agent api reference out of docs/" (#69595)
Move agent api reference out of docs/ (#69567)

move agent api reference

Co-authored-by: Noah Moss <32746338+noahmoss@users.noreply.github.com>
2026-02-12 22:23:35 +00:00
github-automation-metabase
56a826dec5 🤖 backported "Fix 'Upgrade to Pro' button to open upgrade modal / Show two transforms tier options when on trial" (#69588)
Fix 'Upgrade to Pro' button to open upgrade modal / Show two transforms tier options when on trial (#69387)

* show both transforms tiers even when on trial

* Show upgrade modal in place when clicking Upgrade to Pro

* Improve comments

Co-authored-by: Anderson <ands.alves.nunes@gmail.com>
2026-02-12 20:45:51 +00:00
github-automation-metabase
b9f259644d 🤖 backported "fix: mention popup doesn't close when clicking esc" (#69580)
fix: mention popup doesn't close when clicking esc (#69485)

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-02-12 18:35:28 +00:00
github-automation-metabase
5858af497a docs(sdk): Update SDK version to 0.59.0-beta.0 (#69576)
docs(sdk): Update Readme version references and published npm version to 0.59.0-beta.0
2026-02-12 17:25:02 +00:00
github-automation-metabase
18cc00fe72 🤖 backported "Update translations 2026-02-10" (#69569)
Update translations 2026-02-10 (#69372)

* Update translation sources 2026-02-10

* Update translations

* update localization e2e test

* Wochentag

---------

Co-authored-by: github-actions <github-actions@github.com>
Co-authored-by: Nick Fitzpatrick <nickfitz.582@gmail.com>
2026-02-12 15:22:37 +00:00
github-automation-metabase
04af052de7 🤖 backported "Update Jest snapshot headers for Jest v30 compatibility" (#69568)
Update Jest snapshot headers for Jest v30 compatibility (#69564)

Jest v30 validates that snapshot files have the current documentation URL.
Updated the header from the old shortened URL to the new official URL.

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 15:45:57 +01:00
github-automation-metabase
3c39bf6d37 🤖 backported "GDGT-1776 Query Builder transform fails at join stage" (#69560)
GDGT-1776 Query Builder transform fails at join stage (#69552)

* Fix virtualized list items rendering

* Add a repro for GDGT-1776

* Fix GDGT-1776

* Remove isHidden prop from MiniPickerItem and instead just do not render items that should be hidden

* Clean up

* Fix var access

Co-authored-by: Kamil Mielnik <kamil@kamilmielnik.com>
2026-02-12 13:49:43 +00:00
github-automation-metabase
5db812d1cb 🤖 backported "Add loading state to pull changes" (#69479)
Add loading state to pull changes (#69380)

adding unit test

Co-authored-by: Nick Fitzpatrick <nick@metabase.com>
2026-02-12 12:43:15 +00:00
github-automation-metabase
0926af717f 🤖 backported "Upgrade Jest to v30" (#69553)
Upgrade Jest to v30 (#69490)

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-02-12 12:13:29 +00:00
github-automation-metabase
e09d77de1b 🤖 backported "Fix the release-log workflow" (#69548)
Fix the release-log workflow (#69547)

Use prepare-release-scripts action in release-log workflow

Simplify the workflow by using the shared action instead of
manually setting up bun and building release scripts.

This works because the workflow always checks out master,
so the action from master (which uses bun) is always used.

Fixes: DEV-1544

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 10:52:46 +00:00
github-automation-metabase
95d41fa1e4 🤖 backported "Make ci-report work without GNU timeout" (#69543)
Make `ci-report` work without GNU `timeout` (#69453)

* Make ci-report work without GNU timeout

* Destroy process on timeout

* Cherry-pick b9ff360230

---------

Co-authored-by: lbrdnk <lbrdnk@users.noreply.github.com>
Co-authored-by: Bryan Maass <bryan.maass@gmail.com>
2026-02-12 08:32:04 +00:00
github-automation-metabase
e76dc1381d 🤖 backported "Fix flaky embedding sdk backward compatibility test" (#69542)
Fix flaky embedding sdk backward compatibility test (#69540)

* fixed e2e test

* .

Co-authored-by: Sébastien <sebastien@metabase.com>
2026-02-12 08:21:43 +00:00
Sébastien
05bb6a7e37 commented out embedding in CODEOWNERS (#69541) 2026-02-12 08:32:19 +01:00
github-automation-metabase
78279acba1 🤖 backported "Fix broken measure unit tests" (#69534)
Fix broken measure unit tests (#69515)

* Allow passing measures to entities schema

* Fix measures test

* Use toJsQuery

Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
2026-02-12 03:16:17 +00:00
github-automation-metabase
7a15bb58c4 🤖 backported "Add table template tags" (#69524)
Add table template tags (#68922)

Co-authored-by: William <william@metabase.com>
Co-authored-by: Romeo Van Snick <romeo@romeovansnick.be>
Co-authored-by: Alexander Polyankin <alexander.polyankin@metabase.com>
2026-02-12 00:53:13 +00:00
github-automation-metabase
61eaab6364 🤖 backported "Update Upsell to match design" (#69520)
Update Upsell to match design (#69488)

* Update Upsell to match design

* Remove loader for trial message

Co-authored-by: Denis Berezin <denis.berezin@metabase.com>
2026-02-12 00:00:05 +00:00
github-automation-metabase
045d6c2593 🤖 backported "Pin bun version in workflows" (#69521)
Pin bun version in workflows (#69514)

Co-authored-by: Fraser <fraser@metabase.com>
2026-02-11 23:45:26 +00:00
github-automation-metabase
d1cf03ccb1 🤖 backported "Show confirmation popup when overwriting data during remote sync setup" (#69401)
Show confirmation popup when overwriting data during remote sync setup (#68525)

* Report conflicts on transforms/snippets/lib

[UXW-2743: Warn before remote sync overwrites local library/transforms](https://linear.app/metabase/issue/UXW-2743/warn-before-remote-sync-overwrites-local-librarytransforms)



* fixup! store conflicts in remote-sync-task table

* fixup! make conflict checking spec driven

* Restore initial implementation (implement conflict modal when pulling for the first time)

* Fix modal not opening when in data studio

* Don't set version in task when it fails with conflict / Adjust conflict options / Start e2e tests

* Add e2e tests

* Add some unit tests

* Fix remote sync settings update when creating new branch

* Isolate git config for initial import conflict test cases

* Report conflicts on transforms/snippets/lib

[UXW-2743: Warn before remote sync overwrites local library/transforms](https://linear.app/metabase/issue/UXW-2743/warn-before-remote-sync-overwrites-local-librarytransforms)



* fixup! store conflicts in remote-sync-task table

* fixup! make conflict checking spec driven

* fixup! tests failures

* fixup! lints

* fixup! exclude tags from conflict

* Fix unintended changes from merge in RemoteSyncSettingsForm.tsx

* Address PR comments

---------

Co-authored-by: Anderson <ands.alves.nunes@gmail.com>
Co-authored-by: John Swanson <john.swanson@metabase.com>
Co-authored-by: Edward Paget <ed.paget@gmail.com>
2026-02-11 23:14:48 +00:00
github-automation-metabase
41e1c4c996 🤖 backported "Add entity id and entity type to the dependency calculation error" (#69516)
Add entity id and entity type to the dependency calculation error (#69001)

* Initial commit

* Fix tests

* Fix events test

Co-authored-by: da <paoliniluis@gmail.com>
2026-02-11 22:45:31 +00:00
github-automation-metabase
567114fabe 🤖 backported "Implement DB-level caching of premium features" (#69509)
Implement DB-level caching of premium features (#69241)

Premium feature token checks are cached per-instance in memory with a 12h TTL. During rolling deploys after a plan upgrade, different instances can disagree about which features are available:

   1. Request hits instance A (old cache) → reports old features
   2. Request hits instance B (freshly started, no cache) → reports new features
   3. Frontend says "upgrade successful!"
   4. Request hits instance A again → old features are back

This flapping means the frontend can't reliably detect when an upgrade has landed.

## Solution

### DB-hash-aware cross-instance cache

Replace the per-instance in-memory TTL cache with a two-layer caching scheme coordinated through the DB:

 - A **local in-memory cache** holds the full token status (features, validity, etc.)
 - A **DB table** (`premium_features_token_cache`) stores only a SHA-256 hash of the token status, keyed by a hash of the token itself. The DB never stores actual features — just enough to coordinate freshness across instances.

When a token check comes in:
- If the local cache matches the DB hash and is < 12h old: serve it immediately
- If it matches the DB hash and is < 36h old: serve the stale data and refresh asynchronously in the background
- If the DB hash doesn't match (another instance refreshed), or the cache is > 36h old, or this is a cold start: synchronous MetaStore fetch

This ensures all instances converge quickly after a plan change while keeping MetaStore traffic low. Cold-starting instances always hit the MetaStore — there's no way to bootstrap features from the DB alone, since it only stores hashes.

### Checker stack (inner to outer)

1. **`store-and-airgap-token-checker`** — hits MetaStore or validates airgap token
2. **`circuit-breaker-token-checker`** — circuit breaking + timeout
3. **`db-hash-aware-token-checker`** — the core caching layer (described above)
4. **`local-cached-token-checker`** — 5s TTL memoization to avoid hitting the DB on every request
5. **`error-catching-token-checker`** — wraps exceptions into `{:valid false}` responses

The 5s local cache means we hit the DB at most once every 5s, even during the grace period.

### Force-refresh endpoint

`POST /api/premium-features/token/refresh` clears all caches and synchronously re-checks against the MetaStore. The frontend uses this when polling for new features after a purchase (`useTokenRefreshUntil` in `UpgradeModalLoading`, `MetabotSettingUpModal`, `TransformsSettingUpModal`). A cookie-based mechanism propagates the invalidation to other instances so they clear their local caches on the next request.

Co-authored-by: John Swanson <john.swanson@metabase.com>
2026-02-11 21:45:10 +00:00
github-automation-metabase
d2b60fa790 🤖 backported "fix: Snyk workflow using wrong working directory for release/yarn.lock" (#69512)
fix: Snyk workflow using wrong working directory for release/yarn.lock (#69510)

The previous fix ran `cd release && bun install --yarn` which changed the
working directory for subsequent commands. The sed command then tried to
access `release/yarn.lock` from within the `release/` directory, resulting
in "sed: can't read release/yarn.lock: No such file or directory".

Split into separate steps with explicit working-directory for clarity.
The sed commands now continue on error to let Snyk report parsing issues
directly rather than failing on the workaround.

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-11 21:37:05 +00:00
github-automation-metabase
28724aaf95 🤖 backported "feat: add a stable sort for card parameters serdes" (#69505)
feat: add a stable sort for card parameters serdes (#69478)

Sorts parameters by their uuid to ensure that we maintain an order for
parameters across exports no matter the order they are serialized to the
database in.

Co-authored-by: Edward Paget <edpaget@users.noreply.github.com>
2026-02-11 21:13:05 +00:00
github-automation-metabase
9b3ed0630d 🤖 backported "fix: Snyk scan failing after bun migration" (#69508)
fix: Snyk scan failing after bun migration (#69498)

Root Cause:
Bun's `bun install --yarn` command has a bug where it normalizes version
ranges inconsistently in the generated yarn.lock:

- Alias entries normalize ranges: "safer-buffer@>= 2.1.2 < 3"
  (converts "< 3.0.0" to "< 3")
- Dependency specs keep original: safer-buffer ">= 2.1.2 < 3.0.0"
  (preserves the ".0.0")

Snyk performs exact string matching when resolving dependencies to their
lock file entries. When it sees `safer-buffer@>= 2.1.2 < 3.0.0` as a
dependency, it looks for that exact string in the alias list, but only
finds `safer-buffer@>= 2.1.2 < 3`, causing the error:

  "Dependency safer-buffer@>= 2.1.2 < 3.0.0 was not found in yarn.lock"

Solution:
Add a post-processing sed command that normalizes version ranges in the
dependency specifications to match the aliases. This transforms:
- "< 3.0.0" → "< 3"
- "< 3.0" → "< 3"

This ensures Snyk can match dependencies to their resolutions.

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-11 21:02:48 +00:00
github-automation-metabase
9a643170a9 🤖 backported "Set up bun authenticated" (#69494)
Set up bun authenticated (#69491)

This prevents API rate limits.

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-02-11 19:02:53 +00:00
github-automation-metabase
b47993bde0 🤖 backported "Minor code cleanup" (#69378)
Minor code cleanup (#69236)

Code cleanup

Co-authored-by: Nathan Voxland <nathan@metabase.com>
2026-02-11 17:35:25 +00:00
github-automation-metabase
1bcf691a16 🤖 backported "fix: error message for unauthenticated requests is generic" (#69486)
fix: error message for unauthenticated requests is generic (#69352)

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-02-11 17:28:17 +00:00
github-automation-metabase
ef3a782408 🤖 backported "feat(sdk): add isHostAppInDevMode" (#69483)
feat(sdk): add isHostAppInDevMode (#69450)

* feat(sdk): add isHostAppInDevMode

* i forgot package.json

Co-authored-by: Nicolò Pretto <info@npretto.com>
2026-02-11 16:50:07 +00:00
github-automation-metabase
a009f371d6 🤖 backported "Remove @peculiar/webcrypto polyfill from ClojureScript tests" (#69482)
Remove `@peculiar/webcrypto` polyfill from ClojureScript tests (#69475)

This completes the removal of `@peculiar/webcrypto` from the codebase,
following the Jest setup cleanup in #69466.

Changes:
- Update `polyfills.cljc` to use Node's native `crypto.webcrypto`
- Remove `@peculiar/webcrypto` from package.json

The previous comment about needing Node v23+ was outdated:
- `crypto.webcrypto` available since Node 15
- `globalThis.crypto` available since Node 19
- Node 22 (current LTS) fully supports it

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-11 16:33:54 +00:00
github-automation-metabase
0e7238fd7e 🤖 backported "fix: drag handler selecting text in query editor" (#69477)
fix: drag handler selecting text in query editor (#68970)

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-02-11 15:51:30 +00:00
github-automation-metabase
2cba5bae71 🤖 backported "feat: tooltips for metabot message action buttons" (#69471)
feat: tooltips for metabot message action buttons (#69369)

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-02-11 15:17:14 +00:00
github-automation-metabase
2363e57f9c 🤖 backported "Remove @peculiar/webcrypto polyfill from the Jest setup" (#69474)
Remove `@peculiar/webcrypto` polyfill from the Jest setup (#69466)

* Use native NodeJS cryppolyfill in fe unit tests

* Force jose library to use Node.js runtime in Jest tests

The jose library's browser runtime expects CryptoKey to be globally
available, which jsdom doesn't provide. This caused tests using JWT
signing (via jose) to fail with "CryptoKey is not defined" after
switching from @peculiar/webcrypto to Node's native webcrypto.

By mapping jose to its Node.js runtime via moduleNameMapper, we avoid
the CryptoKey dependency since the Node runtime uses require('crypto')
directly.

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-11 15:08:20 +00:00
github-automation-metabase
4a992f3bb4 🤖 backported "Set bigquery transport options with read timeout" (#69464)
Set bigquery transport options with read timeout (#69306)

* set read timeout

* add tests

Co-authored-by: Riley Thompson <riley@metabase.com>
2026-02-11 14:51:22 +00:00
github-automation-metabase
ac2ee2869d 🤖 backported "Interrupt threads stuck after query cancellation" (#69375)
Interrupt threads stuck after query cancellation (#69254)

* interruot stuck threads

* small changes

Co-authored-by: Riley Thompson <riley@metabase.com>
2026-02-11 14:47:53 +00:00
github-automation-metabase
99b0c6395a 🤖 backported "Update FE Claude.md scripts instructions" (#69467)
Update FE Claude.md scripts instructions (#69463)

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-02-11 14:27:25 +00:00
github-automation-metabase
689b70bfbe 🤖 backported "Remove superfluous jest-localstorage-mock" (#69460)
Remove superfluous `jest-localstorage-mock` (#69455)

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-02-11 14:23:28 +00:00
github-automation-metabase
f982e75d7e 🤖 backported "Fix determine-driver-skips failing on a release branch" (#69459)
Fix `determine-driver-skips` failing on a release branch (#69448)

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-02-11 14:02:46 +00:00
github-automation-metabase
e6b4cac90d 🤖 backported "fix: line height of placeholder text in metabot side panel should be 20px" (#69457)
fix: line height of placeholder text in metabot side panel should be 20px (#69377)

Co-authored-by: Maksym Yakubych <undrfined@gmail.com>
2026-02-11 13:48:52 +00:00
github-automation-metabase
36974d0f1c 🤖 backported "Upgrade webpack" (#69410)
Upgrade webpack (#69341)

Co-authored-by: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
2026-02-11 09:46:09 +00:00
Sébastien
d068caaeaa Updated workflow and templates for 59-beta for SDK (#69411)
updated workflow and templates for 59-beta for SDK
2026-02-11 10:35:12 +01:00
github-automation-metabase
509d6df266 🤖 backported "Fixes show detail button showing in embeds" (#69406)
Fixes show detail button showing in embeds (#69338)

fixes show detail button showing in embeds

Co-authored-by: Sébastien <sebastien@metabase.com>
2026-02-11 06:08:02 +00:00
github-automation-metabase
9293b36a23 🤖 backported "Allow adding segments and measures to hidden tables" (#69400)
Allow adding segments and measures to hidden tables (#69373)

Co-authored-by: Anderson <ands.alves.nunes@gmail.com>
2026-02-11 04:19:13 +00:00
github-automation-metabase
e1d01d3eb7 🤖 backported "Report conflicts on transforms/snippets/lib" (#69398)
Report conflicts on transforms/snippets/lib (#68506)

* Report conflicts on transforms/snippets/lib

[UXW-2743: Warn before remote sync overwrites local library/transforms](https://linear.app/metabase/issue/UXW-2743/warn-before-remote-sync-overwrites-local-librarytransforms)



* fixup! store conflicts in remote-sync-task table

* fixup! make conflict checking spec driven

* fixup! tests failures

* fixup! lints

* fixup! exclude tags from conflict

* fixup! don't delete builtins

* fixup! ignore built-in tags

* fixup! preserve built-in python library

* fixup! kondo

* fixup! correct condition

* fixup! module sort

* fixup! build where clause for post-import removal

* fixup! ws

* fixup! pythonlibrary in serialization tests

---------

Co-authored-by: John Swanson <john.swanson@metabase.com>
Co-authored-by: Edward Paget <ed.paget@gmail.com>
2026-02-11 03:39:24 +00:00
github-automation-metabase
26eec29835 🤖 backported "docs - fix typo in transforms-enabled setting description" (#69370)
docs - fix typo in transforms-enabled setting description (#69353)

Fix typo in transforms-enabled setting description

Co-authored-by: Jeff Bruemmer <jeff.bruemmer@gmail.com>
2026-02-11 01:16:14 +00:00
github-automation-metabase
545d3562f1 🤖 backported "Unify table visibility with can-query semantics" (#69389)
Unify table visibility with can-query semantics (#69199)

* Unify table visibility with can-query semantics

Table visibility checks had drifted across different APIs.

- `(can-query? table)` checked whether you had view access
and create-queries access OR the table was published. This is incorrect:
the table is queryable if you have view access AND either the table is
published OR you have create-queries.

- the collections API included tables that were not queryable.

- the search API allowed you to view tables if a) you had data
permissions on the table, AND b) the table was unpublished or published
in a collection you had access to. This is incorrect, since publishing a
table shouldn't hide a previously visible table from search results.
Search should return tables for which you have view-data permissions
PLUS the table is either published or you have create-queries
permissions.

Fundamentally this change:

- correctly defines what `(can-query? table)` means, and
- uses that new definition of `can-query` to determine table visibility
  across the collection, search, and table APIs.

Note that I did not change some existing usages of
`(mi/visible-filter-clause :model/Table ...)`, which will continue to
exclude tables for which the user does not have explicit data
permissions set (but could otherwise query due to being published). That
should be a simple followup PR.

- align SQL table visibility with mi/can-query? semantics for search paths

- add enterprise `published-table-visible-clause` and wire optional

- `published-via-collection` support into `(mi/visible-filter-clause :model/Table ...)`

- update search table fallback permission check to use canonical `mi/can-query?`

- fix collection table children filtering to include `published-via-collection` queryability

- make `(mi/can-query? :model/Table)` return explicit booleans

- add/adjust EE tests for:
  - published-table SQL clause behavior
  - collection items visibility under view/query perms
  - search visibility when user lacks query perms
  - search visibility for unpublished tables when user has data perms
  - stabilize appdb negation test by avoiding brittle exact count for "customer" in shared index data

* don't use `published-tables` directly

and fix kondo config

* correct feature for library

* kondo

* ensure we bind `*current-user-id*` in search

fallbacks rely on functions that use dynamic vars to check permissions.

Search is designed to use only the search context (with its
`current-user-id` and `current-user-perms`) and binds those dynamic vars
accordingly.

Previously we just needed to bind `current-user-permissions-set` but now
we should also bind `current-user-id` as well.

* fix tests

* correct feature for library

Co-authored-by: John Swanson <john.swanson@metabase.com>
2026-02-10 23:22:37 +00:00
github-automation-metabase
0d76548e20 🤖 backported "Implement Archived Snippets page" (#69392)
Implement Archived Snippets page (#68823)

* Implement archived snippets page / Adjust archive/unarchive actions for snippets and folders

* Add more coverage

* Fix ts

* Fix ts / Fix e2e test

* Fix eslint/prettier

* Fix e2e test

* Remove empty file

Co-authored-by: Anderson <ands.alves.nunes@gmail.com>
2026-02-10 23:06:50 +00:00
github-automation-metabase
b31f90329c 🤖 backported "Update table email styles to match frontend" (#69381)
Update table email styles to match frontend (#69176)

Co-authored-by: kevinkelleher12 <kevin.kelleher@metabase.com>
2026-02-10 21:17:31 +00:00
2175 changed files with 391965 additions and 274361 deletions

View File

@@ -12,8 +12,9 @@ allowed-tools: Read, Grep, Bash, Glob
Review pull requests with a focus on:
- Readability and maintainability
- Appropriate test coverage
- Compliance with project coding standards and conventions
- Code quality and best practices
- Clear and correct JSDoc comments
- Type safety and proper TypeScript usage
- React best practices (when applicable)
- React best practices (when applicable)

View File

@@ -176,6 +176,7 @@
clojure.core.async/to-chan!
clojure.core.async/to-chan!!
metabase.channel.core/send!
metabase.warehouses.models.database/assert-not-h2!
metabase.driver.sql-jdbc.execute/execute-prepared-statement!
metabase.notification.models/create-notification!
metabase.pulse.send/send-pulse!
@@ -227,7 +228,9 @@
;;
:invalid-arity {:skip-args [metabase.lib.util.match/match
metabase.lib.util.match/match-lite]} ; TODO (cam): can we fix these?
metabase.lib.util.match/match-lite
metabase.lib.util.match/match-many
metabase.lib.util.match/replace-lite]} ; TODO (cam): can we fix these?
:refer-all {:level :warning, :exclude [clojure.test]}
:unused-referred-var {:exclude {compojure.core [GET DELETE POST PUT]}}
@@ -246,12 +249,17 @@
(metabase.lib.util.match/match)
(metabase.lib.util.match/match-one)
(metabase.lib.util.match/match-lite)
(metabase.lib.util.match/match-many)
(metabase.lib.util.match/replace)
(metabase.lib.util.match/replace-in)
(metabase.lib.util.match/replace-lite)
(metabase.driver-api.core/match)
(metabase.driver-api.core/match-one)
(metabase.driver-api.core/match-lite)
(metabase.driver-api.core/match-many)
(metabase.driver-api.core/replace)
(metabase.driver-api.core/replace-in)
(metabase.driver-api.core/replace-lite)
(metabase.query-processor.middleware.cache-backend.interface/with-cached-results)
(metabase.util.regex/rx [opt])
(metabase.util/prog1 [<>])
@@ -303,6 +311,9 @@
metabase.lib.convert/->legacy-MBQL {:message "Conversion to legacy MBQL is discouraged, please use Lib to manipulate MBQL queries"}
metabase.lib.core/->legacy-MBQL {:message "Conversion to legacy MBQL is discouraged, please use Lib to manipulate MBQL queries"}
metabase.lib.equality/find-column-indexes-for-refs {:message "Use lib.equality/closest-matches-in-metadata or lib.equality/find-closest-matches-for-refs instead of lib.equality/find-column-indexes-for-refs"}
metabase.lib.util.match/match {:message "Use lib.util.match/match-many instead of lib.util.match/match."}
metabase.lib.util.match/match-one {:message "Use lib.util.match/match-lite instead of lib.util.match/match-one."}
metabase.lib.util.match/replace {:message "Use lib.util.match/replace-lite instead of lib.util.match/replace."}
metabase-enterprise.transforms.interface/execute! {:message "Use metabase-enterprise.transforms.execute/execute! instead of metabase-enterprise.transforms.interface/execute!"}
next.jdbc/active-tx? {:message "Use metabase.app-db.core/in-transaction? to see if we are in a transaction"}
toucan2.core/debug {:message "Don't commit code using t2/debug"}
@@ -781,7 +792,7 @@
:private-call {:level :off}
:metabase/defsetting-must-specify-export {:level :off}
:metabase/defsetting-namespace {:level :off}
:metabase/test-helpers-use-non-thread-safe-functions {:level :warning} ; more config in `.clj-kondo/config/test-helpers/config.edn
:metabase/test-helpers-use-non-thread-safe-functions {:level :warning} ; more config in `.clj-kondo/config/test-helpers/config.edn`
:discouraged-var
{metabase.driver/database-supports? {:level :off}

View File

@@ -133,7 +133,7 @@
version}}
analyze
{:team "Querying"
{:team "Graphy"
:api #{metabase.analyze.core
metabase.analyze.query-results}
:uses #{config
@@ -275,6 +275,7 @@
config
events
models
permissions
premium-features
request
settings
@@ -548,6 +549,8 @@
metabase.driver.common
metabase.driver.common.parameters
metabase.driver.common.parameters.parse
metabase.driver.connection
metabase.driver.connection.workspaces
metabase.driver.ddl.interface
metabase.driver.h2
metabase.driver.impl
@@ -569,7 +572,8 @@
metabase.driver.sql.util
metabase.driver.sync
metabase.driver.util}
:uses #{app-db
:uses #{analytics
app-db
appearance
auth-provider
classloader
@@ -672,6 +676,13 @@
types
util}}
frontend-errors
{:team "UX West"
:api #{metabase.frontend-errors.api}
:uses #{analytics
api
util}}
geojson
{:team "UX West"
:api #{metabase.geojson.api
@@ -690,7 +701,7 @@
util}}
graph
{:team "Querying"
{:team "Graphy"
:api #{metabase.graph.core}
:uses #{util}}
@@ -732,8 +743,7 @@
lib
{:team "Querying"
:api #{metabase.lib.binning
metabase.lib.convert ; Only so [[metabase.queries.models.card]] can set dynamic vars.
:api #{metabase.lib.convert ; Only so [[metabase.queries.models.card]] can set dynamic vars.
metabase.lib.core
metabase.lib.equality
metabase.lib.field
@@ -742,7 +752,6 @@
metabase.lib.init
metabase.lib.metadata
metabase.lib.metadata.cached-provider
metabase.lib.metadata.column
metabase.lib.metadata.invocation-tracker
metabase.lib.metadata.protocols
metabase.lib.metadata.result-metadata
@@ -758,6 +767,7 @@
metabase.lib.schema.expression
metabase.lib.schema.expression.temporal
metabase.lib.schema.expression.window
metabase.lib.schema.filter
metabase.lib.schema.id
metabase.lib.schema.info
metabase.lib.schema.join
@@ -775,7 +785,6 @@
metabase.lib.schema.test-spec
metabase.lib.schema.util
metabase.lib.schema.validate
metabase.lib.temporal-bucket
metabase.lib.types.isa
metabase.lib.util
metabase.lib.util.match
@@ -952,6 +961,7 @@
metabase.parameters.custom-values
metabase.parameters.dashboard
metabase.parameters.field
metabase.parameters.field-values
metabase.parameters.init
metabase.parameters.params
metabase.parameters.schema
@@ -990,7 +1000,6 @@
{:team "UX West"
:api #{metabase.permissions-rest.api}
:uses #{api
app-db
audit-app
events
permissions
@@ -1026,6 +1035,7 @@
events
internal-stats
settings
startup
task
util}}
@@ -1069,7 +1079,8 @@
query-processor
request
tiles
util}}
util}
:model-imports #{:model/Card :model/Dashboard :model/DashboardCard :model/Document}}
pulse
{:team "Gadget"
@@ -1181,8 +1192,10 @@
metabase.query-processor.init
metabase.query-processor.interface
metabase.query-processor.metadata
metabase.query-processor.middleware.add-remaps
metabase.query-processor.middleware.annotate
metabase.query-processor.middleware.cache-backend.db
metabase.query-processor.middleware.catch-exceptions
metabase.query-processor.middleware.constraints
metabase.query-processor.middleware.limit
metabase.query-processor.middleware.permissions
@@ -1295,7 +1308,8 @@
metabase.search.ingestion
metabase.search.init
metabase.search.scoring
metabase.search.spec}
metabase.search.spec
metabase.search.task.search-index}
:uses #{analytics
api
app-db
@@ -1316,8 +1330,7 @@
startup
task
transforms
util
warehouses}}
util}}
secrets
{:team "Querying"
@@ -1457,14 +1470,15 @@
util}}
sync
{:team "Querying"
{:team "Graphy"
:api #{metabase.sync.api
metabase.sync.core
metabase.sync.init
metabase.sync.schedules
metabase.sync.task.sync-databases
metabase.sync.util}
:uses #{analyze
:uses #{analytics
analyze
api
app-db
audit-app
@@ -1591,7 +1605,6 @@
enterprise/transforms-python
enterprise/workspaces}}
types
{:team "Querying"
:api #{metabase.types.core
@@ -1666,6 +1679,7 @@
request
settings
sso
system
tenants
users
util
@@ -2070,10 +2084,13 @@
settings
util
warehouse-schema
warehouses-rest}}
warehouses-rest}
:model-exports #{:model/DatabaseRouter}
:model-imports #{:model/Database
:model/Transform}}
enterprise/dependencies
{:team "Querying"
{:team "Graphy"
:api #{metabase-enterprise.dependencies.api
metabase-enterprise.dependencies.core
metabase-enterprise.dependencies.init}
@@ -2201,6 +2218,7 @@
lib-be
models
native-query-snippets
parameters
permissions
premium-features
pulse
@@ -2216,10 +2234,10 @@
transforms
users-rest
util
warehouse-schema
warehouses-rest
enterprise/dependencies
enterprise/transforms-python}}
enterprise/transforms-python}
:model-imports #{:model/Card :model/Transform}}
enterprise/permission-debug
{:team "UX West"
@@ -2253,7 +2271,8 @@
task
task-history
util
enterprise/serialization}}
enterprise/serialization
enterprise/transforms-python}}
enterprise/sandbox
{:team "UX West"
@@ -2301,6 +2320,28 @@
:uses #{premium-features
search}}
enterprise/security-center
{:team "Gadget"
:api #{metabase-enterprise.security-center.api
metabase-enterprise.security-center.init}
:uses #{analytics
api
app-db
channel
config
driver
events
models
notification
permissions
premium-features
settings
system
task
util}
:model-exports #{:model/SecurityAdvisory}
:model-imports #{:model/User}}
enterprise/semantic-search
{:team "Metabot"
:api #{metabase-enterprise.semantic-search.api
@@ -2340,6 +2381,7 @@
plugins
premium-features
search
server
setup
util}}
@@ -2417,11 +2459,12 @@
enterprise/transforms
{:team "Querying"
:api #{}
:uses #{}}
:uses #{premium-features}}
enterprise/transforms-python
{:team "Querying"
:api #{metabase-enterprise.transforms-python.api
metabase-enterprise.transforms-python.core
metabase-enterprise.transforms-python.init
metabase-enterprise.transforms-python.python-runner}
:uses #{analytics
@@ -2469,7 +2512,12 @@
system
transforms
util
enterprise/transforms-python}}}
enterprise/transforms-python}}
enterprise/writable-connection
{:team "Querying"
:api #{}
:uses #{premium-features}}}
;; namespaces matching these patterns (with `re-find`) are excluded from the module linter. Since regex literals
;; aren't allowed in EDN just used the `(str <regex>)` version i.e. two slashes instead of one.

View File

@@ -3,7 +3,7 @@
;; TODO -- seems silly to maintain different blacklists and whitelists here than we use for the deftest `^:parallel`
;; checker...
{:explicitly-safe
#{ ;; these toucan methods might actually set global values if it's used outside of a transaction,
#{;; these toucan methods might actually set global values if it's used outside of a transaction,
;; but since mt/with-temp runs in a transaction, so we'll ignore them in this case.
toucan2.core/delete!
toucan2.core/update!
@@ -110,6 +110,7 @@
metabase.settings.models.setting-test/test-user-local-allowed-setting!
metabase.settings.models.setting-test/test-user-local-only-setting!
metabase.settings.models.setting.cache/restore-cache!
metabase.settings.models.setting/log-deprecated-env-var-usage!
metabase.settings.models.setting/set!
metabase.settings.models.setting/validate-settings-formatting!
metabase.setup.core/create-token!

View File

@@ -55,7 +55,6 @@
help-link-custom-destination
instance-creation
is-hosted?
is-metabot-enabled
jdbc-data-warehouse-max-connection-pool-size
jdbc-data-warehouse-unreturned-connection-timeout-seconds
jwt-attribute-email

View File

@@ -120,7 +120,10 @@
metabase.dashboards.models.dashboard-test/with-dash-in-collection [[:inner 0]]
metabase.driver-api.core/match [[:inner 0]]
metabase.driver-api.core/match-one [[:inner 0]]
metabase.driver-api.core/match-lite [[:inner 0]]
metabase.driver-api.core/match-many [[:inner 0]]
metabase.driver-api.core/replace [[:inner 0]]
metabase.driver-api.core/replace-lite [[:inner 0]]
metabase.driver-api.core/replace-in [[:inner 0]]
metabase.driver.bigquery-cloud-sdk.query-processor/with-temporal-type [[:default]]
metabase.driver.druid.client/DELETE [[:default]]
@@ -156,7 +159,9 @@
metabase.lib.util.match/match [[:inner 0]]
metabase.lib.util.match/match-one [[:inner 0]]
metabase.lib.util.match/match-lite [[:inner 0]]
metabase.lib.util.match/match-many [[:inner 0]]
metabase.lib.util.match/replace [[:inner 0]]
metabase.lib.util.match/replace-lite [[:inner 0]]
metabase.lib.util.match/replace-in [[:inner 0]]
metabase.models.interface/define-batched-hydration-method [[:inner 0]]
metabase.models.interface/define-simple-hydration-method [[:inner 0]]

269
.github/CODEOWNERS vendored
View File

@@ -1,266 +1,31 @@
# Before changing this file, make sure you have read how we use it:
# https://www.notion.so/metabase/Pull-Request-Code-Review-Guide-374f05df889748b69d67af753f9bc9b8?pvs=4#36550c04ceab40b5a8b8bee6264b090c
# @metabase/core-backend-querying-platform
src/metabase/lib @metabase/core-backend-querying-platform
src/metabase/lib_be @metabase/core-backend-querying-platform
src/metabase/query_processor @metabase/core-backend-querying-platform
# @metabase/graphy
src/metabase/graph @metabase/graphy
enterprise/backend/src/metabase_enterprise/dependencies @metabase/graphy
enterprise/frontend/src/metabase-enterprise/dependencies @metabase/graphy
# @metabase/embedding
enterprise/frontend/src/embedding-sdk-package @metabase/embedding
enterprise/frontend/src/embedding-sdk-bundle @metabase/embedding
enterprise/frontend/src/embedding-sdk-shared @metabase/embedding
frontend/src/metabase/embedding-sdk @metabase/embedding
frontend/src/metabase/public/containers/PublicOrEmbeddedQuestion @metabase/embedding
frontend/src/metabase/public/containers/PublicOrEmbeddedDashboard @metabase/embedding
frontend/src/metabase/ui @metabase/core-frontend-ux-west
# snowplow/* @metabase/data
src/metabase/analytics/prometheus.clj @metabase/cloud-ops
.github @metabase/devexp
.clj-kondo @metabase/devexp
deps.edn @metabase/backend-developers
# @metabase/tech-writers
docs @metabase/tech-writers
docs/developers-guide # exclude from tech-writer ownership
#
# Backend modules <=> teams that own them
#
# @metabase/devexp
.github @metabase/devexp
.clj-kondo @metabase/devexp
# modules/drivers @metabase/drivers
src/metabase/driver/sql_jdbc/actions.clj @metabase/core-ux-east
test/metabase/driver/sql_jdbc/actions_test.clj @metabase/core-ux-east
# enterprise/backend/src/metabase_enterprise/advanced_config @metabase/core-backend-admin-webapp
# enterprise/backend/test/metabase_enterprise/advanced_config @metabase/core-backend-admin-webapp
# enterprise/backend/src/metabase_enterprise/advanced_permissions @metabase/core-backend-admin-webapp
# enterprise/backend/test/metabase_enterprise/advanced_permissions @metabase/core-backend-admin-webapp
# enterprise/backend/src/metabase_enterprise/airgap @metabase/core-backend-admin-webapp
# enterprise/backend/test/metabase_enterprise/airgap @metabase/core-backend-admin-webapp
# enterprise/backend/src/metabase_enterprise/api @metabase/devexp
# enterprise/backend/test/metabase_enterprise/api @metabase/devexp
# enterprise/backend/src/metabase_enterprise/audit_app @metabase/core-backend-admin-webapp
# enterprise/backend/test/metabase_enterprise/audit_app @metabase/core-backend-admin-webapp
# enterprise/backend/src/metabase_enterprise/auth_provider @metabase/core-backend-admin-webapp
# enterprise/backend/test/metabase_enterprise/auth_provider @metabase/core-backend-admin-webapp
# enterprise/backend/src/metabase_enterprise/billing @metabase/core-backend-admin-webapp
# enterprise/backend/test/metabase_enterprise/billing @metabase/core-backend-admin-webapp
# enterprise/backend/src/metabase_enterprise/cache @metabase/core-backend-admin-webapp
# enterprise/backend/test/metabase_enterprise/cache @metabase/core-backend-admin-webapp
# enterprise/backend/src/metabase_enterprise/content_verification @metabase/core-backend-admin-webapp
# enterprise/backend/test/metabase_enterprise/content_verification @metabase/core-backend-admin-webapp
# enterprise/backend/src/metabase_enterprise/core @metabase/devexp
# enterprise/backend/test/metabase_enterprise/core @metabase/devexp
# enterprise/backend/src/metabase_enterprise/dashboard_subscription_filters @metabase/core-ux-east
# enterprise/backend/test/metabase_enterprise/dashboard_subscription_filters @metabase/core-ux-east
# enterprise/backend/src/metabase_enterprise/enhancements @metabase/core-backend-admin-webapp
# enterprise/backend/test/metabase_enterprise/enhancements @metabase/core-backend-admin-webapp
# # enterprise/backend/src/metabase_enterprise/llm
# # enterprise/backend/test/metabase_enterprise/llm
# enterprise/backend/src/metabase_enterprise/query_reference_validation @metabase/core-backend-admin-webapp
# enterprise/backend/test/metabase_enterprise/query_reference_validation @metabase/core-backend-admin-webapp
# enterprise/backend/src/metabase_enterprise/sandbox @metabase/core-backend-admin-webapp
# enterprise/backend/test/metabase_enterprise/sandbox @metabase/core-backend-admin-webapp
# enterprise/backend/src/metabase_enterprise/scim @metabase/core-backend-admin-webapp
# enterprise/backend/test/metabase_enterprise/scim @metabase/core-backend-admin-webapp
# enterprise/backend/src/metabase_enterprise/search ...
# enterprise/backend/test/metabase_enterprise/search ...
# enterprise/backend/src/metabase_enterprise/serialization @metabase/core-ux-east
# enterprise/backend/test/metabase_enterprise/serialization @metabase/core-ux-east
# enterprise/backend/src/metabase_enterprise/snippet_collections @metabase/core-backend-admin-webapp
# enterprise/backend/test/metabase_enterprise/snippet_collections @metabase/core-backend-admin-webapp
# enterprise/backend/src/metabase_enterprise/sso @metabase/core-backend-admin-webapp
# enterprise/backend/test/metabase_enterprise/sso @metabase/core-backend-admin-webapp
# enterprise/backend/src/metabase_enterprise/stale @metabase/core-backend-admin-webapp
# enterprise/backend/test/metabase_enterprise/stale @metabase/core-backend-admin-webapp
# enterprise/backend/src/metabase_enterprise/stats @metabase/core-backend-admin-webapp
# enterprise/backend/test/metabase_enterprise/stats @metabase/core-backend-admin-webapp
# enterprise/backend/src/metabase_enterprise/task @metabase/core-backend-admin-webapp
# enterprise/backend/test/metabase_enterprise/task @metabase/core-backend-admin-webapp
# enterprise/backend/src/metabase_enterprise/upload_management @metabase/core-backend-admin-webapp
# enterprise/backend/test/metabase_enterprise/upload_management @metabase/core-backend-admin-webapp
src/metabase/actions @metabase/core-ux-east
test/metabase/actions @metabase/core-ux-east
# src/metabase/activity_feed @metabase/core-backend-admin-webapp
# test/metabase/activity_feed @metabase/core-backend-admin-webapp
# src/metabase/analytics @metabase/core-backend-admin-webapp
# test/metabase/analytics @metabase/core-backend-admin-webapp
# src/metabase/analyze @metabase/drivers
# test/metabase/analyze @metabase/drivers
# src/metabase/api @metabase/devexp
# test/metabase/api @metabase/devexp
# src/metabase/audit @metabase/core-backend-admin-webapp
# test/metabase/audit @metabase/core-backend-admin-webapp
# src/metabase/auth_provider @metabase/core-backend-admin-webapp
# test/metabase/auth_provider @metabase/core-backend-admin-webapp
# src/metabase/bookmarks @metabase/core-backend-admin-webapp
# test/metabase/bookmarks @metabase/core-backend-admin-webapp
# src/metabase/cmd @metabase/devexp
# test/metabase/cmd @metabase/devexp
# src/metabase/channel @metabase/core-ux-east
# test/metabase/channel @metabase/core-ux-east
# src/metabase/cloud_migration ...
# test/metabase/cloud_migration ...
# src/metabase/cmd @metabase/devexp
# test/metabase/cmd @metabase/devexp
# src/metabase/config @metabase/devexp
# test/metabase/config @metabase/devexp
# src/metabase/core @metabase/devexp
# test/metabase/core @metabase/devexp
# src/metabase/db @metabase/core-backend-admin-webapp
# test/metabase/db @metabase/core-backend-admin-webapp
# src/metabase/driver @metabase/drivers
# test/metabase/driver @metabase/drivers
# src/metabase/eid_translation @metabase/core-backend-admin-webapp
# test/metabase/eid_translation @metabase/core-backend-admin-webapp
# src/metabase/embed @metabase/embedding
# test/metabase/embed @metabase/embedding
# src/metabase/events @metabase/devexp
# test/metabase/events @metabase/devexp
# src/metabase/formatter @metabase/core-backend-querying
# test/metabase/formatter @metabase/core-backend-querying
# src/metabase/indexed_entities @metabase/core-backend-querying
# test/metabase/indexed_entities @metabase/core-backend-querying
# src/metabase/integrations ...
# test/metabase/integrations ...
# src/metabase/legacy_mbql @metabase/core-backend-querying
# test/metabase/legacy_mbql @metabase/core-backend-querying
# src/metabase/lib @metabase/core-backend-querying
# test/metabase/lib @metabase/core-backend-querying
# src/metabase/logger @metabase/devexp
# test/metabase/logger @metabase/devexp
# src/metabase/login_history @metabase/core-backend-admin-webapp
# test/metabase/login_history @metabase/core-backend-admin-webapp
# src/metabase/model_persistence @metabase/core-backend-querying
# test/metabase/model_persistence @metabase/core-backend-querying
# src/metabase/models @metabase/devexp
# test/metabase/models @metabase/devexp
# src/metabase/moderation @metabase/core-backend-admin-webapp
# test/metabase/moderation @metabase/core-backend-admin-webapp
# src/metabase/notification @metabase/core-ux-east
# test/metabase/notification @metabase/core-ux-east
# src/metabase/permissions @metabase/core-backend-admin-webapp
# test/metabase/permissions @metabase/core-backend-admin-webapp
# src/metabase/plugins @metabase/devexp
# test/metabase/plugins @metabase/devexp
# src/metabase/premium_features @metabase/core-backend-admin-webapp
# test/metabase/premium_features @metabase/core-backend-admin-webapp
# src/metabase/public_settings @metabase/core-backend-admin-webapp
# test/metabase/public_settings @metabase/core-backend-admin-webapp
# src/metabase/public_sharing @metabase/core-backend-admin-webapp
# test/metabase/public_sharing @metabase/core-backend-admin-webapp
# src/metabase/pulse @metabase/core-ux-east
# test/metabase/pulse @metabase/core-ux-east
# src/metabase/query_analysis @metabase/core-backend-querying
# test/metabase/query_analysis @metabase/core-backend-querying
# src/metabase/query_processor @metabase/core-backend-querying
# test/metabase/query_processor @metabase/core-backend-querying
# src/metabase/request @metabase/devexp
# test/metabase/request @metabase/devexp
# src/metabase/revisions @metabase/core-backend-admin-webapp
# test/metabase/revisions @metabase/core-backend-admin-webapp
# src/metabase/sample_data @metabase/core-backend-admin-webapp
# test/metabase/sample_data @metabase/core-backend-admin-webapp
# src/metabase/search ...
# test/metabase/search ...
# src/metabase/segments @metabase/core-backend-querying
# test/metabase/segments @metabase/core-backend-querying
# src/metabase/server @metabase/devexp
# test/metabase/server @metabase/devexp
# src/metabase/session @metabase/core-backend-admin-webapp
# test/metabase/session @metabase/core-backend-admin-webapp
# src/metabase/setup @metabase/core-backend-admin-webapp
# test/metabase/setup @metabase/core-backend-admin-webapp
# src/metabase/sso @metabase/core-backend-admin-webapp
# test/metabase/sso @metabase/core-backend-admin-webapp
# src/metabase/sync @metabase/drivers
# test/metabase/sync @metabase/drivers
# src/metabase/task @metabase/devexp
# test/metabase/task @metabase/devexp
# src/metabase/tiles @metabase/core-backend-dashviz
# test/metabase/tiles @metabase/core-backend-dashviz
# src/metabase/timeline @metabase/core-backend-dashviz
# test/metabase/timeline @metabase/core-backend-dashviz
# src/metabase/types @metabase/core-backend-querying
# test/metabase/types @metabase/core-backend-querying
# src/metabase/upload @metabase/core-backend-admin-webapp
# test/metabase/upload @metabase/core-backend-admin-webapp
# src/metabase/user_key_value @metabase/core-backend-admin-webapp
# test/metabase/user_key_value @metabase/core-backend-admin-webapp
# src/metabase/util @metabase/devexp
# test/metabase/util @metabase/devexp
# src/metabase/xrays @metabase/core-backend-querying
# test/metabase/xrays @metabase/core-backend-querying
# @metabase/cloud-ops
src/metabase/analytics/prometheus.clj @metabase/cloud-ops

View File

@@ -45,17 +45,31 @@ runs:
});
if (!artifacts.data?.artifacts?.[0]?.id) {
throw new Error(`No artifacts found for ${artifactName}`);
core.setFailed(`No artifacts found for ${artifactName}`);
return;
}
const artifact_id = artifacts.data.artifacts[0].id;
const download = await github.rest.actions.downloadArtifact({
owner: context.repo.owner,
repo: context.repo.repo,
artifact_id: artifact_id,
archive_format: 'zip',
});
let download;
const maxAttempts = 3;
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
try {
download = await github.rest.actions.downloadArtifact({
owner: context.repo.owner,
repo: context.repo.repo,
artifact_id: artifact_id,
archive_format: 'zip',
});
break;
} catch (err) {
console.log(`Attempt ${attempt}/${maxAttempts} failed: ${err.message}`);
if (attempt === maxAttempts) throw err;
const delay = attempt * 15000; // 15s, 30s
console.log(`Retrying in ${delay / 1000}s...`);
await new Promise(r => setTimeout(r, delay));
}
}
fs.writeFileSync(`${process.env.GITHUB_WORKSPACE}/mb.zip`, Buffer.from(download.data));

View File

@@ -7,9 +7,15 @@ outputs:
m2-cache-key:
description: "The cache key for the Maven cache."
value: ${{ steps.keys-factory.outputs.m2-cache-key }}
m2-restore-key:
description: "The fallback restore key prefix for the Maven cache."
value: ${{ steps.keys-factory.outputs.m2-restore-key }}
node-cache-key:
description: "The cache key for the Node.js cache."
value: ${{ steps.keys-factory.outputs.node-cache-key }}
node-restore-key:
description: "The fallback restore key prefix for the Node.js cache."
value: ${{ steps.keys-factory.outputs.node-restore-key }}
eslint-cache-key:
description: "The cache key for Eslint cache"
value: ${{ steps.keys-factory.outputs.eslint-cache-key }}
@@ -31,7 +37,9 @@ runs:
CACHE_SUFFIX="${{ runner.os }}-$WEEK_OF_YEAR"
echo "m2-cache-key=$M2_CACHE_PREFIX-$CACHE_SUFFIX" >> $GITHUB_OUTPUT
echo "m2-restore-key=$M2_CACHE_PREFIX-" >> $GITHUB_OUTPUT
echo "node-cache-key=$NODE_CACHE_PREFIX-$CACHE_SUFFIX" >> $GITHUB_OUTPUT
echo "node-restore-key=$NODE_CACHE_PREFIX-" >> $GITHUB_OUTPUT
echo "eslint-cache-key=$ESLINT_CACHE_PREFIX-$CACHE_SUFFIX" >> $GITHUB_OUTPUT
echo "cypress-cache-key=$CYPRESS_CACHE_PREFIX-$CACHE_SUFFIX" >> $GITHUB_OUTPUT
shell: bash

View File

@@ -20,10 +20,18 @@ runs:
distribution: 'temurin'
- name: Install Clojure CLI
shell: bash
continue-on-error: true
run: |
curl -O https://download.clojure.org/install/linux-install-${{ inputs.clojure-version }}.sh &&
sudo bash ./linux-install-${{ inputs.clojure-version }}.sh
for attempt in 1 2 3; do
curl --retry 3 --retry-delay 5 --fail -O https://download.clojure.org/install/linux-install-${{ inputs.clojure-version }}.sh \
&& sudo bash ./linux-install-${{ inputs.clojure-version }}.sh \
&& break
echo "::warning::Clojure install attempt $attempt failed, retrying in 10s..."
sleep 10
done
if ! clojure --version; then
echo "::error::Clojure CLI installation failed after 3 attempts"
exit 1
fi
- name: Get M2 cache key
uses: ./.github/actions/get-cache-keys
@@ -36,3 +44,5 @@ runs:
~/.m2
~/.gitlibs
key: ${{ steps.get-cache-keys.outputs.m2-cache-key }}
restore-keys: |
${{ steps.get-cache-keys.outputs.m2-restore-key }}

View File

@@ -15,11 +15,10 @@ outputs:
runs:
using: "composite"
steps:
- name: Install Chrome v111
- name: Install Chrome v144
uses: browser-actions/setup-chrome@v2
with:
# https://chromium.cypress.io/linux/stable/111.0.5563.146
chrome-version: 1097615
chrome-version: 144
id: setup-chrome
- name: Get cache keys

View File

@@ -11,16 +11,10 @@ inputs:
runs:
using: "composite"
steps:
- name: Prepare Node.js
uses: actions/setup-node@v4
- name: Prepare Node + Bun environment
uses: ./.github/actions/prepare-node-bun
with:
node-version: ${{ inputs.node-version }} # this overrides, if present
node-version-file: ".nvmrc"
- name: Install bun
uses: oven-sh/setup-bun@v2
with:
bun-version: latest
node-version: ${{ inputs.node-version }}
- name: Get cache keys
uses: ./.github/actions/get-cache-keys
@@ -33,6 +27,8 @@ runs:
~/.m2
~/.gitlibs
key: ${{ steps.get-cache-keys.outputs.m2-cache-key }}
restore-keys: |
${{ steps.get-cache-keys.outputs.m2-restore-key }}
- name: Get bun cache directory
id: bun-cache
@@ -50,6 +46,8 @@ runs:
${{ steps.bun-cache.outputs.dir }}
node_modules
key: ${{ steps.get-cache-keys.outputs.node-cache-key }}
restore-keys: |
${{ steps.get-cache-keys.outputs.node-restore-key }}
# postinstall lifecycle hook can be dangerous in CI so we only run it locally (see package.json)
# If a job wants to patch packages, it does so explicitly in the CI. This setting is opt-out.

View File

@@ -0,0 +1,20 @@
name: Prepare Node + Bun environment
description: "Set up Node.js and Bun for CI jobs"
inputs:
node-version:
description: "The version of Node.js to use, overriding .nvmrc"
required: false
runs:
using: "composite"
steps:
- name: Prepare Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ inputs.node-version }}
node-version-file: ".nvmrc"
- name: Install bun
uses: oven-sh/setup-bun@v2
with:
bun-version: "1.3.7"
token: ${{ github.token }}

View File

@@ -6,7 +6,8 @@ runs:
steps:
- uses: oven-sh/setup-bun@v2
with:
bun-version: latest
bun-version: "1.3.7"
token: ${{ github.token }}
- name: Build release scripts
shell: bash

View File

@@ -17,6 +17,11 @@ inputs:
default: 'ee'
description: Edition to test (oss or ee)
outputs:
test-outcome:
description: "The outcome of the test run (success, failure, cancelled, skipped)"
value: ${{ steps.run-test.outcome }}
runs:
using: "composite"
steps:

View File

@@ -21,6 +21,8 @@ inputs:
variant:
required: false
default: ""
previous-step-outcome:
required: true
runs:
using: "composite"
@@ -48,12 +50,18 @@ runs:
aws s3 cp ${OUTPUT_FILE}.zip s3://$BUCKET/$DATE/$GITHUB_RUN_ID/$GITHUB_RUN_ATTEMPT/
- name: Upload results to Trunk
if: always() # Important! This step must always run because it controls job's exit code.
# Important!
# 1. This step must always run because it controls job's exit code.
# 2. There's no point in running this outside the organization
if: always() && github.repository_owner == 'metabase'
uses: trunk-io/analytics-uploader@main
env:
TRUNK_REPO_URL: git@github.com:metabase/metabase.git
with:
junit-paths: ${{ inputs.input-path }}
variant: ${{ inputs.variant || inputs.output-name }}
org-slug: metabase
dry-run: ${{ github.event_name == 'pull_request' && github.event.pull_request.draft == true }} # quarantine, but do not upload results
dry-run: ${{ (github.event_name == 'pull_request' && github.event.pull_request.draft == true) || github.repository != 'metabase/metabase' }} # quarantine, but do not upload results
token: ${{ inputs.trunk-api-token }}
use-cache: true
previous-step-outcome: ${{ inputs.previous-step-outcome }}

View File

@@ -1,52 +1,55 @@
# Metabase Developer Assistant Instructions
## Frontend Development
For detailed coding standards and conventions, see `CLAUDE.md` and the skills in `.claude/skills/`.
### Repository Structure
## Code Review Standards
```
frontend/src/
├── metabase/ # Main application components and pages
├── metabase-lib/ # Query building and data modeling utilities
├── metabase-types/ # TypeScript type definitions
└── metabase/ui/ # Design system components
Review focus areas: Security → Performance → Testing → Documentation (in priority order)
e2e/ # Cypress end-to-end tests
frontend/test/ # Jest unit tests
```
When reviewing code, use these emoji prefixes to categorize feedback:
- 🔒 Security concerns
- ⚡ Performance opportunities
- 🧹 Cleanup needs
- 📚 Documentation gaps
- 🚨 Blocking issues
- 💭 Clarification questions
### Technology Stack
### Security Critical Issues
- **Framework**: React 18 with TypeScript
- **State**: Redux Toolkit
- **Styling**: CSS Modules (preferred) > Emotion styled-components
- **UI**: `metabase/ui` components built with Mantine v8
- **Build**: Rspack (primary), Webpack (legacy)
- **Testing**: Jest + React Testing Library, Cypress
- Check for hardcoded secrets, API keys, or credentials
- Look for SQL injection and XSS vulnerabilities
- Verify proper input validation and sanitization
- Review authentication and authorization logic
- Ensure enterprise features use the plugin system (no enterprise code in OSS)
### Coding Standards
### Performance Red Flags
#### Component Preferences
- Identify N+1 database query problems
- Spot inefficient loops and algorithmic issues
- Check for memory leaks and resource cleanup
- Review caching opportunities for expensive operations
- Prefer `metabase/ui`components over `metabase/common/components`
- Use `.tsx` for components, `.ts` for utilities
### Code Quality Essentials
#### Styling
- Functions should be focused and appropriately sized
- Use clear, descriptive naming conventions
- Ensure proper error handling throughout
- Remove dead code and unused imports
ALWAYS prefer Mantine style props,then CSS modules. DO NOT suggest styled components, they are deprecated.
### Review Style
#### TypeScript Migration
- Only flag actual issues worth mentioning
- Do not post "looks good" comments or congratulate following conventions
- Be specific and actionable in feedback
- Explain the "why" behind recommendations
- Ask clarifying questions when code intent is unclear
When heavily editing `.js`/`.jsx` files, create a separate PR to convert to TypeScript first, then implement changes.
### Review Format
#### Enterprise Features
- Condense feedback into as few comments as possible
- Prefer a single summary comment over dozens of inline comments
- Only use inline comments for critical issues that require immediate attention
- For non-critical issues, link to the specific line from the summary instead
- Delete all stale comments and summaries on each new push or CI run
Enterprise functionality MUST use the plugin system. It is very important to not expose enterprise code in the OSS version.
#### Testing Requirements
All PRs should include tests. Prefer Unit tests over E2E tests.
#### Localization
All user-facing strings MUST be localized using the ttag library. Localized strings should be complete phrases, do not concatenate a few separately localized strings. You should add context to strings where the meaning of the string might not be obvious in isolation: e.g. "Home" might have different words in some languages depending on whether you're talking about a dwelling or the landing page for a website.
Language-specific rules are in `.github/instructions/*.instructions.md`.

View File

@@ -30,7 +30,7 @@ frontend_configs: &frontend_configs
- "**/tsconfig*.json"
- "package.json"
- "babel.config.json"
- ".eslintrc.js"
- "eslint.config.mjs"
- "postcss.config.js"
- "rspack.config.js"
- "rspack.main.config.js"
@@ -199,3 +199,15 @@ cljs:
- *shared_specs
- ".github/workflows/cljs.yml"
- "shadow-cljs.edn"
openapi:
- ".github/workflows/openapi.yml"
- "src/metabase/api/**"
- "src/metabase/api_routes/**"
- "src/metabase/*_rest/api.clj"
- "src/metabase/*/api.clj"
- "src/metabase/*/api/*.clj"
- "enterprise/backend/src/metabase_enterprise/**/api.clj"
- "enterprise/backend/src/metabase_enterprise/**/api/*.clj"
- "resources/openapi/**"
- "package.json"

View File

@@ -0,0 +1,9 @@
---
applyTo: "**/*.{clj,cljs,cljc}"
---
# Clojure/ClojureScript Code Review
When reviewing Clojure or ClojureScript code, apply the guidelines in these files:
- `.claude/skills/_shared/clojure-style-guide.md`
- `.claude/skills/clojure-review/SKILL.md`

View File

@@ -0,0 +1,9 @@
---
applyTo: "docs/**/*.md"
---
# Documentation Review
When reviewing documentation, apply the guidelines in these files:
- `.claude/skills/_shared/metabase-style-guide.md`
- `.claude/skills/docs-review/SKILL.md`

View File

@@ -0,0 +1,11 @@
---
applyTo: "**/*.{ts,tsx,js,jsx}"
---
# TypeScript/JavaScript Code Review
When reviewing TypeScript or JavaScript code, apply the guidelines in these files:
- `.claude/skills/typescript-review/SKILL.md`
- `docs/developers-guide/frontend.md`
- `frontend/CLAUDE.md`

View File

@@ -3,7 +3,7 @@ const { buildMatrix } = require("./build-e2e-matrix");
describe("buildMatrix", () => {
const options = {
java: "11",
defaultRunner: "ubuntu-22.04",
defaultRunner: "${{ vars.DEFAULT_RUNNER_KEY }}",
};
const testBuildMatrix = (entry, chunks) =>
buildMatrix(options, entry, chunks);

20
.github/team.json vendored
View File

@@ -4,14 +4,23 @@
"name": "Querying",
"label": ".Team/Querying",
"members": [
"ranquild",
"romeovs",
"bshepherdson",
"metamben",
"wzimrin",
"rileythomp",
"camsual"
]
},
{
"name": "Graphy",
"label": ".Team/Graphy",
"members": [
"ranquild",
"romeovs",
"ericnormand",
"galdre",
"rileythomp"
"dpsutton",
"escherize",
"bgrabow"
]
},
{
@@ -36,9 +45,6 @@
"name": "DevEx",
"label": ".Team/DevEx",
"members": [
"camsaul",
"dpsutton",
"escherize",
"fraserdrops",
"nemanjaglumac"
]

View File

@@ -14,20 +14,20 @@ concurrency:
jobs:
be-tests-mariadb:
if: ${{ !inputs.skip }}
runs-on: ubuntu-22.04
timeout-minutes: 60
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 40
strategy:
fail-fast: false
matrix:
version:
- name: MariaDB 10.2
junit-name: be-tests-mariadb-10-2-ee
image: circleci/mariadb:10.2.23
image: metabase/mariadb:10.2.23
env:
enable-ssl-tests: 'false'
- name: MariaDB Latest
junit-name: be-tests-mariadb-latest-ee
image: circleci/mariadb:latest
image: mariadb:latest
env:
enable-ssl-tests: 'false'
job:
@@ -57,8 +57,13 @@ jobs:
ports:
- "3306:3306"
env:
# MYSQL_* isn't supported on :latest aka 12.2.2
# MARIADB_* isn't supported on 10.2.23
# Send both until we upgrade to 10.6+ then remove MYSQL_*
MYSQL_ALLOW_EMPTY_PASSWORD: true
MYSQL_DATABASE: circle_test
MYSQL_DATABASE: mb_test
MARIADB_ALLOW_EMPTY_ROOT_PASSWORD: true
MARIADB_DATABASE: mb_test
env:
# Only run old migrations tests on pushes to master or release branches. All other branches should skip tests
# with the tag `mb/old-migrations-test`. `__ADDITIONAL_EXCLUDED_TAG__` is not used anywhere outside of splicing
@@ -81,7 +86,7 @@ jobs:
MB_DB_TYPE: mysql
MB_DB_HOST: localhost
MB_DB_PORT: 3306
MB_DB_DBNAME: circle_test
MB_DB_DBNAME: mb_test
MB_DB_USER: root
MB_MYSQL_TEST_USER: root
#
@@ -105,6 +110,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Test ${{ matrix.version.name }}
id: test-driver
uses: ./.github/actions/test-driver
with:
build-static-viz: ${{ matrix.job.build-static-viz }}
@@ -123,18 +129,19 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
be-tests-mysql:
if: ${{ !inputs.skip }}
runs-on: ubuntu-22.04
timeout-minutes: 60
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 40
strategy:
fail-fast: false
matrix:
version:
- name: MySQL 8.0
junit-name: be-tests-mysql-8-0-ee
image: cimg/mysql:8.0
image: mysql:8.0
env:
enable-ssl-tests: 'false'
enable-aws-iam-tests: 'false'
@@ -172,7 +179,7 @@ jobs:
- "3306:3306"
env:
MYSQL_ALLOW_EMPTY_PASSWORD: true
MYSQL_DATABASE: circle_test
MYSQL_DATABASE: mb_test
env:
# Only run old migrations tests on pushes to master or release branches. All other branches should skip tests
# with the tag `mb/old-migrations-test`. `__ADDITIONAL_EXCLUDED_TAG__` is not used anywhere outside of splicing
@@ -195,7 +202,7 @@ jobs:
MB_DB_TYPE: mysql
MB_DB_HOST: localhost
MB_DB_PORT: 3306
MB_DB_DBNAME: circle_test
MB_DB_DBNAME: mb_test
MB_DB_USER: root
MB_MYSQL_TEST_USER: root
#
@@ -227,6 +234,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Test ${{ matrix.version.name }}
id: test-driver
uses: ./.github/actions/test-driver
with:
build-static-viz: ${{ matrix.job.build-static-viz }}
@@ -245,11 +253,12 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
be-tests-postgres:
if: ${{ !inputs.skip }}
runs-on: ubuntu-22.04
timeout-minutes: 60
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 40
strategy:
fail-fast: false
matrix:
@@ -336,6 +345,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Test ${{ matrix.version.name }} (${{ matrix.job.name }})
id: test-driver
uses: ./.github/actions/test-driver
with:
build-static-viz: ${{ matrix.job.build-static-viz }}
@@ -354,13 +364,14 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
app-db-tests-result:
needs:
- be-tests-mariadb
- be-tests-mysql
- be-tests-postgres
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
name: app-db-tests-result
if: always() && !cancelled()

View File

@@ -11,7 +11,7 @@ on:
jobs:
deploy:
name: Publish Athena JDBC Driver
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 10
steps:
- name: Check out the code

View File

@@ -7,7 +7,7 @@ on:
jobs:
update_pr:
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
steps:
- uses: tibdex/github-app-token@v2.1.0

View File

@@ -20,7 +20,7 @@ jobs:
github.event.label.name == 'triple-backport'
)
)
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
steps:
- uses: actions/checkout@v4
with:

View File

@@ -16,7 +16,7 @@ on:
jobs:
setup-oss:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
outputs:
modules: ${{ steps.get-modules.outputs.modules }}
steps:
@@ -30,7 +30,7 @@ jobs:
needs: setup-oss
# don't run this workflow on a cron for forks
if: ${{ github.event_name != 'schedule' || github.repository == 'metabase/metabase' }}
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 30
strategy:
fail-fast: false
@@ -63,7 +63,7 @@ jobs:
flags: back-end
setup-ee:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
outputs:
modules: ${{ steps.get-modules.outputs.modules }}
steps:
@@ -77,7 +77,7 @@ jobs:
needs: setup-ee
# don't run this workflow on a cron for forks
if: ${{ github.event_name != 'schedule' || github.repository == 'metabase/metabase' }}
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 30
strategy:
fail-fast: false

View File

@@ -14,7 +14,7 @@ concurrency:
jobs:
be-linter-clj-kondo:
if: ${{ !inputs.skip }}
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 10
name: Clj-Kondo
steps:
@@ -26,7 +26,7 @@ jobs:
be-linter-eastwood:
if: ${{ !inputs.skip }}
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 20
name: Eastwood
steps:
@@ -36,10 +36,22 @@ jobs:
- run: clojure -X:dev:ee:ee-dev:drivers:drivers-dev:test:eastwood
name: Run Eastwood linter
be-linter-eastwood-test:
if: ${{ !inputs.skip }}
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 30
name: Eastwood (test)
steps:
- uses: actions/checkout@v4
- name: Prepare back-end environment
uses: ./.github/actions/prepare-backend
- run: clojure -X:dev:ee:ee-dev:drivers:drivers-dev:test:eastwood/test
name: Run Eastwood linter on tests
be-tests:
if: ${{ !inputs.skip }}
runs-on: ubuntu-22.04
timeout-minutes: 60
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 40
strategy:
fail-fast: false
matrix:
@@ -130,6 +142,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.run-java-tests.outcome }}
- name: Publish Test Report (JUnit)
uses: dorny/test-reporter@v1
@@ -154,7 +167,7 @@ jobs:
# as `:dev` dependencies). See #27009 for more context.
be-check:
if: ${{ !inputs.skip }}
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 10
strategy:
matrix:
@@ -170,7 +183,7 @@ jobs:
be-cljfmt:
if: ${{ !inputs.skip }}
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 10
name: Cljfmt
steps:
@@ -183,12 +196,13 @@ jobs:
be-tests-result:
needs:
- be-linter-eastwood
- be-linter-eastwood-test
- be-linter-clj-kondo
- be-cljfmt
- be-check
- be-tests
if: always() && !cancelled()
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
env:
needs: ${{ toJson(needs) }}

View File

@@ -10,7 +10,7 @@ on:
jobs:
backport-reminder:
name: Decide whether to backport or not
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
steps:
- uses: jesusvasquez333/verify-pr-label-action@v1.4.0

View File

@@ -5,7 +5,7 @@ on:
jobs:
check-source-branch:
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
steps:
- name: Block master branch PRs
if: github.head_ref == 'master'

View File

@@ -14,7 +14,7 @@ on:
jobs:
start-message:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
steps:
- uses: actions/checkout@v4
@@ -45,7 +45,7 @@ jobs:
}).catch(console.error);
trigger-milestone-check:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
needs: start-message
steps:
@@ -66,7 +66,7 @@ jobs:
check-version:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 10
outputs:
ee: ${{ fromJson(steps.canonical_version.outputs.result).ee }}
@@ -118,7 +118,7 @@ jobs:
return versions;
check-commit:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 10
steps:
- name: Check out the code to verify the release branch
@@ -150,7 +150,7 @@ jobs:
git checkout -
get-build-requirements:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 10
outputs:
java_version: ${{ fromJson(steps.dependencies.outputs.result).java_version }}
@@ -185,7 +185,7 @@ jobs:
build-uberjar-for-release:
needs: [check-version, check-commit, get-build-requirements]
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 50
strategy:
matrix:

View File

@@ -10,7 +10,7 @@ on:
jobs:
test-build-scripts:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
steps:
- uses: actions/checkout@v4
- name: Prepare back-end environment

View File

@@ -39,7 +39,7 @@ concurrency:
jobs:
get-cache-keys:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
steps:
- uses: actions/checkout@v4
- name: Get cache keys
@@ -52,7 +52,7 @@ jobs:
cypress-cache-key: ${{ steps.get-cache-keys.outputs.cypress-cache-key }}
generate-caches:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 30
needs: get-cache-keys
env:

View File

@@ -7,7 +7,7 @@ on:
jobs:
check-backport-script:
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
steps:
- name: Checkout code
uses: actions/checkout@v4

View File

@@ -15,7 +15,7 @@ on:
jobs:
set-milestone:
name: Automatically set milestone
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 30
env:
isNewReleaseBranch: ${{ github.event_name == 'workflow_dispatch' }}

View File

@@ -14,7 +14,7 @@ concurrency:
jobs:
files-changed:
name: Check which files changed
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 3
outputs:
frontend_all: ${{ steps.changes.outputs.frontend_all }}
@@ -30,7 +30,7 @@ jobs:
fe-chromatic:
needs: files-changed
if: contains(github.event.pull_request.labels.*.name, 'chromatic') || (github.ref_name == 'master' && needs.files-changed.outputs.frontend_all == 'true')
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
steps:
- name: Checkout repository
uses: actions/checkout@v4

View File

@@ -1,360 +0,0 @@
name: "Claude Code Bug Fix"
on:
issues:
types:
- labeled
pull_request_review:
types:
- submitted
workflow_dispatch:
inputs:
issue_number:
description: "Issue number to fix"
required: true
type: string
override_employee_check:
description: "Override employee check for issue creator"
required: false
default: false
type: boolean
jobs:
auto-fix-bug:
runs-on: ubuntu-latest
timeout-minutes: 30
permissions:
contents: write
issues: write
pull-requests: write
id-token: write
if: |
(github.event_name == 'issues' && github.event.label.name == 'Claude Bug Fix' && github.event.issue.state == 'open') ||
(github.event_name == 'workflow_dispatch') ||
(github.event_name == 'pull_request_review' && github.event.review.state == 'changes_requested' && startsWith(github.event.pull_request.head.ref, 'claude-fix/'))
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
token: ${{ secrets.GITHUB_TOKEN }}
- name: Get issue data and check employee status
id: get_issue
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const { getIssueData } = require('${{ github.workspace }}/.github/scripts/get-issue-data.js');
try {
const result = await getIssueData({
context,
github,
manualIssueNumber: '${{ github.event.inputs.issue_number }}'
});
const { issueNumber, issueData, employeeComments, prReviews, triggerType, isIssueAuthorEmployee } = result;
// Check employee status and fail if not authorized
if (!result.isIssueAuthorEmployee && '${{ github.event.inputs.override_employee_check }}' !== 'true') {
core.setFailed(`User ${result.issueData.user.login} is not a Metabase employee. Skipping bug fix automation.`);
}
core.setOutput('issue_number', issueNumber);
core.setOutput('issue_data', JSON.stringify(issueData));
core.setOutput('issue_comments', JSON.stringify(employeeComments));
core.setOutput('pr_reviews', JSON.stringify(prReviews));
core.setOutput('trigger_type', triggerType);
} catch (error) {
core.setFailed(error.message);
}
- name: Find linked Linear issue
id: find_linear
continue-on-error: true
uses: actions/github-script@v7
env:
LINEAR_API_KEY: ${{ secrets.LINEAR_API_KEY }}
ISSUE_NUMBER: ${{ steps.get_issue.outputs.issue_number }}
with:
script: |
const { findLinearIssue } = require('${{ github.workspace }}/.github/scripts/find-linear-issue.js');
const githubIssueUrl = `https://github.com/${context.repo.owner}/${context.repo.repo}/issues/${process.env.ISSUE_NUMBER}`;
const result = await findLinearIssue({
githubIssueUrl,
linearApiKey: process.env.LINEAR_API_KEY
});
if (result.success) {
console.log(`Found Linear issue: ${result.issue}`);
core.setOutput('linear_issue', result.issue);
} else {
console.log(`Could not find Linear issue: ${result.message}`);
}
- name: Set up git configuration
run: |
git config --global user.name "Claude Code[bot]"
git config --global user.email "noreply@anthropic.com"
- name: Prepare issue context and bug fix prompt
id: prepare_prompt
uses: actions/github-script@v7
env:
ISSUE_DATA: ${{ steps.get_issue.outputs.issue_data }}
ISSUE_COMMENTS: ${{ steps.get_issue.outputs.issue_comments }}
PR_REVIEWS: ${{ steps.get_issue.outputs.pr_reviews }}
TRIGGER_TYPE: ${{ steps.get_issue.outputs.trigger_type }}
with:
script: |
const issueData = JSON.parse(process.env.ISSUE_DATA);
const issueComments = JSON.parse(process.env.ISSUE_COMMENTS);
const prReviews = JSON.parse(process.env.PR_REVIEWS);
const triggerType = process.env.TRIGGER_TYPE;
const issueNumber = '${{ steps.get_issue.outputs.issue_number }}';
// Convert issue title to kebab case and create branch name
const issueTitle = issueData.title || 'untitled';
const kebabTitle = issueTitle
.toLowerCase()
.replace(/[^a-z0-9]+/g, '-')
.replace(/^-+|-+$/g, '')
.replace(/-+/g, '-')
.substring(0, 50);
const branchName = `claude-fix/issue-${issueNumber}-${kebabTitle}`;
// Format data for bash environment
const formattedComments = issueComments.length > 0
? issueComments.map(comment =>
`**Comment by @${comment.user.login} on ${comment.created_at}:**\n${comment.body}`
).join('\n\n---\n\n')
: '';
const formattedReviews = prReviews.length > 0
? prReviews.map(review =>
`**Review by @${review.user.login} on ${review.submitted_at} (Changes Requested):**\n${review.body || 'No review comment provided'}`
).join('\n\n---\n\n')
: '';
core.exportVariable('BRANCH_NAME', branchName);
core.exportVariable('ISSUE_NUMBER', issueNumber);
core.exportVariable('ISSUE_TITLE', issueData.title);
core.exportVariable('ISSUE_AUTHOR', issueData.user.login);
core.exportVariable('ISSUE_CREATED', issueData.created_at);
core.exportVariable('ISSUE_BODY', issueData.body || 'No description provided');
core.exportVariable('ISSUE_COMMENTS_FORMATTED', formattedComments);
core.exportVariable('PR_REVIEWS_FORMATTED', formattedReviews);
core.exportVariable('TRIGGER_TYPE', triggerType);
- name: Generate bug fix prompt
run: |
cat << 'EOF' >> $GITHUB_ENV
BUG_FIX_PROMPT<<PROMPT_END
You are helping to fix a bug reported in GitHub issue #${{ env.ISSUE_NUMBER }}.
## Bug Report Details
**Title:** ${{ env.ISSUE_TITLE }}
**Reporter:** ${{ env.ISSUE_AUTHOR }}
**Created:** ${{ env.ISSUE_CREATED }}
**Description:**
${{ env.ISSUE_BODY }}
**Comments:**
${{ env.ISSUE_COMMENTS_FORMATTED }}
EOF
# Add review feedback section only if this is a review trigger
if [ "${{ env.TRIGGER_TYPE }}" = "pull_request_review" ]; then
cat << 'EOF' >> $GITHUB_ENV
## Previous Fix Attempt - Review Feedback (MUST ADDRESS)
Your previous automated fix attempt received the following feedback that needs to be addressed:
${{ env.PR_REVIEWS_FORMATTED }}
EOF
fi
# Add the rest of the prompt (always the same)
cat << 'EOF' >> $GITHUB_ENV
## Instructions
1. **Analyze the issue description and comments** - Understand what the issue is describing
a. Pay particular attention to reproduction steps and if there's an agreed upon fix.
2. **Search the codebase** - Use Grep and Glob tools to find relevant files
3. **Implement a fix** - Use the appropriate write skill based on the file types:
- Use clojure-write for Clojure/ClojureScript files
- Use typescript-write for TypeScript/JavaScript files
- Follow the coding standards and patterns in each skill
4. **Test the fix** - Run appropriate tests as specified in the skills
5. **Verify the fix** - Ensure tests pass and code follows conventions
## Important Guidelines
- Use the appropriate write skill for the language you're working in
- Write failing tests first, then fix them
- Work in small, testable increments
- Don't commit changes - leave that for the workflow
- IMPORTANT: Focus only on fixing the reported bug, don't make unrelated changes
## Scratchpad Directory
A `.claude-scratchpad/` directory has been created for your temporary files:
- Use this directory for ALL temporary verification files. However, prefer using production test files rather than adhoc ones.
- Only modify actual production code in the main repository directories
- The scratchpad will be cleaned up automatically - nothing from it will be committed
Start by understanding the bug and then systematically work toward a solution.
PROMPT_END
EOF
- name: Determine branch strategy
run: |
BRANCH_NAME="${{ env.BRANCH_NAME }}"
if git branch -r --list "origin/${BRANCH_NAME}" | grep -q .; then
echo "Branch already exists: $BRANCH_NAME"
echo "Will push to existing branch and skip PR creation"
echo "BRANCH_EXISTS=true" >> $GITHUB_ENV
else
echo "Creating new branch: $BRANCH_NAME"
echo "Will create new PR"
echo "BRANCH_EXISTS=false" >> $GITHUB_ENV
fi
# Export the branch name
echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV
- name: Create scratchpad directory for Claude
run: |
# Create a scratchpad directory for Claude to use for temporary files
mkdir -p .claude-scratchpad
echo "Scratchpad directory created for Claude's temporary verification files"
- name: Prepare front-end environment
uses: ./.github/actions/prepare-frontend
- name: Prepare back-end environment
uses: ./.github/actions/prepare-backend
- name: Generate GitHub App Token for Claude
uses: actions/create-github-app-token@v1
id: claude-app-token
with:
app-id: ${{ secrets.METABASE_BOT_APP_ID }}
private-key: ${{ secrets.METABASE_BOT_APP_PRIVATE_KEY }}
- name: Generate Bug Fix with Claude Code
uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
github_token: ${{ steps.claude-app-token.outputs.token }}
prompt: ${{ env.BUG_FIX_PROMPT }}
claude_args: |
--allowedTools "Bash(bun run test-unit*),Bash(bun run lint-eslint-pure),Bash(./bin/mage*),Bash(clojure*),Bash(find*),Bash(ls*),Bash(grep*),Write,Read,Glob,Grep,Edit,MultiEdit"
--disallowedTools "Bash(git commit*),Bash(git push*),Bash(gh*)"
- name: Clean up scratchpad directory
run: |
# Remove the scratchpad directory so its contents don't get committed
rm -rf .claude-scratchpad/
# Remove output file generated by Claude Code action
rm -f output.txt
echo "Scratchpad directory and action output files cleaned up"
- name: Check for changes and analysis
id: check_changes
run: |
# Now check for actual code changes (excluding analysis file)
if [ -n "$(git status --porcelain)" ]; then
echo "has_changes=true" >> $GITHUB_OUTPUT
echo "Changes detected:"
git status --short
else
echo "has_changes=false" >> $GITHUB_OUTPUT
echo "No changes made by Claude."
fi
- name: Get issue team labels and prepare reviewers
if: steps.check_changes.outputs.has_changes == 'true'
id: prepare_reviewers
uses: actions/github-script@v7
env:
ISSUE_DATA: ${{ steps.get_issue.outputs.issue_data }}
with:
script: |
const issueData = JSON.parse(process.env.ISSUE_DATA);
const issueLabels = issueData.labels.map(label => label.name);
const teamLabels = issueLabels.filter(label => label.startsWith('.Team/'));
const issueCreator = issueData.user.login;
core.setOutput('team_labels', teamLabels.join(','));
core.setOutput('reviewers', issueCreator);
- name: Create Pull Request
id: create_pr
if: steps.check_changes.outputs.has_changes == 'true'
uses: peter-evans/create-pull-request@v6
with:
token: ${{ secrets.GITHUB_TOKEN }}
branch: ${{ env.BRANCH_NAME }}
base: master
commit-message: |
Fix: ${{ env.ISSUE_TITLE }}
Fixes #${{ env.ISSUE_NUMBER }}
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
committer: "Claude Code[bot] <noreply@anthropic.com>"
author: "Claude Code[bot] <noreply@anthropic.com>"
title: "Fix: ${{ env.ISSUE_TITLE }}"
body: |
This PR automatically fixes the bug reported in #${{ env.ISSUE_NUMBER }}.
${{ steps.find_linear.outputs.linear_issue && format('Closes {0}', steps.find_linear.outputs.linear_issue) || '' }}
## Bug Report
**Original Issue:** #${{ env.ISSUE_NUMBER }}
**Reporter:** @${{ env.ISSUE_AUTHOR }}
**Issue Title:** ${{ env.ISSUE_TITLE }}
## Automated Fix
🤖 This fix was generated automatically by Claude Code based on the issue description.
**Please review carefully:**
- [ ] The fix addresses the reported issue
- [ ] Tests pass and code follows conventions
- [ ] No unrelated changes were introduced
- [ ] The solution is appropriate and maintainable
## Next Steps
- Review the changes and test thoroughly
- If the fix looks good, approve and merge
- If issues are found, either fix them or close this PR
---
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
labels: |
${{ steps.prepare_reviewers.outputs.team_labels }}
automated-fix
ci skip
reviewers: ${{ steps.prepare_reviewers.outputs.reviewers }}
assignees: ${{ github.actor }}
- name: Log existing branch update
if: steps.check_changes.outputs.has_changes == 'true' && env.BRANCH_EXISTS == 'true'
uses: actions/github-script@v7
with:
script: |
console.log('🔄 Updated existing branch: ${{ env.BRANCH_NAME }}');
console.log('The changes have been pushed to the existing PR for this issue.');
- name: Log analysis for no changes
if: steps.check_changes.outputs.has_changes == 'false'
uses: actions/github-script@v7
with:
script: |
console.log('🤖 No code changes were made by Claude.');

View File

@@ -1,98 +0,0 @@
name: "Claude Code Review"
on:
pull_request:
types:
- closed
- synchronize
- labeled
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref && github.ref || github.run_id }}-claude-code-review
cancel-in-progress: true
jobs:
review:
if: |
(
github.event.action == 'closed' &&
github.event.pull_request.merged == true
) ||
contains(github.event.pull_request.labels.*.name, 'Claude Code Review')
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 1
# Make sure the value of GITHUB_TOKEN will not be persisted in repo's config
persist-credentials: false
# Apparently comments on specific lines and top-level comments about the PR as a whole are TWO TOTALLY DIFFERENT
# TYPES OF THINGS. So we have to fetch and delete separately.
- name: Delete old Claude PR review comments
env:
GH_TOKEN: ${{ github.token }}
REPO: ${{ github.repository }}
PR_NUMBER: ${{ github.event.pull_request.number }}
shell: bash
run: |
# Get old comment IDs from the bot
old_line_comment_ids=$(gh api "/repos/$REPO/pulls/$PR_NUMBER/comments" --jq '.[] | select(.user.login=="metabase-bot[bot]") | .id')
echo "Deleting line comments: $old_line_comment_ids"
# Delete each comment
for id in $old_line_comment_ids; do
gh api -X DELETE "/repos/$REPO/pulls/comments/$id"
echo "Deleted line comment $id"
done
# Get old top-level comment IDs (technically "issue" comments on the PR?)
old_top_level_comment_ids=$(gh api "/repos/$REPO/issues/$PR_NUMBER/comments" --jq '.[] | select(.user.login=="metabase-bot[bot]") | .id')
echo "Deleting top-level comments: $old_top_level_comment_ids"
# Delete each comment
for id in $old_top_level_comment_ids; do
gh api -X DELETE "/repos/$REPO/issues/comments/$id"
echo "Deleted top-level comment $id"
done
- name: Generate GitHub App Token for Claude
uses: actions/create-github-app-token@v1
id: claude-app-token
with:
app-id: ${{ secrets.METABASE_BOT_APP_ID }}
private-key: ${{ secrets.METABASE_BOT_APP_PRIVATE_KEY }}
permission-contents: read # Required for reading repository files and PR diffs
permission-pull-requests: write # Required for creating inline comments and PR comments
- name: Fetch Community Clojure Style Guide
run: >-
curl https://raw.githubusercontent.com/bbatsov/clojure-style-guide/refs/heads/master/README.adoc -o CLOJURE_STYLE_GUIDE.adoc
- uses: anthropics/claude-code-action@v1
timeout-minutes: 10
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
github_token: ${{ steps.claude-app-token.outputs.token }}
prompt: |
REPO: ${{ github.repository }}
PR NUMBER: ${{ github.event.pull_request.number }}
Review this pull request for compliance with project coding standards and conventions.
**Use the appropriate review skill based on the file types changed:**
- Use clojure-review for Clojure/ClojureScript files
- Use typescript-review for TypeScript/JavaScript files
- Follow the review guidelines and checklists in each skill
DO NOT post any comments confirming that something is correct - only post comments for style violations or concerns.
Note: The PR branch is already checked out in the current working directory.
Use `gh pr comment` for top-level feedback.
Use `mcp__github_inline_comment__create_inline_comment` to highlight specific code issues.
Only post GitHub comments - don't submit review text as messages.
claude_args: |
--allowedTools "mcp__github_inline_comment__create_inline_comment,Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr view:*),ReadFile(CLOJURE_STYLE_GUIDE.adoc)"

View File

@@ -1,103 +0,0 @@
name: "Claude Docs Review"
on:
pull_request:
types:
- opened
- synchronize
- reopened
paths:
- 'docs/**/*.md'
- 'docs/**/*.mdx'
workflow_dispatch:
inputs:
pr_number:
description: 'PR number to review'
required: true
type: number
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref && github.ref || github.run_id }}-claude-docs-review
cancel-in-progress: true
jobs:
review:
runs-on: ubuntu-latest
if: github.event.pull_request.draft == false
permissions:
contents: read
pull-requests: write
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 1
# Make sure the value of GITHUB_TOKEN will not be persisted in repo's config
persist-credentials: false
- name: Generate GitHub App Token for Claude
uses: actions/create-github-app-token@v1
id: claude-app-token
with:
app-id: ${{ secrets.METABASE_BOT_APP_ID }}
private-key: ${{ secrets.METABASE_BOT_APP_PRIVATE_KEY }}
permission-contents: read # Required for reading repository files and PR diffs
permission-pull-requests: write # Required for creating inline comments and PR comments
- name: Delete old Claude docs review comments
env:
GH_TOKEN: ${{ steps.claude-app-token.outputs.token }}
REPO: ${{ github.repository }}
PR_NUMBER: ${{ github.event.pull_request.number || github.event.inputs.pr_number }}
shell: bash
run: |
# Delete pending reviews first (these can be deleted entirely)
pending_review_ids=$(gh api "/repos/$REPO/pulls/$PR_NUMBER/reviews" --jq '.[] | select(.user.login=="metabase-bot[bot]" and .state=="PENDING") | .id')
if [ -n "$pending_review_ids" ]; then
echo "Deleting pending reviews: $pending_review_ids"
for id in $pending_review_ids; do
gh api -X DELETE "/repos/$REPO/pulls/$PR_NUMBER/reviews/$id"
echo "Deleted pending review $id"
done
fi
# Delete individual inline comments from submitted reviews (can't delete the review itself)
old_line_comment_ids=$(gh api "/repos/$REPO/pulls/$PR_NUMBER/comments" --jq '.[] | select(.user.login=="metabase-bot[bot]") | .id')
if [ -n "$old_line_comment_ids" ]; then
echo "Deleting line comments: $old_line_comment_ids"
for id in $old_line_comment_ids; do
gh api -X DELETE "/repos/$REPO/pulls/comments/$id"
echo "Deleted line comment $id"
done
fi
# Delete top-level review comments
old_top_level_comment_ids=$(gh api "/repos/$REPO/issues/$PR_NUMBER/comments" --jq '.[] | select(.user.login=="metabase-bot[bot]") | .id')
if [ -n "$old_top_level_comment_ids" ]; then
echo "Deleting top-level comments: $old_top_level_comment_ids"
for id in $old_top_level_comment_ids; do
gh api -X DELETE "/repos/$REPO/issues/comments/$id"
echo "Deleted top-level comment $id"
done
fi
- uses: anthropics/claude-code-action@v1
timeout-minutes: 10
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
github_token: ${{ steps.claude-app-token.outputs.token }}
show_full_output: true
prompt: |
REPO: ${{ github.repository }}
PR NUMBER: ${{ github.event.pull_request.number || github.event.inputs.pr_number }}
Review the documentation changes in this pull request.
Use the docs-review skill to review all changed documentation files for compliance with the Metabase writing style guide.
IMPORTANT: Only review markdown files (.md and .mdx). Skip any .txt files or other non-markdown files.
DO NOT post any comments confirming that something is correct - only post comments for style violations or concerns.
claude_args: |
--allowedTools "Skill,mcp__github__get_pull_request,mcp__github__get_pull_request_files,mcp__github__create_pending_pull_request_review,mcp__github__get_pull_request_diff,mcp__github__add_comment_to_pending_review,mcp__github__add_pull_request_review_comment_to_pending_review,mcp__github__delete_pending_pull_request_review,mcp__github__submit_pending_pull_request_review"

View File

@@ -14,7 +14,7 @@ concurrency:
jobs:
files-changed:
name: Check which files changed
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 3
outputs:
cljs: ${{ steps.changes.outputs.cljs }}
@@ -30,7 +30,7 @@ jobs:
shared-tests-cljs:
needs: files-changed
if: needs.files-changed.outputs.cljs == 'true'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 15
steps:
- uses: actions/checkout@v4

View File

@@ -10,7 +10,7 @@ on:
jobs:
files-changed:
name: Check which files changed
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 3
outputs:
codeql: ${{ steps.changes.outputs.codeql }}
@@ -25,7 +25,7 @@ jobs:
analyze:
needs: files-changed
if: needs.files-changed.outputs.codeql == 'true'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
steps:
- name: Checkout repository
uses: actions/checkout@v4

View File

@@ -8,7 +8,7 @@ on:
jobs:
codespell:
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 30
permissions:
contents: write

View File

@@ -48,7 +48,7 @@ on:
jobs:
containerize:
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 15
outputs:
platforms: ${{ steps.platforms.outputs.result }}
@@ -117,7 +117,7 @@ jobs:
bin/docker/.
verify-docker-pull:
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
needs: containerize
timeout-minutes: 15
steps:

View File

@@ -6,7 +6,7 @@ on:
jobs:
get-container-info:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
name: Get container info
outputs:
@@ -68,7 +68,7 @@ jobs:
strategy:
matrix:
edition: ${{ fromJson(needs.get-container-info.outputs.editions) }}
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
name: Run Trivy vulnerability scanner
steps:
- name: Check out the code
@@ -76,7 +76,7 @@ jobs:
with:
ref: ${{ github.event.inputs.commit || github.event.pull_request.head.sha || github.sha }}
- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@0.29.0
uses: aquasecurity/trivy-action@57a97c7e7821a5776cebc9bb87c984fa69cba8f1
env:
TRIVY_OFFLINE_SCAN: true
repo: ${{ fromJson(needs.get-container-info.outputs[matrix.edition]).repo }}
@@ -85,7 +85,6 @@ jobs:
image-ref: docker.io/${{ env.repo }}:${{ env.tag }}
format: sarif
output: trivy-results.sarif
version: "v0.57.1"
- name: Upload Trivy scan results to GitHub Security tab
uses: github/codeql-action/upload-sarif@v3
with:
@@ -94,7 +93,7 @@ jobs:
post-comment:
needs: [get-container-info, containerize]
if: github.event_name == 'pull_request'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
name: Post PR comment
steps:
- name: Check out the code

View File

@@ -8,7 +8,7 @@ on:
jobs:
files-changed:
name: Check which files changed
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 3
outputs:
frontend_embedding_sources: ${{ steps.changes.outputs.frontend_embedding_sources }}
@@ -22,7 +22,7 @@ jobs:
filters: .github/file-paths.yaml
pr-title-reminder:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
permissions:
pull-requests: write

View File

@@ -7,7 +7,7 @@ on:
jobs:
fe-test-coverage:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 60
steps:
- uses: actions/checkout@v4

View File

@@ -25,7 +25,7 @@ concurrency:
jobs:
migrations-h2-ee:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 10
env:
CI: 'true'
@@ -39,7 +39,7 @@ jobs:
head-ref: ${{ env.HEAD_REF }}
migrations-postgres-12-ee:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 10
env:
CI: 'true'
@@ -65,7 +65,7 @@ jobs:
head-ref: ${{ env.HEAD_REF }}
migrations-postgres-latest-ee:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 10
env:
CI: 'true'
@@ -76,7 +76,7 @@ jobs:
MB_DB_USER: circle_test
services:
postgres:
image: circleci/postgres:latest
image: postgres:latest
ports:
- "5432:5432"
env:
@@ -91,7 +91,7 @@ jobs:
head-ref: ${{ env.HEAD_REF }}
migrations-mysql-8-0-ee:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 10
env:
CI: 'true'
@@ -102,7 +102,7 @@ jobs:
MB_DB_USER: root
services:
mysql:
image: cimg/mysql:8.0
image: mysql:8.0
ports:
- "3306:3306"
steps:
@@ -113,7 +113,7 @@ jobs:
head-ref: ${{ env.HEAD_REF }}
migrations-mysql-latest-ee:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 10
env:
CI: 'true'
@@ -139,7 +139,7 @@ jobs:
head-ref: ${{ env.HEAD_REF }}
migrations-mariadb-10-2-ee:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 10
env:
CI: 'true'
@@ -150,7 +150,7 @@ jobs:
MB_DB_USER: root
services:
mariadb:
image: circleci/mariadb:10.2.23
image: metabase/mariadb:10.2.23
ports:
- "3306:3306"
steps:
@@ -161,7 +161,7 @@ jobs:
head-ref: ${{ env.HEAD_REF }}
migrations-mariadb-latest-ee:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 10
env:
CI: 'true'
@@ -172,7 +172,7 @@ jobs:
MB_DB_USER: root
services:
mariadb:
image: circleci/mariadb:latest
image: mariadb:latest
ports:
- "3306:3306"
steps:

View File

@@ -21,7 +21,7 @@ permissions:
jobs:
update-docs:
name: Update documentation for ${{ inputs.target_branch }}
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 30
steps:
- name: Checkout code

View File

@@ -7,7 +7,7 @@ on:
jobs:
link-checker:
name: Check documentation links
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
permissions:
contents: read

View File

@@ -49,7 +49,7 @@ jobs:
be-tests-athena-ee:
if: inputs.driver == 'Athena'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 90
env:
CI: 'true'
@@ -68,7 +68,7 @@ jobs:
be-tests-bigquery-cloud-sdk-ee:
if: inputs.driver == 'BigQuery'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 90
env:
CI: 'true'
@@ -89,7 +89,7 @@ jobs:
be-tests-druid-ee:
if: inputs.driver == 'Druid'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 90
env:
CI: 'true'
@@ -111,7 +111,7 @@ jobs:
be-tests-mariadb-10-2-ee:
if: inputs.driver == 'Maria DB'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 90
env:
CI: 'true'
@@ -124,7 +124,7 @@ jobs:
MB_MYSQL_TEST_USER: root
services:
mariadb:
image: circleci/mariadb:10.2.23
image: metabase/mariadb:10.2.23
ports:
- "3306:3306"
steps:
@@ -137,7 +137,7 @@ jobs:
be-tests-mariadb-latest-ee:
if: inputs.driver == 'Maria DB (latest)'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 90
env:
CI: 'true'
@@ -150,7 +150,7 @@ jobs:
MB_MYSQL_TEST_USER: root
services:
mariadb:
image: circleci/mariadb:latest
image: mariadb:latest
ports:
- "3306:3306"
steps:
@@ -163,7 +163,7 @@ jobs:
be-tests-mongo-4-4-ee:
if: inputs.driver == 'Mongo 4'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 90
env:
CI: 'true'
@@ -185,7 +185,7 @@ jobs:
be-tests-mongo-4-4-ssl-ee:
if: inputs.driver == 'Mongo 4 (SSL)'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 90
env:
CI: 'true'
@@ -219,7 +219,7 @@ jobs:
be-tests-mongo-5-0-ee:
if: inputs.driver == 'Mongo 5'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 90
env:
CI: 'true'
@@ -241,7 +241,7 @@ jobs:
be-tests-mongo-5-0-ssl-ee:
if: inputs.driver == 'Mongo 5 (SSL)'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 90
env:
CI: 'true'
@@ -275,7 +275,7 @@ jobs:
be-tests-mongo-latest-ee:
if: inputs.driver == 'Mongo (latest)'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 90
env:
CI: 'true'
@@ -284,7 +284,7 @@ jobs:
MB_MONGO_TEST_PASSWORD: metasample123
services:
mongodb:
image: circleci/mongo:latest
image: mongo:latest
ports:
- "27017:27017"
env:
@@ -300,7 +300,7 @@ jobs:
be-tests-mysql-8-0-ee:
if: inputs.driver == 'MySQL'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 90
env:
CI: 'true'
@@ -313,7 +313,7 @@ jobs:
MB_MYSQL_TEST_USER: root
services:
mysql:
image: cimg/mysql:8.0
image: mysql:8.0
ports:
- "3306:3306"
steps:
@@ -326,7 +326,7 @@ jobs:
be-tests-mysql-latest-ee:
if: inputs.driver == 'MySQL (latest)'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 90
env:
CI: 'true'
@@ -364,7 +364,7 @@ jobs:
be-tests-oracle-18-4-ee:
if: inputs.driver == 'Oracle 18'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 90
env:
CI: 'true'
@@ -390,7 +390,7 @@ jobs:
be-tests-oracle-21-3-ee:
if: inputs.driver == 'Oracle 21'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 90
env:
CI: 'true'
@@ -425,7 +425,7 @@ jobs:
be-tests-postgres-ee:
if: inputs.driver == 'Postgres'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 90
env:
CI: 'true'
@@ -455,7 +455,7 @@ jobs:
be-tests-postgres-latest-ee:
if: inputs.driver == 'Postgres (latest)'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 90
env:
CI: 'true'
@@ -471,7 +471,7 @@ jobs:
MB_POSTGRES_SSL_TEST_SSL_ROOT_CERT_PATH: 'test-resources/certificates/us-east-2-bundle.pem'
services:
postgres:
image: circleci/postgres:latest
image: postgres:latest
ports:
- "5432:5432"
env:
@@ -488,7 +488,7 @@ jobs:
be-tests-presto-jdbc-ee:
if: inputs.driver == 'Presto JDBC'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 90
env:
CI: 'true'
@@ -537,7 +537,7 @@ jobs:
be-tests-redshift-ee:
if: inputs.driver == 'Redshift'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 90
env:
CI: 'true'
@@ -556,7 +556,7 @@ jobs:
be-tests-snowflake-ee:
if: inputs.driver == 'Snowflake'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 90
env:
CI: 'true'
@@ -577,7 +577,7 @@ jobs:
be-tests-sparksql-ee:
if: inputs.driver == 'SparkSQL'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 90
env:
CI: 'true'
@@ -597,7 +597,7 @@ jobs:
be-tests-sqlite-ee:
if: inputs.driver == 'SQLite'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 90
env:
CI: 'true'
@@ -612,7 +612,7 @@ jobs:
be-tests-sqlserver-2017-ee:
if: inputs.driver == 'SQL Server 2017'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 90
env:
CI: 'true'
@@ -639,7 +639,7 @@ jobs:
be-tests-sqlserver-2022-ee:
if: inputs.driver == 'SQL Server 2022'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 90
env:
CI: 'true'
@@ -666,7 +666,7 @@ jobs:
be-tests-starburst-ee:
if: inputs.driver == 'Starburst'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 90
env:
CI: 'true'
@@ -691,7 +691,7 @@ jobs:
login-to-ecr:
if: inputs.driver == 'Vertica'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 15
permissions:
id-token: write
@@ -720,7 +720,7 @@ jobs:
be-tests-vertica-ee:
if: inputs.driver == 'Vertica'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
needs: login-to-ecr
timeout-minutes: 90
env:

View File

@@ -15,7 +15,7 @@ jobs:
# This job determines which driver tests should run based on PR context.
# All decision logic is consolidated in mage driver-decisions.
determine-driver-skips:
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
outputs:
# All driver run decisions (from mage driver-decisions)
h2-should-run: ${{ steps.driver-decisions.outputs.h2-should-run }}
@@ -72,13 +72,19 @@ jobs:
# All decision logic is in mage - it analyzes module dependencies,
# branch context, labels, and file changes to decide what runs.
MAGE_ARGS=(
--git-ref="${{ github.event.pull_request.base.ref || 'master' }}"
--git-ref="${{ github.event.pull_request.base.ref || github.ref_name }}"
--is-master-or-release="${{ github.ref_name == 'master' || startsWith(github.ref_name, 'release-') }}"
--pr-labels="${{ join(github.event.pull_request.labels.*.name, ',') }}"
--skip="${{ inputs.skip }}"
)
echo "Running:"
echo "./bin/mage -driver-decisions ${MAGE_ARGS[@]}"
echo ""
# First call: show human-readable output for debugging
./bin/mage -driver-decisions "${MAGE_ARGS[@]}"
echo ""
echo "Want to force-run a specific driver? Add a ci:run-<driver> or ci:run-all-drivers label to your PR."
echo "Run './bin/mage -driver-decisions -h' locally for the full list of drivers and labels."
# Second call: output only key=value lines for GITHUB_OUTPUT
./bin/mage -driver-decisions "${MAGE_ARGS[@]}" --github-output-only >> $GITHUB_OUTPUT
shell: bash
@@ -86,8 +92,8 @@ jobs:
be-tests-athena-ee:
needs: determine-driver-skips
if: ${{ needs.determine-driver-skips.outputs.athena-should-run == 'true' || needs.determine-driver-skips.outputs.athena-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 40
env:
CI: 'true'
DRIVERS: athena
@@ -132,11 +138,12 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
be-tests-bigquery-cloud-sdk-ee:
needs: determine-driver-skips
if: ${{ needs.determine-driver-skips.outputs.bigquery-should-run == 'true' || needs.determine-driver-skips.outputs.bigquery-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 60
strategy:
fail-fast: false
@@ -198,6 +205,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
- name: Cleanup python-runner
if: ${{ always() && matrix.job.needs-python-runner == true }}
uses: ./.github/actions/cleanup-python-runner
@@ -208,8 +216,8 @@ jobs:
be-tests-clickhouse-ee:
needs: determine-driver-skips
if: ${{ needs.determine-driver-skips.outputs.clickhouse-should-run == 'true' || needs.determine-driver-skips.outputs.clickhouse-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 40
strategy:
fail-fast: false
matrix:
@@ -280,6 +288,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
- name: Cleanup python-runner
if: ${{ always() && matrix.job.needs-python-runner == true }}
uses: ./.github/actions/cleanup-python-runner
@@ -290,8 +299,8 @@ jobs:
be-tests-druid-ee:
needs: determine-driver-skips
if: ${{ needs.determine-driver-skips.outputs.druid-should-run == 'true' || needs.determine-driver-skips.outputs.druid-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 40
env:
CI: 'true'
DRIVERS: druid
@@ -334,12 +343,13 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
be-tests-druid-jdbc-ee:
needs: determine-driver-skips
if: ${{ needs.determine-driver-skips.outputs.druid-jdbc-should-run == 'true' || needs.determine-driver-skips.outputs.druid-jdbc-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 40
env:
CI: 'true'
DRIVERS: druid-jdbc
@@ -382,12 +392,13 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
be-tests-databricks-ee:
needs: determine-driver-skips
if: ${{ needs.determine-driver-skips.outputs.databricks-should-run == 'true' || needs.determine-driver-skips.outputs.databricks-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 40
env:
CI: 'true'
DRIVERS: databricks
@@ -430,12 +441,13 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
be-tests-databricks-multi-catalog-ee:
needs: determine-driver-skips
if: ${{ needs.determine-driver-skips.outputs.databricks-should-run == 'true' || needs.determine-driver-skips.outputs.databricks-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 40
env:
CI: 'true'
DRIVERS: databricks
@@ -479,12 +491,13 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
be-tests-h2:
needs: determine-driver-skips
if: ${{ needs.determine-driver-skips.outputs.h2-should-run == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 40
env:
CI: 'true'
name: H2
@@ -509,12 +522,13 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
be-tests-h2-oss:
needs: determine-driver-skips
if: ${{ needs.determine-driver-skips.outputs.h2-should-run == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 40
env:
CI: 'true'
name: H2 (OSS)
@@ -540,25 +554,26 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
be-tests-mysql-mariadb:
needs: determine-driver-skips
if: ${{ needs.determine-driver-skips.outputs.mysql-mariadb-should-run == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 40
strategy:
fail-fast: false
matrix:
version:
- name: MariaDB 10.2
junit-name: be-tests-mariadb-10-2-ee
image: circleci/mariadb:10.2.23
image: metabase/mariadb:10.2.23
env:
enable-ssl-tests: 'false'
enable-aws-iam-tests: 'false'
- name: MariaDB Latest
junit-name: be-tests-mariadb-latest-ee
image: circleci/mariadb:latest
image: mariadb:latest
env:
enable-ssl-tests: 'false'
enable-aws-iam-tests: 'false'
@@ -670,6 +685,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
- name: Cleanup python-runner
if: always()
uses: ./.github/actions/cleanup-python-runner
@@ -680,8 +696,8 @@ jobs:
be-tests-mongo:
needs: determine-driver-skips
if: ${{ needs.determine-driver-skips.outputs.mongo-should-run == 'true' || needs.determine-driver-skips.outputs.mongo-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 40
strategy:
fail-fast: false
matrix:
@@ -750,6 +766,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
- name: Cleanup python-runner
if: ${{ always() && matrix.job.needs-python-runner == true }}
uses: ./.github/actions/cleanup-python-runner
@@ -760,8 +777,8 @@ jobs:
be-tests-mongo-ssl:
needs: determine-driver-skips
if: ${{ needs.determine-driver-skips.outputs.mongo-ssl-should-run == 'true' || needs.determine-driver-skips.outputs.mongo-ssl-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 40
strategy:
fail-fast: false
matrix:
@@ -832,12 +849,13 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
be-tests-mongo-sharded-cluster-ee:
needs: determine-driver-skips
if: ${{ needs.determine-driver-skips.outputs.mongo-sharded-cluster-should-run == 'true' || needs.determine-driver-skips.outputs.mongo-sharded-cluster-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 40
env:
CI: 'true'
DRIVERS: mongo
@@ -877,12 +895,13 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
be-tests-oracle:
needs: determine-driver-skips
if: ${{ needs.determine-driver-skips.outputs.oracle-should-run == 'true' || needs.determine-driver-skips.outputs.oracle-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 40
strategy:
fail-fast: false
matrix:
@@ -962,12 +981,13 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
be-tests-postgres:
needs: determine-driver-skips
if: ${{ needs.determine-driver-skips.outputs.postgres-should-run == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 40
strategy:
fail-fast: false
matrix:
@@ -1066,6 +1086,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
- name: Cleanup python-runner
if: always()
uses: ./.github/actions/cleanup-python-runner
@@ -1076,8 +1097,8 @@ jobs:
be-tests-presto-jdbc-ee:
needs: determine-driver-skips
if: ${{ needs.determine-driver-skips.outputs.presto-jdbc-should-run == 'true' || needs.determine-driver-skips.outputs.presto-jdbc-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 40
env:
CI: 'true'
DRIVERS: presto-jdbc
@@ -1153,12 +1174,13 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
be-tests-redshift-ee:
needs: determine-driver-skips
if: ${{ needs.determine-driver-skips.outputs.redshift-should-run == 'true' || needs.determine-driver-skips.outputs.redshift-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 40
strategy:
fail-fast: false
matrix:
@@ -1197,7 +1219,7 @@ jobs:
MB_REDSHIFT_TEST_USER: metabase_ci
MB_REDSHIFT_TEST_DB: testdb
MB_REDSHIFT_TEST_DB_ROUTING: dev
MB_REDSHIFT_TEST_HOST: ${{ secrets.MB_REDSHIFT_TEST_HOST }}
MB_REDSHIFT_TEST_HOSTS: ${{ secrets.MB_REDSHIFT_TEST_HOSTS }}
MB_REDSHIFT_TEST_PASSWORD: ${{ secrets.MB_REDSHIFT_TEST_PASSWORD }}
name: ${{ matrix.job.name }}
steps:
@@ -1237,6 +1259,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
- name: Cleanup python-runner
if: ${{ always() && matrix.job.needs-python-runner == true }}
uses: ./.github/actions/cleanup-python-runner
@@ -1247,7 +1270,7 @@ jobs:
be-tests-snowflake-ee:
needs: determine-driver-skips
if: ${{ needs.determine-driver-skips.outputs.snowflake-should-run == 'true' || needs.determine-driver-skips.outputs.snowflake-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 60
strategy:
fail-fast: false
@@ -1319,6 +1342,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
- name: Cleanup python-runner
if: ${{ always() && matrix.job.needs-python-runner == true }}
uses: ./.github/actions/cleanup-python-runner
@@ -1329,8 +1353,8 @@ jobs:
be-tests-sparksql-ee:
needs: determine-driver-skips
if: ${{ needs.determine-driver-skips.outputs.sparksql-should-run == 'true' || needs.determine-driver-skips.outputs.sparksql-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 40
env:
CI: 'true'
DRIVERS: sparksql
@@ -1371,12 +1395,13 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
be-tests-sqlite-ee:
needs: determine-driver-skips
if: ${{ needs.determine-driver-skips.outputs.sqlite-should-run == 'true' || needs.determine-driver-skips.outputs.sqlite-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 40
env:
CI: 'true'
DRIVERS: sqlite
@@ -1412,11 +1437,12 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
be-tests-sqlserver:
needs: determine-driver-skips
if: ${{ needs.determine-driver-skips.outputs.sqlserver-should-run == 'true' || needs.determine-driver-skips.outputs.sqlserver-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 30
strategy:
fail-fast: false
@@ -1488,6 +1514,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
- name: Cleanup python-runner
if: ${{ always() && matrix.job.needs-python-runner == true }}
uses: ./.github/actions/cleanup-python-runner
@@ -1499,8 +1526,8 @@ jobs:
# be-tests-starburst-ee:
# needs: determine-driver-skips
# if: ${{ !inputs.skip && !(needs.determine-driver-skips.outputs.skip == 'true') }}
# runs-on: ubuntu-latest
# timeout-minutes: 60
# runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
# timeout-minutes: 40
# env:
# CI: 'true'
# DRIVERS: starburst
@@ -1537,7 +1564,7 @@ jobs:
login-to-ecr:
needs: determine-driver-skips
if: ${{ needs.determine-driver-skips.outputs.vertica-should-run == 'true' || needs.determine-driver-skips.outputs.vertica-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 15
permissions:
id-token: write
@@ -1567,8 +1594,8 @@ jobs:
be-tests-vertica-ee:
needs: [determine-driver-skips, login-to-ecr]
if: ${{ needs.determine-driver-skips.outputs.vertica-should-run == 'true' || needs.determine-driver-skips.outputs.vertica-quarantine-conflict == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 60
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 40
env:
CI: 'true'
DRIVERS: vertica
@@ -1614,6 +1641,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
drivers-tests-result:
needs:
@@ -1640,7 +1668,7 @@ jobs:
# TODO(rileythomp, 2025-08-20): Re-enable vertica tests once the docker image is updated
# - be-tests-vertica-ee
- be-tests-clickhouse-ee
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
name: drivers-tests-result
if: always() && !cancelled()

View File

@@ -21,7 +21,7 @@ on:
jobs:
build-matrix:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
outputs:
matrix: ${{ steps.matrix.outputs.config }}
@@ -47,7 +47,7 @@ jobs:
const inputSpecs = "${{ inputs.specs }}";
const inputChunks = Number(process.env.chunks);
const java = 21;
const defaultRunner = "ubuntu-22.04";
const defaultRunner = "${{ vars.DEFAULT_RUNNER_KEY }}";
const options = {
java,
defaultRunner,

View File

@@ -35,7 +35,7 @@ on:
jobs:
determine-test-type:
name: Determine test type
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
outputs:
type: ${{ steps.detect.outputs.type }}
@@ -53,7 +53,7 @@ jobs:
workflow-summary:
name: Stress test inputs
needs: [determine-test-type]
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
steps:
- name: Generate workflow summary
@@ -72,7 +72,7 @@ jobs:
stress-test-flake-fix:
needs: [determine-test-type]
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 60
name: Stress test E2E flake fix
env:

View File

@@ -21,7 +21,7 @@ on:
runner:
required: false
type: string
default: ubuntu-22.04
default: ${{ vars.DEFAULT_RUNNER_KEY }}
total_chunks: # number of chunks
required: false
type: number
@@ -41,12 +41,13 @@ env:
jobs:
e2e-tests:
runs-on: ${{ inputs.runner }}
timeout-minutes: 45
timeout-minutes: 40
name: e2e-tests-${{ inputs.name }}-${{ inputs.edition }}
env:
MB_EDITION: ${{ inputs.edition }}
# Any env starting with `CYPRESS_` will be available to all Cypress tests via `Cypress.env()`
# Example: you can get `CYPRESS_FOO` with `Cypress.env("FOO")`
# Sensitive env vars (tokens, secrets) starting with `CYPRESS_` are accessed via async `cy.env()`
# Example: `cy.env(["FOO"]).then(({ FOO }) => ...)`
# For non-sensitive config, use `Cypress.expose()` in cypress config instead (synchronous)
CYPRESS_MB_ALL_FEATURES_TOKEN: ${{ secrets.STAGING_MB_ALL_FEATURES_TOKEN }}
CYPRESS_MB_STARTER_CLOUD_TOKEN: ${{ secrets.STAGING_MB_STARTER_CLOUD_TOKEN }}
CYPRESS_MB_PRO_CLOUD_TOKEN: ${{ secrets.STAGING_MB_PRO_CLOUD_TOKEN }}
@@ -171,6 +172,7 @@ jobs:
# Related to Trunk uploader
variant: e2e-tests
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ inputs.specs && steps.tagged-e2e.outcome || steps.split-e2e.outcome }}
- name: Upload Cypress Artifacts upon failure
uses: actions/upload-artifact@v4

View File

@@ -24,7 +24,7 @@ jobs:
reset-e2e-test-comment:
if: ${{ github.event_name == 'pull_request' }}
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
steps:
- name: Remove test results comment
@@ -75,7 +75,7 @@ jobs:
collect-timings:
name: Collect E2E Timings
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 10
needs: e2e-tests
if: always() && !cancelled() && github.ref == 'refs/heads/master'
@@ -138,7 +138,7 @@ jobs:
e2e-tests-result:
needs:
- e2e-tests
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
name: e2e-tests-result
if: always() && !cancelled()

View File

@@ -12,15 +12,16 @@ env:
jobs:
sdk-component-tests:
name: "SDK component tests (React ${{ matrix.react-version }})"
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 45
strategy:
matrix:
react-version: [18, 19]
fail-fast: false
env:
# Any env starting with `CYPRESS_` will be available to all Cypress tests via `Cypress.env()`
# Example: you can get `CYPRESS_FOO` with `Cypress.env("FOO")`
# Sensitive env vars (tokens, secrets) starting with `CYPRESS_` are accessed via async `cy.env()`
# Example: `cy.env(["FOO"]).then(({ FOO }) => ...)`
# For non-sensitive config, use `Cypress.expose()` in cypress config instead (synchronous)
CYPRESS_MB_ALL_FEATURES_TOKEN: ${{ secrets.STAGING_MB_ALL_FEATURES_TOKEN }}
CYPRESS_MB_STARTER_CLOUD_TOKEN: ${{ secrets.STAGING_MB_STARTER_CLOUD_TOKEN }}
CYPRESS_MB_PRO_CLOUD_TOKEN: ${{ secrets.STAGING_MB_PRO_CLOUD_TOKEN }}
@@ -81,6 +82,7 @@ jobs:
run: ./bin/embedding-sdk/change-react-version.bash ${{ matrix.react-version }}
- name: Run component tests for Embedding SDK
id: run-tests
env:
CYPRESS_BROWSER: ${{ steps.cypress-prep.outputs.chrome-path }}
run: node e2e/runner/run_cypress_ci.js component
@@ -96,6 +98,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.run-tests.outcome }}
- name: "SDK component tests > Upload Cypress Artifacts upon failure"
uses: actions/upload-artifact@v4
@@ -125,7 +128,7 @@ jobs:
await core.summary.addRaw(summary).write();
decide-target-ref:
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
outputs:
target-ref: ${{ steps.get-target-ref.outputs.value }}
steps:
@@ -148,13 +151,14 @@ jobs:
sdk-component-tests-backward-compatibility:
name: "SDK component tests (Backward compatibility)"
needs: [decide-target-ref]
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 45
env:
MB_RUN_MODE: "e2e"
METASTORE_DEV_SERVER_URL: ${{ secrets.METASTORE_DEV_SERVER_URL }}
# Any env starting with `CYPRESS_` will be available to all Cypress tests via `Cypress.env()`
# Example: you can get `CYPRESS_FOO` with `Cypress.env("FOO")`
# Sensitive env vars (tokens, secrets) starting with `CYPRESS_` are accessed via async `cy.env()`
# Example: `cy.env(["FOO"]).then(({ FOO }) => ...)`
# For non-sensitive config, use `Cypress.expose()` in cypress config instead (synchronous)
CYPRESS_MB_ALL_FEATURES_TOKEN: ${{ secrets.STAGING_MB_ALL_FEATURES_TOKEN }}
CYPRESS_MB_STARTER_CLOUD_TOKEN: ${{ secrets.STAGING_MB_STARTER_CLOUD_TOKEN }}
CYPRESS_MB_PRO_CLOUD_TOKEN: ${{ secrets.STAGING_MB_PRO_CLOUD_TOKEN }}
@@ -230,6 +234,7 @@ jobs:
--spec "e2e/snapshot-creators/default.cy.snap.js"
- name: Run component tests for Embedding SDK
id: run-tests
env:
CYPRESS_BROWSER: ${{ steps.cypress-prep.outputs.chrome-path }}
run: |
@@ -247,6 +252,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.run-tests.outcome }}
- name: Upload Cypress Artifacts upon failure
uses: actions/upload-artifact@v4

View File

@@ -13,7 +13,7 @@ env:
MB_EDITION: ee
jobs:
get-sample-apps-data:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 10
env:
# we must support the last two stable releases
@@ -103,7 +103,7 @@ jobs:
environment: ["production", "development"]
if: |
!cancelled() && needs.get-sample-apps-data.result == 'success'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 45
name: e2e-sample-app-${{ matrix.test_suite }}-tests-${{ matrix.environment }}-bundle
env:
@@ -115,6 +115,8 @@ jobs:
SAMPLE_APP_ENVIRONMENT: ${{ matrix.environment }}
permissions:
id-token: write
contents: read
actions: read
steps:
- uses: actions/checkout@v4
@@ -238,7 +240,7 @@ jobs:
"angular-20-host-app-e2e",
]
environment: ["production", "development"]
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 45
name: e2e-host-app-${{ matrix.test_suite }}-tests-${{ matrix.environment }}-bundle
env:
@@ -246,6 +248,8 @@ jobs:
HOST_APP_ENVIRONMENT: ${{ matrix.environment }}
permissions:
id-token: write
contents: read
actions: read
steps:
- uses: actions/checkout@v4

View File

@@ -10,7 +10,7 @@ on:
jobs:
files-changed:
name: Check which files changed
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 3
outputs:
frontend_embedding_sdk_package_sources: ${{ steps.changes.outputs.frontend_embedding_sdk_package_sources }}
@@ -29,7 +29,7 @@ jobs:
!cancelled() &&
(needs.files-changed.outputs.frontend_embedding_sdk_package_sources == 'true')
name: Embedding SDK package release-notes/no-release-notes label reminder
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
steps:
- uses: actions/checkout@v4

View File

@@ -10,7 +10,7 @@ concurrency:
jobs:
build-sdk-package:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 25
steps:
- uses: actions/checkout@v4

View File

@@ -35,7 +35,7 @@ concurrency:
jobs:
embedding-sdk-cli-snippets-type-check:
if: inputs.cli-snippets-type-check && !inputs.skip
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 20
steps:
- uses: actions/checkout@v4
@@ -51,7 +51,7 @@ jobs:
embedding-sdk-docs-snippets-type-check:
if: inputs.docs-snippets-type-check && !inputs.skip
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 20
steps:
- uses: actions/checkout@v4
@@ -67,7 +67,7 @@ jobs:
embedding-sdk-api-documentation-generation-validation:
if: inputs.documentation-validation && !inputs.skip
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 20
steps:
- uses: actions/checkout@v4
@@ -131,7 +131,7 @@ jobs:
- embedding-sdk-api-documentation-generation-validation
- embedding-sdk-component-tests
if: always() && !cancelled()
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
env:
needs: ${{ toJson(needs) }}

View File

@@ -7,7 +7,7 @@ on:
jobs:
on-escalation-label:
if: github.event.label.name == '.Escalation'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 10
steps:
- name: Format issue title (escape quotes)

View File

@@ -19,7 +19,7 @@ on:
jobs:
workflow-summary:
name: Stress test inputs
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
steps:
- name: Generate workflow summary
@@ -34,7 +34,7 @@ jobs:
echo 'triggered by: @${{ github.event.sender.login }}' >> $GITHUB_STEP_SUMMARY
frontend-unit-test-stress-test-flake-fix:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 60
name: Stress test frontend unit test flake fix
steps:
@@ -49,7 +49,7 @@ jobs:
run: |
for i in {1..${{ github.event.inputs.burn_in }}}; do
bun run jest --runInBand --ci --silent --no-cache \
--testPathPattern '${{ github.event.inputs.spec }}' \
--testPathPatterns '${{ github.event.inputs.spec }}' \
--testNamePattern '${{ github.event.inputs.grep }}'
if [[ "$?" != 0 ]]; then
echo "Failed after $i attempts" && break;

View File

@@ -27,7 +27,7 @@ concurrency:
jobs:
fe-lint:
if: ${{ !inputs.skip-lint }}
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 20
steps:
- uses: actions/checkout@v4
@@ -58,7 +58,7 @@ jobs:
fe-type-check:
if: ${{ !inputs.skip }}
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
@@ -73,7 +73,7 @@ jobs:
fe-tests-unit:
if: ${{ !inputs.skip }}
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 30
strategy:
fail-fast: false
@@ -90,6 +90,7 @@ jobs:
- name: Prepare back-end environment
uses: ./.github/actions/prepare-backend
- name: Run frontend unit tests
id: fe-tests
run: bun run test-unit --silent --shard=${{ matrix.shard }}/${{ env.SHARDS }}
# Trunk Quarantine controls the final state of the run in the CI!
# Even if this step fails we let it pass, and then `trunk-io/analytics-uploader` determines
@@ -106,10 +107,11 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.fe-tests.outcome }}
fe-tests-timezones:
if: ${{ !inputs.skip }}
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 20
steps:
- uses: actions/checkout@v4
@@ -127,7 +129,7 @@ jobs:
- fe-tests-unit
- fe-tests-timezones
if: always() && !cancelled()
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
env:
needs: ${{ toJson(needs) }}

View File

@@ -24,7 +24,7 @@ on:
# TODO: Consider renaming the job in next milestones
jobs:
generative-query-test:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 90
name: Generative Query Test
env:

View File

@@ -14,7 +14,7 @@ concurrency:
jobs:
files-changed:
name: Check which files changed
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 3
outputs:
i18n: ${{ steps.changes.outputs.i18n }}
@@ -30,7 +30,7 @@ jobs:
verify-i18n-files:
needs: files-changed
if: needs.files-changed.outputs.i18n == 'true'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 15
steps:
- uses: actions/checkout@v4

View File

@@ -7,7 +7,7 @@ on:
jobs:
js-stats:
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
steps:
- uses: actions/checkout@v4

View File

@@ -6,7 +6,7 @@ on:
jobs:
add-issue-references:
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
steps:
- name: Checkout code
uses: actions/checkout@v4

View File

@@ -21,7 +21,7 @@ on:
jobs:
detect-changed-stories:
name: Detect changed stories
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
outputs:
story_files: ${{ steps.detect.outputs.story_files }}
@@ -84,32 +84,40 @@ jobs:
name: Summary
needs: detect-changed-stories
if: needs.detect-changed-stories.outputs.should_run == 'true'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
steps:
- name: Generate workflow summary
env:
BRANCH_NAME: ${{ github.head_ref || github.ref_name }}
STORY_FILES: ${{ needs.detect-changed-stories.outputs.story_files }}
BURN_IN: ${{ inputs.burn_in || 50 }}
EVENT_NAME: ${{ github.event_name }}
PR_NUMBER: ${{ github.event.pull_request.number }}
PR_ACTOR: ${{ github.event.pull_request.user.login }}
ACTOR: ${{ github.actor }}
run: |
echo '## Loki Stress Test' >> $GITHUB_STEP_SUMMARY
echo '' >> $GITHUB_STEP_SUMMARY
echo '**Branch:** `${{ github.head_ref || github.ref_name }}`' >> $GITHUB_STEP_SUMMARY
echo "**Branch:** \`${BRANCH_NAME}\`" >> $GITHUB_STEP_SUMMARY
echo '' >> $GITHUB_STEP_SUMMARY
echo '**Story files:**' >> $GITHUB_STEP_SUMMARY
echo '${{ needs.detect-changed-stories.outputs.story_files }}' | tr ',' '\n' | while read -r file; do
echo "${STORY_FILES}" | tr ',' '\n' | while read -r file; do
echo "- \`$file\`" >> $GITHUB_STEP_SUMMARY
done
echo '' >> $GITHUB_STEP_SUMMARY
echo '**Burn-in:** ${{ inputs.burn_in || 50 }} runs' >> $GITHUB_STEP_SUMMARY
echo "**Burn-in:** ${BURN_IN} runs" >> $GITHUB_STEP_SUMMARY
echo '' >> $GITHUB_STEP_SUMMARY
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
echo 'Triggered by PR #${{ github.event.pull_request.number }} from @${{ github.event.pull_request.user.login }}' >> $GITHUB_STEP_SUMMARY
if [[ "${EVENT_NAME}" == "pull_request" ]]; then
echo "Triggered by PR #${PR_NUMBER} from @${PR_ACTOR}" >> $GITHUB_STEP_SUMMARY
else
echo 'Triggered manually by @${{ github.actor }}' >> $GITHUB_STEP_SUMMARY
echo "Triggered manually by @${ACTOR}" >> $GITHUB_STEP_SUMMARY
fi
stress-test-loki:
needs: detect-changed-stories
if: needs.detect-changed-stories.outputs.should_run == 'true'
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 60
name: Stress test Loki visual tests
services:

View File

@@ -7,7 +7,7 @@ on:
jobs:
check-label-and-update-snapshot:
if: contains(github.event.pull_request.labels.*.name, 'loki-update')
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
steps:
- name: Checkout Repository
uses: actions/checkout@v4

View File

@@ -7,7 +7,7 @@ on:
jobs:
files-changed:
name: Check which files changed
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 3
outputs:
frontend_ci: ${{ steps.changes.outputs.frontend_ci }}
@@ -25,7 +25,7 @@ jobs:
visual-test:
needs: files-changed
if: needs.files-changed.outputs.frontend_ci == 'true' || needs.files-changed.outputs.frontend_sources == 'true' || needs.files-changed.outputs.frontend_loki_ci == 'true'
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
services:
docker:
image: docker:19.03.12

View File

@@ -2,14 +2,11 @@ name: Mage Tests
on:
pull_request:
paths:
- "mage/**"
- "bb.edn"
jobs:
# run mage tests even if the rest of be isnt needed
mage-tests:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
name: Mage
steps:
- uses: actions/checkout@v4

View File

@@ -6,7 +6,7 @@ on:
- labeled
jobs:
on-issue-labeled:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
if: |
contains(github.event.issue.labels.*.name, 'Type:New Feature')

View File

@@ -11,7 +11,7 @@ on:
- src/metabase/lib/js.cljs
jobs:
mbql-library-changelog-check:
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
if: ${{ !contains( github.event.pull_request.labels.*.name, '.metabase-lib/no-change' ) }}
steps:
# - uses: jesusvasquez333/verify-pr-label-action@v1.4.0

View File

@@ -10,7 +10,7 @@ on:
jobs:
lint-migrations:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 15
steps:
- uses: actions/checkout@v4

View File

@@ -11,7 +11,7 @@ concurrency:
jobs:
# Only run if the PR has the minimal-tests label
check-label:
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 1
outputs:
should-run: ${{ steps.check.outputs.result }}
@@ -29,10 +29,10 @@ jobs:
postgres-app-db-test:
needs: check-label
if: needs.check-label.outputs.should-run == 'true'
runs-on: ubuntu-22.04
timeout-minutes: 60
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 40
env:
CI: 'true'
CI: "true"
DRIVERS: postgres
MB_DB_TYPE: postgres
MB_DB_PORT: 5432
@@ -53,10 +53,11 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Test Postgres App DB
id: test-driver
uses: ./.github/actions/test-driver
with:
build-static-viz: true
junit-name: 'minimal-be-tests-postgres-ee'
junit-name: "minimal-be-tests-postgres-ee"
test-args: >-
:only '["test" "enterprise/backend/test"]'
:exclude-tags '[:mb/driver-tests :mb/transforms-python-test]'
@@ -73,15 +74,16 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
# Postgres driver tests
postgres-driver-test:
needs: check-label
if: needs.check-label.outputs.should-run == 'true'
runs-on: ubuntu-latest
timeout-minutes: 60
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 40
env:
CI: 'true'
CI: "true"
DRIVERS: postgres
MB_DB_TYPE: postgres
MB_DB_PORT: 5432
@@ -102,9 +104,10 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Test Postgres Driver
id: test-driver
uses: ./.github/actions/test-driver
with:
junit-name: 'minimal-be-tests-postgres-driver-ee'
junit-name: "minimal-be-tests-postgres-driver-ee"
test-args: >-
:only-tags [:mb/driver-tests]
:exclude-tags [:mb/transforms-python-test]
@@ -119,12 +122,13 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
# Frontend unit tests
frontend-unit-tests:
needs: check-label
if: needs.check-label.outputs.should-run == 'true'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 30
env:
JEST_JUNIT_OUTPUT_DIR: ./target/junit
@@ -137,6 +141,7 @@ jobs:
- name: Prepare back-end environment
uses: ./.github/actions/prepare-backend
- name: Run frontend unit tests
id: run-tests
run: bun run test-unit --silent
continue-on-error: true
- name: Upload Test Results
@@ -150,6 +155,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.run-tests.outcome }}
# Summary job
minimal-tests-result:
@@ -157,7 +163,7 @@ jobs:
- postgres-app-db-test
- postgres-driver-test
- frontend-unit-tests
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
name: minimal-tests-result
if: always() && !cancelled()

View File

@@ -10,7 +10,7 @@ concurrency:
jobs:
check-openapi-specs:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
if: contains(github.event.pull_request.labels.*.name, 'openapi-self-healing')
steps:
@@ -22,10 +22,8 @@ jobs:
token: ${{ secrets.METABASE_AUTOMATION_USER_TOKEN }}
# fetch full git history to allow fetching the latest base branch commit and comparing changes
fetch-depth: 0
- name: Setup Node.js 22
uses: actions/setup-node@v4
with:
node-version: 22.x
- name: Prepare Node + Bun environment
uses: ./.github/actions/prepare-node-bun
- name: Prepare back-end environment
uses: ./.github/actions/prepare-backend
- name: Generate version.properties

44
.github/workflows/openapi.yml vendored Normal file
View File

@@ -0,0 +1,44 @@
name: Validate OpenAPI
on:
push:
branches:
- 'master'
- 'release-**'
pull_request:
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref && github.ref || github.run_id }}
cancel-in-progress: true
jobs:
files-changed:
name: Check which files changed
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 3
outputs:
openapi: ${{ steps.changes.outputs.openapi }}
steps:
- uses: actions/checkout@v4
- name: Test which files changed
uses: dorny/paths-filter@v3.0.0
id: changes
with:
token: ${{ github.token }}
filters: .github/file-paths.yaml
validate-openapi:
needs: files-changed
if: needs.files-changed.outputs.openapi == 'true'
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- name: Prepare front-end environment
uses: ./.github/actions/prepare-frontend
- name: Prepare back-end environment
uses: ./.github/actions/prepare-backend
- name: Generate OpenAPI spec
run: bun run generate-openapi
- name: Validate OpenAPI spec
run: bun run lint-openapi

View File

@@ -7,7 +7,7 @@ on:
jobs:
optimize-images:
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
if: ${{ contains(github.event.pull_request.labels.*.name,'Type:Documentation') }}
steps:
- name: Checkout repository

View File

@@ -5,7 +5,7 @@ on:
workflow_call:
jobs:
build:
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
if: github.event.pull_request.head.repo.full_name == github.repository
name: Build Metabase Docker image
timeout-minutes: 60
@@ -47,7 +47,7 @@ jobs:
push: true
launch_perf_test:
needs: [ build ]
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
name: Launch Perf Test
permissions:
id-token: write

View File

@@ -12,7 +12,7 @@ on:
jobs:
destroy_pr:
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
name: PR Review ENV Destroy
permissions:
id-token: write

View File

@@ -16,7 +16,7 @@ on:
default: false
jobs:
build:
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
if: github.event.pull_request.head.repo.full_name == github.repository
name: Build Metabase Docker image
timeout-minutes: 60
@@ -58,7 +58,7 @@ jobs:
push: true
deploy_pr:
needs: [build]
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
name: PR Review ENV
permissions:
id-token: write
@@ -188,7 +188,7 @@ jobs:
--atomic \
--timeout 10m
preview_links:
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
needs: [deploy_pr]
steps:
- uses: marocchino/sticky-pull-request-comment@v2

View File

@@ -18,7 +18,7 @@ on:
jobs:
files-changed:
name: Check which files changed
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 3
outputs:
backend_presto_kerberos: ${{ steps.changes.outputs.backend_presto_kerberos }}
@@ -34,7 +34,7 @@ jobs:
run-presto-kerberos-test:
needs: files-changed
if: needs.files-changed.outputs.backend_presto_kerberos == 'true'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 40
steps:
- name: Install babashka

View File

@@ -10,7 +10,7 @@ jobs:
external-reminder:
name: External PR Helper
if: ${{ github.event.pull_request.head.repo.full_name != github.repository }}
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
permissions:
pull-requests: write

View File

@@ -7,7 +7,7 @@ on:
jobs:
notify-querying-on-call:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
if: |
(github.event.label.name == 'Priority:P0' || github.event.label.name == 'Priority:P1' || github.event.label.name == '.Escalation') &&

View File

@@ -8,9 +8,9 @@ on:
description: "Branch we want to release the SDK from (to release from other branches use the workflow from those branches)"
type: choice
required: true
default: "master"
default: "release-x.59.x"
options:
- master
- release-x.59.x
concurrency:
# We want to ensure only one job is running at a time per branch because
@@ -21,7 +21,7 @@ concurrency:
jobs:
workflow-summary:
name: Log inputs
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
steps:
- name: Generate workflow summary
@@ -37,7 +37,7 @@ jobs:
send-slack-notification-start:
name: "Send Slack notification: SDK release started"
needs: determine-sdk-version
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
outputs:
slackMessageId: ${{ steps.send-slack-message-start.outputs.result }}
@@ -96,7 +96,7 @@ jobs:
"publish-npm",
"git-tag",
]
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
env:
slackMessageId: ${{ needs.send-slack-notification-start.outputs.slackMessageId }}
@@ -134,7 +134,7 @@ jobs:
name: "Send Slack notification: SDK release successful"
needs:
["determine-sdk-version", "send-slack-notification-start", "publish-npm"]
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
env:
slackMessageId: ${{ needs.send-slack-notification-start.outputs.slackMessageId }}
@@ -168,7 +168,7 @@ jobs:
});
determine-sdk-version:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 20
outputs:
sdk_version: ${{ fromJson(steps.new-sdk-version.outputs.result).version }}
@@ -219,7 +219,7 @@ jobs:
check-git-tag:
needs: determine-sdk-version
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 20
env:
tag: embedding-sdk-${{ needs.determine-sdk-version.outputs.sdk_version }}
@@ -243,7 +243,7 @@ jobs:
test:
needs: check-git-tag
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 20
steps:
- name: Check out the code using the provided branch
@@ -262,7 +262,7 @@ jobs:
build-sdk:
needs: [test, determine-sdk-version]
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 20
steps:
- name: Check out the code using the provided branch
@@ -297,7 +297,7 @@ jobs:
publish-npm:
needs: [build-sdk, determine-sdk-version]
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 20
env:
sdk_version: ${{ needs.determine-sdk-version.outputs.sdk_version }}
@@ -371,34 +371,23 @@ jobs:
name: metabase-sdk
path: sdk
- name: Compute master tag
id: compute-tag
run: |
if [ -n "${{ needs.determine-sdk-version.outputs.pre_release_label }}" ]; then
echo "masterTag=${{ needs.determine-sdk-version.outputs.pre_release_label }}" >> $GITHUB_OUTPUT
else
echo "masterTag=nightly" >> $GITHUB_OUTPUT
fi
- name: Publish to NPM
working-directory: sdk
run: |
echo //registry.npmjs.org/:_authToken=${{ secrets.NPM_RELEASE_TOKEN }} > .npmrc
TAG="${{ steps.compute-tag.outputs.masterTag }}"
echo "Resolved npm tag: $TAG"
npm publish --tag "$TAG"
npm publish --tag 59-stable
# ⚠️ This step should only be executed on the latest stable (gold) release branch.
# Only uncomment this when the new release branch becomes stable (gold).
# - name: Add `latest` tag to the latest release branch (`release-x.55.x`) deployment
# working-directory: sdk
# run: |
# npm dist-tag add @metabase/embedding-sdk-react@${{ env.sdk_version }} latest
- name: Add `latest` tag to the latest release branch (`release-x.59.x`) deployment
working-directory: sdk
run: |
npm dist-tag add @metabase/embedding-sdk-react@${{ env.sdk_version }} latest
git-tag:
needs: [publish-npm, determine-sdk-version]
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 20
env:
tag: embedding-sdk-${{ needs.determine-sdk-version.outputs.sdk_version }}

View File

@@ -23,7 +23,7 @@ on:
jobs:
update-release-log:
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
# don't run this workflow for forks
if: ${{ github.event_name != 'push' || github.repository == 'metabase/metabase' }}
@@ -38,14 +38,10 @@ jobs:
with:
ref: master # this only works on master
fetch-depth: 0 # we want all branches and tags
- name: Install bun
uses: oven-sh/setup-bun@v2
with:
bun-version: latest
- name: Install Dependencies
run: bun install --cwd release --frozen-lockfile && npm i -g tsx
- name: Build release scripts
run: bun run --cwd release build
- name: Prepare release scripts
uses: ./.github/actions/prepare-release-scripts
- name: Install tsx
run: npm i -g tsx
- name: Get version number
uses: actions/github-script@v7
with:

View File

@@ -15,7 +15,7 @@ on:
jobs:
check-milestone:
permissions: write-all
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
@@ -24,7 +24,8 @@ jobs:
- name: Install bun
uses: oven-sh/setup-bun@v2
with:
bun-version: latest
bun-version: "1.3.7"
token: ${{ secrets.GITHUB_TOKEN }}
- name: Prepare build scripts
run: bun install --cwd release --frozen-lockfile && bun run --cwd release build
- uses: actions/github-script@v7

View File

@@ -11,7 +11,7 @@ on:
jobs:
preview-release-notes:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
steps:
- name: Fail early on the incorrect version format

View File

@@ -20,7 +20,7 @@ jobs:
auto-patch-trigger:
# don't run this workflow on a cron for forks
if: ${{ github.event_name != 'schedule' || github.repository == 'metabase/metabase' }}
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
steps:
- uses: actions/checkout@v4
@@ -29,7 +29,8 @@ jobs:
- name: Install bun
uses: oven-sh/setup-bun@v2
with:
bun-version: latest
bun-version: "1.3.7"
token: ${{ secrets.GITHUB_TOKEN }}
- name: Prepare build scripts
run: bun install --cwd release --frozen-lockfile && bun run --cwd release build
- name: Trigger auto-patch

View File

@@ -9,7 +9,7 @@ jobs:
check-release-status:
# don't run this workflow on a cron for forks
if: ${{ github.event_name != 'schedule' || github.repository == 'metabase/metabase' }}
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
@@ -44,7 +44,7 @@ jobs:
});
open-backport-reminder:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 10
steps:
- uses: actions/checkout@v4

View File

@@ -14,7 +14,7 @@ concurrency:
jobs:
files-changed:
name: Check which files changed
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 3
outputs:
release_source: ${{ steps.changes.outputs.release_source }}
@@ -30,7 +30,7 @@ jobs:
release-type-check:
needs: files-changed
if: needs.files-changed.outputs.release_source == 'true'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
steps:
- uses: actions/checkout@v4
@@ -39,7 +39,8 @@ jobs:
- name: Install bun
uses: oven-sh/setup-bun@v2
with:
bun-version: latest
bun-version: "1.3.7"
token: ${{ secrets.GITHUB_TOKEN }}
- name: prepare dependencies in release directory
run: bun install --cwd release --frozen-lockfile
- name: Run frontend type-check
@@ -48,7 +49,7 @@ jobs:
release-tests-unit:
needs: files-changed
if: needs.files-changed.outputs.release_source == 'true'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
@@ -57,7 +58,8 @@ jobs:
- name: Install bun
uses: oven-sh/setup-bun@v2
with:
bun-version: latest
bun-version: "1.3.7"
token: ${{ secrets.GITHUB_TOKEN }}
- name: prepare dependencies in release directory
run: bun install --cwd release --frozen-lockfile
- name: Run release unit tests
@@ -66,7 +68,7 @@ jobs:
release-test-build:
needs: files-changed
if: needs.files-changed.outputs.release_source == 'true'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
@@ -75,7 +77,8 @@ jobs:
- name: Install bun
uses: oven-sh/setup-bun@v2
with:
bun-version: latest
bun-version: "1.3.7"
token: ${{ secrets.GITHUB_TOKEN }}
- name: prepare dependencies in release directory
run: bun install --cwd release --frozen-lockfile
- name: Build release bundle

View File

@@ -9,7 +9,7 @@ on:
jobs:
rerun-on-failure:
name: 'Re-run ''${{ github.event.workflow_run.name }}'' workflow'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
# Do not re-run scheduled workflow runs
if: github.event.workflow_run.conclusion == 'failure' && github.event.workflow_run.event != 'schedule'
env:
@@ -40,11 +40,19 @@ jobs:
const BRANCH = process.env.BRANCH_NAME;
if (ATTEMPT <= MAX_ATTEMPTS) {
github.rest.actions.reRunWorkflowFailedJobs({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: ${{ github.event.workflow_run.id }},
});
try {
await github.rest.actions.reRunWorkflowFailedJobs({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: ${{ github.event.workflow_run.id }},
});
} catch (error) {
if (error.status === 403) {
console.log(`Skipping re-run: ${error.message}`);
} else {
throw error;
}
}
} else if (!BRANCH.includes('backport-')) {
// notify slack of repeated failure
const { WebClient } = require('@slack/web-api');

View File

@@ -0,0 +1,63 @@
name: Reset Cloud Test Dataset
on:
workflow_dispatch:
inputs:
driver:
description: 'Driver to reset dataset for'
required: true
default: 'snowflake'
type: choice
options:
- snowflake
- bigquery-cloud-sdk
- redshift
- databricks
dataset-name:
description: 'Dataset name to drop (e.g., test-data)'
required: true
default: 'test-data'
type: string
jobs:
reset-dataset:
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 10
env:
CI: 'true'
DRIVERS: ${{ inputs.driver }}
# Snowflake
MB_SNOWFLAKE_TEST_USER: METABASE CI
MB_SNOWFLAKE_TEST_ACCOUNT: ${{ secrets.MB_SNOWFLAKE_TEST_ACCOUNT }}
MB_SNOWFLAKE_TEST_PASSWORD: ${{ secrets.MB_SNOWFLAKE_TEST_PASSWORD }}
MB_SNOWFLAKE_TEST_PRIVATE_KEY: ${{ secrets.MB_SNOWFLAKE_TEST_PRIVATE_KEY }}
MB_SNOWFLAKE_TEST_WAREHOUSE: ${{ secrets.MB_SNOWFLAKE_TEST_WAREHOUSE }}
# BigQuery
MB_BIGQUERY_TEST_PROJECT_ID: ${{ secrets.BIGQUERY_TEST_PROJECT_ID }}
MB_BIGQUERY_TEST_CLIENT_ID: ${{ secrets.MB_BIGQUERY_TEST_CLIENT_ID }}
MB_BIGQUERY_TEST_CLIENT_SECRET: ${{ secrets.MB_BIGQUERY_TEST_CLIENT_SECRET }}
MB_BIGQUERY_TEST_ACCESS_TOKEN: ${{ secrets.MB_BIGQUERY_TEST_ACCESS_TOKEN }}
MB_BIGQUERY_TEST_REFRESH_TOKEN: ${{ secrets.MB_BIGQUERY_TEST_REFRESH_TOKEN }}
MB_BIGQUERY_CLOUD_SDK_TEST_SERVICE_ACCOUNT_JSON: ${{ secrets.MB_BIGQUERY_CLOUD_SDK_TEST_SERVICE_ACCOUNT_JSON }}
MB_BIGQUERY_CLOUD_SDK_TEST_SERVICE_ACCOUNT_JSON_ROUTING: ${{ secrets.MB_BIGQUERY_CLOUD_SDK_TEST_SERVICE_ACCOUNT_JSON_ROUTING }}
# Redshift
MB_REDSHIFT_TEST_USER: metabase_ci
MB_REDSHIFT_TEST_DB: testdb
MB_REDSHIFT_TEST_HOST: ${{ secrets.MB_REDSHIFT_TEST_HOST }}
MB_REDSHIFT_TEST_PASSWORD: ${{ secrets.MB_REDSHIFT_TEST_PASSWORD }}
# Databricks
MB_DATABRICKS_TEST_HOST: ${{ secrets.MB_DATABRICKS_JDBC_TEST_HOST }}
MB_DATABRICKS_TEST_HTTP_PATH: ${{ secrets.MB_DATABRICKS_JDBC_TEST_HTTP_PATH }}
MB_DATABRICKS_TEST_TOKEN: ${{ secrets.MB_DATABRICKS_JDBC_TEST_TOKEN }}
MB_DATABRICKS_TEST_CATALOG: metabase_ci
MB_DATABRICKS_TEST_CLIENT_ID: ${{ secrets.MB_DATABRICKS_JDBC_TEST_CLIENT_ID }}
MB_DATABRICKS_TEST_OAUTH_SECRET: ${{ secrets.MB_DATABRICKS_JDBC_TEST_OAUTH_SECRET }}
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/prepare-backend
- name: Drop dataset
run: >-
clojure -X:dev:drivers:drivers-dev:test
metabase.test.data.impl/drop-dataset!
:driver '"${{ inputs.driver }}"'
:dataset-name '"${{ inputs.dataset-name }}"'

View File

@@ -0,0 +1,321 @@
name: Auto-resolve backport conflicts
run-name: Auto-resolve conflicts on PR #${{ github.event.pull_request.number || github.event.inputs.pr_number }}
on:
pull_request:
types: [labeled]
workflow_dispatch:
inputs:
pr_number:
description: "PR number of the backport PR with conflicts"
required: true
type: string
max_turns:
description: "Maximum number of Claude turns"
required: false
type: number
default: 75
jobs:
resolve-conflicts:
if: |
(github.event_name == 'pull_request' && github.event.label.name == 'auto-resolve-conflicts') ||
(github.event_name == 'workflow_dispatch')
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 30
permissions:
contents: write
pull-requests: write
id-token: write
env:
GIT_EDITOR: "true"
steps:
- name: Get PR data
id: pr
uses: actions/github-script@v7
with:
github-token: ${{ secrets.METABASE_AUTOMATION_USER_TOKEN }}
script: |
let pr;
if (context.eventName === 'workflow_dispatch') {
const { data } = await github.rest.pulls.get({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: Number('${{ github.event.inputs.pr_number }}'),
});
pr = data;
} else {
pr = context.payload.pull_request;
}
core.setOutput('number', pr.number);
core.setOutput('head_ref', pr.head.ref);
core.setOutput('base_ref', pr.base.ref);
- name: Checkout PR branch
uses: actions/checkout@v4
with:
ref: ${{ steps.pr.outputs.head_ref }}
fetch-depth: 0
token: ${{ secrets.METABASE_AUTOMATION_USER_TOKEN }}
- name: Detect package manager
id: pkg
run: |
if [ -f "bun.lock" ] || [ -f "bun.lockb" ]; then
echo "mgr=bun" >> $GITHUB_OUTPUT
else
echo "mgr=yarn" >> $GITHUB_OUTPUT
fi
- name: Validate backport PR
id: validate
run: |
if [ ! -f "./backport.sh" ]; then
echo "::error::No backport.sh found on this branch. This workflow only works on backport PRs with conflicts."
exit 1
fi
echo "backport.sh found, proceeding with conflict resolution"
cat ./backport.sh
- name: Set up git configuration
run: |
git config --global user.name "Metabase bot"
git config --global user.email "metabase-bot@metabase.com"
git config --global core.editor "true"
- name: Run backport script to create cherry-pick conflicts
id: backport
run: |
bash ./backport.sh 2>&1 || true
# Check if we're in a cherry-pick state with conflicts
CONFLICTED=$(git diff --name-only --diff-filter=U || true)
if [ -n "$CONFLICTED" ]; then
echo "has_conflicts=true" >> $GITHUB_OUTPUT
echo "conflicted_files<<EOF" >> $GITHUB_OUTPUT
echo "$CONFLICTED" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
echo "::notice::Found conflicts in: $CONFLICTED"
else
echo "has_conflicts=false" >> $GITHUB_OUTPUT
echo "::notice::Cherry-pick applied cleanly, no conflicts to resolve"
fi
- name: Push clean cherry-pick (no conflicts)
if: steps.backport.outputs.has_conflicts == 'false'
run: git push --force
- name: Prepare back-end environment
if: steps.backport.outputs.has_conflicts == 'true'
uses: ./.github/actions/prepare-backend
- name: Prepare front-end environment
if: steps.backport.outputs.has_conflicts == 'true'
uses: ./.github/actions/prepare-frontend
- name: Build CLJS for type checking
if: steps.backport.outputs.has_conflicts == 'true'
run: ${{ steps.pkg.outputs.mgr }} run build-pure:cljs
- name: Generate GitHub App Token for Claude
if: steps.backport.outputs.has_conflicts == 'true'
uses: actions/create-github-app-token@v1
id: claude-app-token
with:
app-id: ${{ secrets.METABASE_BOT_APP_ID }}
private-key: ${{ secrets.METABASE_BOT_APP_PRIVATE_KEY }}
- name: Resolve conflicts with Claude
if: steps.backport.outputs.has_conflicts == 'true'
id: claude
uses: anthropics/claude-code-base-action@beta
env:
NODE_VERSION: "22"
with:
# TODO: get a dedicated API key, sharing repro bot's key for now
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY_BACKPORT_FIX }}
model: "claude-sonnet-4-20250514"
max_turns: "${{ github.event.inputs.max_turns || '75' }}"
allowed_tools: "Read,Edit,Write,Bash(git:*),Bash(grep:*),Bash(find:*),Bash(ls:*),Bash(cat:*),Bash(clojure:*),Bash(${{ steps.pkg.outputs.mgr }} run type-check-pure:*),Bash(${{ steps.pkg.outputs.mgr }} run lint-eslint:*),Bash(./bin/mage cljfmt:*),Glob,Grep"
prompt: |
You are resolving git cherry-pick merge conflicts for a Metabase backport PR.
## Context
A commit from the `master` branch is being cherry-picked onto the `${{ steps.pr.outputs.base_ref }}` release branch.
The cherry-pick has failed with conflicts in these files:
${{ steps.backport.outputs.conflicted_files }}
## How to read conflict markers
```
<<<<<<< HEAD
(code from the release branch - the current state)
=======
(code from master - the change being backported)
>>>>>>> <commit-sha>
```
## Common conflict patterns in Metabase backports
- **Module/namespace renames**: A Clojure namespace was renamed or moved between versions. Check what the correct namespace is on the release branch.
- **Test file divergence**: Tests may have been added or reordered differently. Keep the backported test changes while preserving existing release-branch tests.
- **Import path changes**: Frontend imports may reference different paths. Check actual file locations on this branch.
- **Translation files (.po)**: For translation conflicts, prefer the release branch version of existing translations and add new translations from the backported change.
- **Minor context differences**: Surrounding code changed slightly. Adapt the backported change to fit the release branch context.
## Instructions
1. Read each conflicted file to understand the conflict
2. For context, you may search the codebase to understand the current state of the release branch (e.g., check if a module exists at a certain path)
3. Resolve each conflict by editing the file to remove ALL conflict markers (`<<<<<<<`, `=======`, `>>>>>>>`) and leave only the correct resolved code
4. The goal is to apply the INTENT of the backported change while adapting it to the release branch's code structure
5. Verify no conflict markers remain by searching for them
6. Auto-format resolved files:
- **Clojure/ClojureScript** (.clj, .cljc, .cljs): run cljfmt to fix formatting:
```
./bin/mage cljfmt-files <file1> <file2> ...
```
- **TypeScript/JavaScript** (.ts, .tsx, .js, .jsx): run eslint with auto-fix:
```
${{ steps.pkg.outputs.mgr }} run lint-eslint --fix
```
7. Validate resolved files before committing:
- **Clojure/ClojureScript** (.clj, .cljc, .cljs): run clj-kondo to verify syntax:
```
clojure -M:kondo --lint <file1> <file2> ...
```
- **TypeScript/JavaScript** (.ts, .tsx, .js, .jsx): run the type checker:
```
${{ steps.pkg.outputs.mgr }} run type-check-pure
```
If either tool reports errors or warnings, fix them before proceeding. CI treats kondo warnings as errors.
Repeat steps 6-7 until all errors are resolved.
7. Once all files are clean, stage and complete the cherry-pick:
```
git add -A
git cherry-pick --continue
```
8. Push the result:
```
git push --force
```
IMPORTANT: Do not skip any conflicted files. Every conflict marker must be resolved.
- name: Check for max turns exceeded
if: always() && steps.claude.outcome != 'skipped'
id: check-failure
run: |
if [ -f "${{ steps.claude.outputs.execution_file }}" ]; then
SUBTYPE=$(jq -r '.[] | select(.type == "result") | .subtype' "${{ steps.claude.outputs.execution_file }}" | tail -1)
if [ "$SUBTYPE" = "error_max_turns" ]; then
echo "max_turns_exceeded=true" >> $GITHUB_OUTPUT
else
echo "max_turns_exceeded=false" >> $GITHUB_OUTPUT
fi
else
echo "max_turns_exceeded=false" >> $GITHUB_OUTPUT
fi
- name: Get commit details
if: always() && steps.claude.outcome == 'success' && steps.check-failure.outputs.max_turns_exceeded != 'true'
id: commit-info
run: |
echo "sha=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
FILES=$(git diff --name-only HEAD~1)
echo "changed_files<<EOF" >> $GITHUB_OUTPUT
echo "$FILES" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- name: Comment on PR (success)
if: always() && steps.claude.outcome == 'success' && steps.check-failure.outputs.max_turns_exceeded != 'true'
uses: actions/github-script@v7
with:
github-token: ${{ secrets.METABASE_AUTOMATION_USER_TOKEN }}
script: |
const sha = '${{ steps.commit-info.outputs.sha }}';
const changedFiles = `${{ steps.commit-info.outputs.changed_files }}`.trim().split('\n').map(f => `- \`${f}\``).join('\n');
await github.rest.issues.createComment({
issue_number: ${{ steps.pr.outputs.number }},
owner: context.repo.owner,
repo: context.repo.repo,
body: [
'🤖 Backport conflicts have been automatically resolved and force-pushed.',
'',
`**Commit:** [\`${sha.substring(0, 10)}\`](https://github.com/${context.repo.owner}/${context.repo.repo}/commit/${sha})`,
'',
'<details>',
'<summary>Changed files</summary>',
'',
changedFiles,
'',
'</details>',
'',
'Please review the changes to make sure the resolution is correct before merging.',
].join('\n')
});
- name: Comment on PR (max turns exceeded)
if: always() && steps.check-failure.outputs.max_turns_exceeded == 'true'
uses: actions/github-script@v7
with:
github-token: ${{ secrets.METABASE_AUTOMATION_USER_TOKEN }}
script: |
await github.rest.issues.createComment({
issue_number: ${{ steps.pr.outputs.number }},
owner: context.repo.owner,
repo: context.repo.repo,
body: [
'🤖 Auto-resolution of backport conflicts stopped because Claude reached the maximum number of turns (${{ github.event.inputs.max_turns || '75' }}).',
'',
'The conflicts may be too complex for automatic resolution, or Claude needed more turns to finish.',
'',
'You can try again with more turns by manually running the [resolve-backport-conflicts workflow](https://github.com/' + context.repo.owner + '/' + context.repo.repo + '/actions/workflows/resolve-backport-conflicts.yml) with a higher `max_turns` value, or resolve the conflicts manually by checking out the branch and running `./backport.sh`.',
].join('\n')
});
- name: Comment on PR (failure)
if: always() && steps.claude.outcome == 'failure' && steps.check-failure.outputs.max_turns_exceeded != 'true'
uses: actions/github-script@v7
with:
github-token: ${{ secrets.METABASE_AUTOMATION_USER_TOKEN }}
script: |
await github.rest.issues.createComment({
issue_number: ${{ steps.pr.outputs.number }},
owner: context.repo.owner,
repo: context.repo.repo,
body: [
'🤖 Auto-resolution of backport conflicts failed.',
'',
'Manual resolution is still required. Check out the branch and run `./backport.sh` to resolve conflicts manually.',
].join('\n')
});
- name: Comment on PR (clean cherry-pick)
if: always() && steps.backport.outputs.has_conflicts == 'false'
uses: actions/github-script@v7
with:
github-token: ${{ secrets.METABASE_AUTOMATION_USER_TOKEN }}
script: |
await github.rest.issues.createComment({
issue_number: ${{ steps.pr.outputs.number }},
owner: context.repo.owner,
repo: context.repo.repo,
body: '🤖 Cherry-pick applied cleanly with no conflicts. Force-pushed the resolved branch.'
});
- name: Remove label
if: always()
uses: actions/github-script@v7
with:
github-token: ${{ secrets.METABASE_AUTOMATION_USER_TOKEN }}
script: |
try {
await github.rest.issues.removeLabel({
issue_number: ${{ steps.pr.outputs.number }},
owner: context.repo.owner,
repo: context.repo.repo,
name: 'auto-resolve-conflicts'
});
} catch (e) {
console.log('Label already removed or not found:', e.message);
}

View File

@@ -14,7 +14,7 @@ jobs:
files-changed:
if: ${{ !contains(github.event.pull_request.labels.*.name,'ci skip') && !contains(github.event.pull_request.labels.*.name,'minimal-tests') }}
name: Check which files changed
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
outputs:
e2e_all: ${{ steps.changes.outputs.e2e_all }}
@@ -81,7 +81,7 @@ jobs:
secrets: inherit
with:
skip: ${{ needs.files-changed.outputs.frontend_all != 'true' }}
skip-lint: ${{ needs.files-changed.outputs.frontend_all != 'true' && needs.files-changed.outputs.e2e_specs != 'true' }}
skip-lint: ${{ needs.files-changed.outputs.frontend_all != 'true' && needs.files-changed.outputs.e2e_all != 'true' }}
e2e-tests:
needs: [files-changed, uberjar]
@@ -103,7 +103,8 @@ jobs:
(needs.files-changed.outputs.embedding_sdk_components == 'true' ||
needs.files-changed.outputs.frontend_sources == 'true' ||
needs.files-changed.outputs.embedding_documentation == 'true' ||
needs.files-changed.outputs.embedding_sdk_ci == 'true')
needs.files-changed.outputs.embedding_sdk_ci == 'true' ||
needs.files-changed.outputs.embedding_sdk_host_sample_apps == 'true')
uses: ./.github/workflows/embedding-sdk-package-build.yml
secrets: inherit

View File

@@ -7,7 +7,7 @@ on:
jobs:
on-issue-opened:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
if: github.event.label.name == 'SECURITY'
steps:

View File

@@ -14,8 +14,8 @@ concurrency:
jobs:
semantic-search-tests-h2:
if: ${{ !inputs.skip }}
runs-on: ubuntu-22.04
timeout-minutes: 60
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 40
strategy:
fail-fast: false
matrix:
@@ -46,6 +46,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Test ${{ matrix.version.name }}
id: test-driver
uses: ./.github/actions/test-driver
with:
build-static-viz: ${{ matrix.job.build-static-viz }}
@@ -64,22 +65,23 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
semantic-search-tests-mariadb:
if: ${{ !inputs.skip }}
runs-on: ubuntu-22.04
timeout-minutes: 60
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 40
strategy:
fail-fast: false
matrix:
version:
- name: MariaDB 10.2 with pgvector pg17
junit-name: semantic-search-tests-mariadb-10-2
mariadb-image: circleci/mariadb:10.2.23
mariadb-image: metabase/mariadb:10.2.23
pgvector-image: pgvector/pgvector:pg17
- name: MariaDB Latest with pgvector pg17
junit-name: semantic-search-tests-mariadb-latest
mariadb-image: circleci/mariadb:latest
mariadb-image: mariadb:latest
pgvector-image: pgvector/pgvector:pg17
job:
- name: Semantic Search Tests
@@ -118,6 +120,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Test ${{ matrix.version.name }}
id: test-driver
uses: ./.github/actions/test-driver
with:
build-static-viz: ${{ matrix.job.build-static-viz }}
@@ -136,18 +139,19 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
semantic-search-tests-mysql:
if: ${{ !inputs.skip }}
runs-on: ubuntu-22.04
timeout-minutes: 60
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 40
strategy:
fail-fast: false
matrix:
version:
- name: MySQL 8.0 with pgvector pg17
junit-name: semantic-search-tests-mysql-8-0
mysql-image: cimg/mysql:8.0
mysql-image: mysql:8.0
pgvector-image: pgvector/pgvector:pg17
- name: MySQL Latest with pgvector pg17
junit-name: semantic-search-tests-mysql-latest
@@ -190,6 +194,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Test ${{ matrix.version.name }}
id: test-driver
uses: ./.github/actions/test-driver
with:
build-static-viz: ${{ matrix.job.build-static-viz }}
@@ -208,11 +213,12 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
semantic-search-tests-postgres:
if: ${{ !inputs.skip }}
runs-on: ubuntu-22.04
timeout-minutes: 60
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 40
strategy:
fail-fast: false
matrix:
@@ -263,6 +269,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Test ${{ matrix.version.name }}
id: test-driver
uses: ./.github/actions/test-driver
with:
build-static-viz: ${{ matrix.job.build-static-viz }}
@@ -281,6 +288,7 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
previous-step-outcome: ${{ steps.test-driver.outputs.test-outcome }}
semantic-search-tests-result:
needs:
@@ -288,7 +296,7 @@ jobs:
- semantic-search-tests-mariadb
- semantic-search-tests-mysql
- semantic-search-tests-postgres
runs-on: ubuntu-latest
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 5
name: semantic-search-tests-result
if: always() && !cancelled()

View File

@@ -11,7 +11,7 @@ on:
jobs:
set-announce-url:
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 15
steps:
- name: Validate input

View File

@@ -8,7 +8,7 @@ on:
jobs:
files-changed:
name: Check which files changed
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
timeout-minutes: 3
outputs:
snowplow: ${{ steps.changes.outputs.snowplow }}
@@ -24,7 +24,7 @@ jobs:
lint:
needs: files-changed
if: needs.files-changed.outputs.snowplow == 'true'
runs-on: ubuntu-22.04
runs-on: ${{ vars.DEFAULT_RUNNER_KEY }}
steps:
- name: Checkout
uses: actions/checkout@v4

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