Skip to content

fix: manifest load from local template path#4785

Merged
pietern merged 1 commit intomainfrom
manifest-load-local-template
Mar 18, 2026
Merged

fix: manifest load from local template path#4785
pietern merged 1 commit intomainfrom
manifest-load-local-template

Conversation

@MarioCadenas
Copy link
Contributor

@MarioCadenas MarioCadenas commented Mar 18, 2026

Summary

This branch fixes databricks apps manifest so it behaves like a true manifest viewer for AppKit templates, especially when resolving a local template via DATABRICKS_APPKIT_TEMPLATE_PATH or --template.

Preserve raw manifest output (cmd/apps/manifest.go):
Previously, the command loaded appkit.plugins.json into the CLI's internal manifest struct and then re-serialized it, which dropped fields not represented in that struct such as scaffolding, rules, and richer field metadata. The change now reads appkit.plugins.json directly and writes the raw file contents to stdout, so local templates and newer manifest schema fields are preserved exactly as authored.

Supporting infrastructure

  • cmd/apps/init_test.go — Strengthens manifest-related tests by asserting exact raw output instead of checking for a couple of JSON substrings.
  • cmd/apps/init_test.go — Adds coverage for the DATABRICKS_APPKIT_TEMPLATE_PATH fallback so runManifestOnly() is verified to resolve and print a local template manifest when no explicit --template is provided.

Other changes

  • Updates the apps manifest help text in cmd/apps/manifest.go to clarify that it prints the manifest's raw contents.
  • Keeps template resolution behavior aligned with apps init; only the output format of apps manifest changed.

@MarioCadenas MarioCadenas marked this pull request as ready for review March 18, 2026 13:48
@MarioCadenas MarioCadenas requested a review from a team as a code owner March 18, 2026 13:48
Copy link
Member

@pkosiec pkosiec left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@MarioCadenas MarioCadenas enabled auto-merge March 18, 2026 13:51
@eng-dev-ecosystem-bot
Copy link
Collaborator

eng-dev-ecosystem-bot commented Mar 18, 2026

Commit: 433c936

Run: 23247685645

Env 🟨​KNOWN 🔄​flaky 💚​RECOVERED 🙈​SKIP ✅​pass 🙈​skip Time
🟨​ aws linux 7 1 9 268 797 7:26
🟨​ aws windows 7 1 9 270 795 6:44
💚​ aws-ucws linux 8 9 365 712 8:14
🔄​ aws-ucws windows 2 7 9 366 710 7:07
💚​ azure linux 2 11 271 795 6:06
💚​ azure windows 2 11 273 793 5:18
💚​ azure-ucws linux 2 11 370 708 6:49
🔄​ azure-ucws windows 2 1 11 371 706 7:00
💚​ gcp linux 2 11 267 798 6:11
💚​ gcp windows 2 11 269 796 5:37
18 interesting tests: 9 SKIP, 7 KNOWN, 2 flaky
Test Name aws linux aws windows aws-ucws linux aws-ucws windows azure linux azure windows azure-ucws linux azure-ucws windows gcp linux gcp windows
🟨​ TestAccept 🟨​K 🟨​K 💚​R 💚​R 💚​R 💚​R 💚​R 🔄​f 💚​R 💚​R
🙈​ TestAccept/bundle/resources/permissions 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🟨​ TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/with_permissions 🟨​K 🟨​K 💚​R 💚​R 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🟨​ TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/with_permissions/DATABRICKS_BUNDLE_ENGINE=direct 🟨​K 🟨​K 💚​R 💚​R
🟨​ TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/with_permissions/DATABRICKS_BUNDLE_ENGINE=terraform 🟨​K 🟨​K 💚​R 💚​R
🟨​ TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/without_permissions 🟨​K 🟨​K 💚​R 💚​R 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🟨​ TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/without_permissions/DATABRICKS_BUNDLE_ENGINE=direct 🟨​K 🟨​K 💚​R 💚​R
🟨​ TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/without_permissions/DATABRICKS_BUNDLE_ENGINE=terraform 🟨​K 🟨​K 💚​R 💚​R
🙈​ TestAccept/bundle/resources/postgres_branches/basic 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/bundle/resources/postgres_branches/recreate 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/bundle/resources/postgres_branches/update_protected 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/bundle/resources/postgres_branches/without_branch_id 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/bundle/resources/postgres_endpoints/basic 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/bundle/resources/postgres_endpoints/recreate 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/bundle/resources/postgres_projects/update_display_name 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/bundle/resources/synced_database_tables/basic 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🔄​ TestAccept/ssh/connect-serverless-gpu 🙈​s 🙈​s ✅​p 🔄​f 🙈​s 🙈​s ✅​p 🔄​f 🙈​s 🙈​s
🔄​ TestAccept/ssh/connection 💚​R 💚​R 💚​R 🔄​f 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R
Top 20 slowest tests (at least 2 minutes):
duration env testname
3:50 azure-ucws windows TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=terraform
3:37 gcp windows TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=direct
3:19 aws linux TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=terraform
3:13 gcp linux TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=terraform
3:12 gcp windows TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=terraform
3:12 gcp linux TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=direct
2:51 aws-ucws linux TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=terraform
2:48 aws linux TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=direct
2:47 azure linux TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=terraform
2:47 aws windows TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=direct
2:46 aws windows TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=terraform
2:44 azure linux TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=direct
2:43 aws-ucws windows TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=direct
2:43 azure-ucws linux TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=terraform
2:43 azure windows TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=direct
2:41 aws-ucws linux TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=direct
2:39 aws-ucws windows TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=terraform
2:20 azure windows TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=terraform
2:09 azure-ucws linux TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=direct
2:06 azure-ucws windows TestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=direct

@pietern pietern disabled auto-merge March 18, 2026 14:01
@pietern pietern merged commit 7675d8c into main Mar 18, 2026
18 checks passed
@pietern pietern deleted the manifest-load-local-template branch March 18, 2026 14:01
@eng-dev-ecosystem-bot
Copy link
Collaborator

Commit: 7675d8c

Run: 23248562754

Env 💥​PANIC ❌​FAIL 🟨​KNOWN 🤯​MISS 🔄​flaky 💚​RECOVERED 🙈​SKIP ✅​pass 🙈​skip Time
❌​ aws linux 3 7 1 9 496 750 58:16
❌​ aws windows 3 7 2 1 9 466 758 62:03
💥​ aws-ucws linux 1 5 2 54 25 1 717 598 120:00
❌​ aws-ucws windows 4 3 5 23 1 730 611 117:09
❌​ azure linux 3 1 4 1 11 495 748 91:18
❌​ azure windows 3 1 1 11 471 756 48:38
❌​ azure-ucws linux 2 1 3 3 10 752 603 115:49
❌​ azure-ucws windows 2 5 4 10 713 614 119:03
❌​ gcp linux 3 1 6 1 11 476 756 91:14
❌​ gcp windows 3 1 1 11 454 764 58:20
101 interesting tests: 50 MISS, 16 flaky, 16 RECOVERED, 9 KNOWN, 8 FAIL, 1 PANIC, 1 SKIP
Test Name aws linux aws windows aws-ucws linux aws-ucws windows azure linux azure windows azure-ucws linux azure-ucws windows gcp linux gcp windows
🟨​ TestAccept 🟨​K 🟨​K 🤯​M 🟨​K 🟨​K 🟨​K 🟨​K 💚​R 🟨​K 🟨​K
❌​ TestAccept/bundle/apps/job_permissions ❌​F ❌​F 🤯​M ❌​F ❌​F ❌​F 🔄​f ✅​p ❌​F ❌​F
❌​ TestAccept/bundle/apps/job_permissions/DATABRICKS_BUNDLE_ENGINE=direct ❌​F ❌​F 🤯​M ❌​F ❌​F ❌​F 🔄​f 🔄​f ❌​F ❌​F
❌​ TestAccept/bundle/apps/job_permissions/DATABRICKS_BUNDLE_ENGINE=terraform ❌​F ❌​F 🤯​M 🔄​f ❌​F ❌​F ✅​p 🔄​f ❌​F ❌​F
🤯​ TestAccept/bundle/artifacts/artifact_path_with_volume/volume_doesnot_exist 🙈​s 🙈​s 🤯​M ✅​p 🙈​s 🙈​s ✅​p ✅​p 🙈​s 🙈​s
🤯​ TestAccept/bundle/artifacts/artifact_path_with_volume/volume_doesnot_exist/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ✅​p ✅​p ✅​p
🤯​ TestAccept/bundle/artifacts/artifact_path_with_volume/volume_doesnot_exist/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M ✅​p ✅​p ✅​p
🤯​ TestAccept/bundle/artifacts/artifact_path_with_volume/volume_not_deployed 🙈​s 🙈​s 🤯​M ✅​p 🙈​s 🙈​s ✅​p ✅​p 🙈​s 🙈​s
🤯​ TestAccept/bundle/artifacts/artifact_path_with_volume/volume_not_deployed/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ✅​p ✅​p ✅​p
🤯​ TestAccept/bundle/artifacts/artifact_path_with_volume/volume_not_deployed/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M ✅​p ✅​p ✅​p
🤯​ TestAccept/bundle/config-remote-sync/cli_defaults ✅​p 🙈​s 🤯​M 🙈​s ✅​p 🙈​s ✅​p 🙈​s ✅​p 🙈​s
🤯​ TestAccept/bundle/config-remote-sync/cli_defaults/DATABRICKS_BUNDLE_ENGINE=direct ✅​p 🤯​M ✅​p ✅​p ✅​p
🤯​ TestAccept/bundle/config-remote-sync/cli_defaults/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p 🤯​M ✅​p ✅​p ✅​p
🤯​ TestAccept/bundle/config-remote-sync/config_edits ✅​p 🙈​s 🤯​M 🙈​s ✅​p 🙈​s ✅​p 🙈​s ✅​p 🙈​s
🤯​ TestAccept/bundle/config-remote-sync/config_edits/DATABRICKS_BUNDLE_ENGINE=direct ✅​p 🤯​M ✅​p ✅​p ✅​p
🤯​ TestAccept/bundle/config-remote-sync/config_edits/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p 🤯​M ✅​p ✅​p ✅​p
🤯​ TestAccept/bundle/config-remote-sync/flushed_cache ✅​p 🙈​s 🤯​M 🙈​s ✅​p 🙈​s ✅​p 🙈​s ✅​p 🙈​s
🤯​ TestAccept/bundle/config-remote-sync/flushed_cache/DATABRICKS_BUNDLE_ENGINE=direct ✅​p 🤯​M ✅​p ✅​p ✅​p
🤯​ TestAccept/bundle/config-remote-sync/flushed_cache/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p 🤯​M ✅​p ✅​p ✅​p
🤯​ TestAccept/bundle/config-remote-sync/formatting_preserved ✅​p 🙈​s 🤯​M 🙈​s ✅​p 🙈​s ✅​p 🙈​s ✅​p 🙈​s
🤯​ TestAccept/bundle/config-remote-sync/formatting_preserved/DATABRICKS_BUNDLE_ENGINE=direct ✅​p 🤯​M ✅​p ✅​p ✅​p
🤯​ TestAccept/bundle/config-remote-sync/formatting_preserved/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p 🤯​M ✅​p ✅​p ✅​p
🤯​ TestAccept/bundle/config-remote-sync/job_fields 🙈​s 🙈​s 🤯​M 🙈​s 🙈​s 🙈​s ✅​p 🙈​s 🙈​s 🙈​s
🤯​ TestAccept/bundle/config-remote-sync/job_fields/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ✅​p
🤯​ TestAccept/bundle/config-remote-sync/job_fields/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M ✅​p
🤯​ TestAccept/bundle/config-remote-sync/job_multiple_tasks ✅​p 🙈​s 🤯​M 🙈​s ✅​p 🙈​s ✅​p 🙈​s ✅​p 🙈​s
🤯​ TestAccept/bundle/config-remote-sync/job_multiple_tasks/DATABRICKS_BUNDLE_ENGINE=direct ✅​p 🤯​M ✅​p ✅​p ✅​p
🤯​ TestAccept/bundle/config-remote-sync/job_multiple_tasks/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p 🤯​M ✅​p ✅​p ✅​p
🤯​ TestAccept/bundle/config-remote-sync/job_pipeline_task ✅​p 🙈​s 🤯​M 🙈​s ✅​p 🙈​s ✅​p 🙈​s ✅​p 🙈​s
🤯​ TestAccept/bundle/config-remote-sync/job_pipeline_task/DATABRICKS_BUNDLE_ENGINE=direct ✅​p 🤯​M ✅​p ✅​p ✅​p
🤯​ TestAccept/bundle/config-remote-sync/job_pipeline_task/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p 🤯​M ✅​p ✅​p ✅​p
🤯​ TestAccept/bundle/config-remote-sync/multiple_files ✅​p 🙈​s 🤯​M 🙈​s ✅​p 🙈​s ✅​p 🙈​s ✅​p 🙈​s
🤯​ TestAccept/bundle/config-remote-sync/multiple_files/DATABRICKS_BUNDLE_ENGINE=direct ✅​p 🤯​M ✅​p ✅​p ✅​p
🤯​ TestAccept/bundle/config-remote-sync/multiple_files/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p 🤯​M ✅​p ✅​p ✅​p
🤯​ TestAccept/bundle/config-remote-sync/multiple_resources 🙈​s 🙈​s 🤯​M 🙈​s 🙈​s 🙈​s ✅​p 🙈​s 🙈​s 🙈​s
🤯​ TestAccept/bundle/config-remote-sync/multiple_resources/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ✅​p
🤯​ TestAccept/bundle/config-remote-sync/multiple_resources/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M ✅​p
🤯​ TestAccept/bundle/config-remote-sync/output_json ✅​p 🙈​s 🤯​M 🙈​s ✅​p 🙈​s ✅​p 🙈​s ✅​p 🙈​s
🤯​ TestAccept/bundle/config-remote-sync/output_json/DATABRICKS_BUNDLE_ENGINE=direct ✅​p 🤯​M ✅​p ✅​p ✅​p
🤯​ TestAccept/bundle/config-remote-sync/output_json/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p 🤯​M ✅​p ✅​p ✅​p
🤯​ TestAccept/bundle/config-remote-sync/output_no_changes ✅​p 🙈​s 🤯​M 🙈​s ✅​p 🙈​s ✅​p 🙈​s ✅​p 🙈​s
🤯​ TestAccept/bundle/config-remote-sync/output_no_changes/DATABRICKS_BUNDLE_ENGINE=direct ✅​p 🤯​M ✅​p ✅​p ✅​p
🤯​ TestAccept/bundle/config-remote-sync/output_no_changes/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p 🤯​M ✅​p ✅​p ✅​p
🤯​ TestAccept/bundle/config-remote-sync/pipeline_fields 🙈​s 🙈​s 🤯​M 🙈​s 🙈​s 🙈​s ✅​p 🙈​s 🙈​s 🙈​s
🤯​ TestAccept/bundle/config-remote-sync/pipeline_fields/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ✅​p
🤯​ TestAccept/bundle/config-remote-sync/pipeline_fields/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M ✅​p
🤯​ TestAccept/bundle/config-remote-sync/target_override ✅​p 🙈​s 🤯​M 🙈​s ✅​p 🙈​s ✅​p 🙈​s ✅​p 🙈​s
💥​ TestAccept/bundle/config-remote-sync/target_override/DATABRICKS_BUNDLE_ENGINE=direct ✅​p 💥​P ✅​p ✅​p ✅​p
🤯​ TestAccept/bundle/config-remote-sync/target_override/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p 🤯​M ✅​p ✅​p ✅​p
🤯​ TestAccept/bundle/deploy/empty-bundle ✅​p ✅​p 🤯​M ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p
🤯​ TestAccept/bundle/deploy/empty-bundle/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p 🤯​M ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p
🤯​ TestAccept/bundle/deployment/bind/dashboard ✅​p ✅​p 🤯​M ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p
🤯​ TestAccept/bundle/deployment/bind/dashboard/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p 🤯​M ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p
🔄​ TestAccept/bundle/integration_whl/base ✅​p 🔄​f ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p
🔄​ TestAccept/bundle/integration_whl/base/DATABRICKS_BUNDLE_ENGINE=direct ✅​p 🔄​f ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p
🔄​ TestAccept/bundle/integration_whl/interactive_cluster_dynamic_version ✅​p ✅​p ✅​p ✅​p 🔄​f ✅​p ✅​p ✅​p ✅​p ✅​p
🔄​ TestAccept/bundle/integration_whl/interactive_cluster_dynamic_version/DATABRICKS_BUNDLE_ENGINE=direct/DATA_SECURITY_MODE=SINGLE_USER ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p 🔄​f 🔄​f ✅​p
🔄​ TestAccept/bundle/integration_whl/interactive_cluster_dynamic_version/DATABRICKS_BUNDLE_ENGINE=direct/DATA_SECURITY_MODE=USER_ISOLATION ✅​p ✅​p ✅​p ✅​p 🔄​f ✅​p ✅​p 🔄​f 🔄​f ✅​p
🔄​ TestAccept/bundle/integration_whl/interactive_single_user ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p 🔄​f ✅​p
🔄​ TestAccept/bundle/integration_whl/interactive_single_user/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p 🔄​f ✅​p
❌​ TestAccept/bundle/invariant/no_drift 🙈​s 🙈​s ❌​F ❌​F 🙈​s 🙈​s ❌​F ❌​F 🙈​s 🙈​s
❌​ TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=schema_grant_ref.yml.tmpl ❌​F ❌​F ❌​F ❌​F
🔄​ TestAccept/bundle/resources/clusters/run/spark_python_task ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p 🔄​f ✅​p
🔄​ TestAccept/bundle/resources/clusters/run/spark_python_task/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p 🔄​f ✅​p
🙈​ TestAccept/bundle/resources/permissions 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🔄​ TestAccept/bundle/resources/permissions/factcheck ✅​p ✅​p ✅​p ✅​p 🔄​f ✅​p ✅​p ✅​p 🙈​s 🙈​s
🔄​ TestAccept/bundle/resources/permissions/factcheck/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p ✅​p ✅​p 🔄​f ✅​p ✅​p ✅​p
🟨​ TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/with_permissions 🟨​K 🟨​K 💚​R 💚​R 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🟨​ TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/with_permissions/DATABRICKS_BUNDLE_ENGINE=direct 🟨​K 🟨​K 💚​R 💚​R
🟨​ TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/with_permissions/DATABRICKS_BUNDLE_ENGINE=terraform 🟨​K 🟨​K 💚​R 💚​R
🟨​ TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/without_permissions 🟨​K 🟨​K 💚​R 💚​R 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🟨​ TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/without_permissions/DATABRICKS_BUNDLE_ENGINE=direct 🟨​K 🟨​K 💚​R 💚​R
🟨​ TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/without_permissions/DATABRICKS_BUNDLE_ENGINE=terraform 🟨​K 🟨​K 💚​R 💚​R
💚​ TestAccept/bundle/resources/postgres_branches/basic 🙈​S 🙈​S 💚​R 💚​R 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
💚​ TestAccept/bundle/resources/postgres_branches/basic/DATABRICKS_BUNDLE_ENGINE=direct 💚​R 💚​R
💚​ TestAccept/bundle/resources/postgres_branches/basic/DATABRICKS_BUNDLE_ENGINE=terraform 💚​R 💚​R
💚​ TestAccept/bundle/resources/postgres_branches/recreate 🙈​S 🙈​S 💚​R 💚​R 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
💚​ TestAccept/bundle/resources/postgres_branches/recreate/DATABRICKS_BUNDLE_ENGINE=direct 💚​R 💚​R
💚​ TestAccept/bundle/resources/postgres_branches/recreate/DATABRICKS_BUNDLE_ENGINE=terraform 💚​R 💚​R
💚​ TestAccept/bundle/resources/postgres_branches/update_protected 🙈​S 🙈​S 💚​R 💚​R 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
💚​ TestAccept/bundle/resources/postgres_branches/update_protected/DATABRICKS_BUNDLE_ENGINE=direct 💚​R 💚​R
💚​ TestAccept/bundle/resources/postgres_branches/update_protected/DATABRICKS_BUNDLE_ENGINE=terraform 💚​R 💚​R
💚​ TestAccept/bundle/resources/postgres_branches/without_branch_id 🙈​S 🙈​S 💚​R 💚​R 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
💚​ TestAccept/bundle/resources/postgres_branches/without_branch_id/DATABRICKS_BUNDLE_ENGINE=direct 💚​R 💚​R
💚​ TestAccept/bundle/resources/postgres_branches/without_branch_id/DATABRICKS_BUNDLE_ENGINE=terraform 💚​R 💚​R
🔄​ TestAccept/bundle/resources/postgres_endpoints/basic 🙈​S 🙈​S 💚​R 🔄​f 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🔄​ TestAccept/bundle/resources/postgres_endpoints/basic/DATABRICKS_BUNDLE_ENGINE=terraform 💚​R 🔄​f
💚​ TestAccept/bundle/resources/postgres_endpoints/recreate 🙈​S 🙈​S 💚​R 💚​R 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🟨​ TestAccept/bundle/resources/postgres_projects/update_display_name 🙈​S 🙈​S 🟨​K 🟨​K 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🟨​ TestAccept/bundle/resources/postgres_projects/update_display_name/DATABRICKS_BUNDLE_ENGINE=terraform 🟨​K 🟨​K
💚​ TestAccept/bundle/resources/synced_database_tables/basic 🙈​S 🙈​S 💚​R 💚​R 🙈​S 🙈​S 💚​R 💚​R 🙈​S 🙈​S
💚​ TestAccept/bundle/resources/synced_database_tables/basic/DATABRICKS_BUNDLE_ENGINE=direct 💚​R 💚​R 💚​R 💚​R
💚​ TestAccept/bundle/resources/synced_database_tables/basic/DATABRICKS_BUNDLE_ENGINE=terraform 💚​R 💚​R 💚​R 💚​R
❌​ TestAccept/ssh/connect-serverless-gpu 🙈​s 🙈​s ❌​F ✅​p 🙈​s 🙈​s ✅​p ✅​p 🙈​s 🙈​s
🔄​ TestAccept/ssh/connection 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R 🔄​f 🔄​f 💚​R 💚​R
🤯​ TestDbrAcceptance 🙈​s 🙈​s 🤯​M 🙈​s 🙈​s 🙈​s 🙈​s 🙈​s 🙈​s 🙈​s
🤯​ TestInprocessMode 🙈​s 🙈​s 🤯​M 🙈​s 🙈​s 🙈​s 🙈​s 🙈​s 🙈​s 🙈​s
❌​ TestSparkJarTaskDeployAndRunOnVolumes ✅​p ✅​p ❌​F ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p
❌​ TestSparkJarTaskDeployAndRunOnVolumes/Databricks_Runtime_13.3_LTS 🙈​s 🙈​s ❌​F ✅​p 🙈​s 🙈​s ✅​p ✅​p 🙈​s 🙈​s
🔄​ TestSparkJarTaskDeployAndRunOnWorkspace ✅​p ✅​p ✅​p 🔄​f ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p
🔄​ TestSparkJarTaskDeployAndRunOnWorkspace/Databricks_Runtime_15.4_LTS ✅​p ✅​p ✅​p 🔄​f ✅​p ✅​p ✅​p ✅​p ✅​p ✅​p
Top 50 slowest tests (at least 2 minutes):
duration env testname
21:01 azure linux TestAccept/bundle/integration_whl/interactive_cluster_dynamic_version/DATABRICKS_BUNDLE_ENGINE=terraform/DATA_SECURITY_MODE=SINGLE_USER
17:32 azure linux TestAccept/bundle/resources/permissions/factcheck/DATABRICKS_BUNDLE_ENGINE=terraform
14:36 gcp linux TestAccept/bundle/integration_whl/interactive_single_user/DATABRICKS_BUNDLE_ENGINE=terraform
14:13 aws linux TestSparkJarTaskDeployAndRunOnWorkspace/Databricks_Runtime_15.4_LTS
12:43 azure linux TestAccept/bundle/integration_whl/interactive_single_user/DATABRICKS_BUNDLE_ENGINE=terraform
12:37 aws-ucws linux TestAccept/bundle/resources/model_serving_endpoints/running-endpoint/DATABRICKS_BUNDLE_ENGINE=terraform
11:43 azure-ucws windows TestAccept/bundle/integration_whl/base/DATABRICKS_BUNDLE_ENGINE=direct
10:51 aws-ucws windows TestAccept/bundle/resources/model_serving_endpoints/running-endpoint/DATABRICKS_BUNDLE_ENGINE=direct
10:44 azure linux TestAccept/bundle/integration_whl/interactive_cluster_dynamic_version/DATABRICKS_BUNDLE_ENGINE=terraform/DATA_SECURITY_MODE=USER_ISOLATION
10:40 aws-ucws windows TestSparkJarTaskDeployAndRunOnVolumes/Databricks_Runtime_13.3_LTS
10:19 aws-ucws linux TestSparkJarTaskDeployAndRunOnVolumes/Databricks_Runtime_14.3_LTS
9:54 azure-ucws windows TestAccept/bundle/resources/permissions/factcheck/DATABRICKS_BUNDLE_ENGINE=terraform
9:42 gcp windows TestAccept/bundle/integration_whl/interactive_cluster_dynamic_version/DATABRICKS_BUNDLE_ENGINE=terraform/DATA_SECURITY_MODE=SINGLE_USER
9:35 aws-ucws windows TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=database_instance.yml.tmpl
9:24 aws-ucws windows TestAccept/bundle/resources/model_serving_endpoints/running-endpoint/DATABRICKS_BUNDLE_ENGINE=terraform
9:18 azure-ucws windows TestAccept/bundle/integration_whl/interactive_single_user/DATABRICKS_BUNDLE_ENGINE=terraform
9:06 azure windows TestAccept/bundle/resources/permissions/factcheck/DATABRICKS_BUNDLE_ENGINE=terraform
9:05 azure-ucws windows TestAccept/bundle/integration_whl/interactive_cluster_dynamic_version/DATABRICKS_BUNDLE_ENGINE=terraform/DATA_SECURITY_MODE=SINGLE_USER
9:00 aws-ucws linux TestAccept/bundle/integration_whl/interactive_single_user/DATABRICKS_BUNDLE_ENGINE=terraform
8:59 aws-ucws linux TestAccept/bundle/resources/model_serving_endpoints/running-endpoint/DATABRICKS_BUNDLE_ENGINE=direct
8:46 aws linux TestAccept/bundle/resources/permissions/factcheck/DATABRICKS_BUNDLE_ENGINE=terraform
8:34 aws windows TestAccept/bundle/integration_whl/custom_params/DATABRICKS_BUNDLE_ENGINE=direct
8:31 aws windows TestAccept/bundle/integration_whl/base/DATABRICKS_BUNDLE_ENGINE=terraform
8:27 aws-ucws windows TestAccept/bundle/integration_whl/base/DATABRICKS_BUNDLE_ENGINE=terraform
8:24 aws linux TestAccept/bundle/integration_whl/base/DATABRICKS_BUNDLE_ENGINE=terraform
8:20 gcp linux TestAccept/bundle/integration_whl/interactive_cluster_dynamic_version/DATABRICKS_BUNDLE_ENGINE=direct/DATA_SECURITY_MODE=USER_ISOLATION
8:14 aws-ucws linux TestSparkJarTaskDeployAndRunOnVolumes/Databricks_Runtime_15.4_LTS
8:10 aws windows TestAccept/bundle/resources/permissions/factcheck/DATABRICKS_BUNDLE_ENGINE=terraform
8:08 aws-ucws windows TestSparkJarTaskDeployAndRunOnVolumes/Databricks_Runtime_15.4_LTS
8:08 gcp linux TestAccept/bundle/integration_whl/interactive_cluster/DATABRICKS_BUNDLE_ENGINE=terraform
8:04 gcp windows TestSparkJarTaskDeployAndRunOnWorkspace/Databricks_Runtime_15.4_LTS
8:03 aws-ucws linux TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=database_instance.yml.tmpl
7:58 gcp linux TestAccept/bundle/integration_whl/interactive_cluster_dynamic_version/DATABRICKS_BUNDLE_ENGINE=direct/DATA_SECURITY_MODE=SINGLE_USER
7:56 aws-ucws linux TestAccept/bundle/integration_whl/base/DATABRICKS_BUNDLE_ENGINE=terraform
7:51 gcp windows TestAccept/bundle/integration_whl/interactive_cluster/DATABRICKS_BUNDLE_ENGINE=direct
7:51 aws windows TestAccept/bundle/integration_whl/custom_params/DATABRICKS_BUNDLE_ENGINE=terraform
7:51 aws-ucws linux TestAccept/bundle/invariant/migrate/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=database_catalog.yml.tmpl
7:50 gcp windows TestAccept/bundle/integration_whl/interactive_cluster/DATABRICKS_BUNDLE_ENGINE=terraform
7:46 gcp windows TestAccept/bundle/integration_whl/interactive_cluster_dynamic_version/DATABRICKS_BUNDLE_ENGINE=direct/DATA_SECURITY_MODE=SINGLE_USER
7:40 azure-ucws linux TestAccept/bundle/resources/model_serving_endpoints/running-endpoint/DATABRICKS_BUNDLE_ENGINE=terraform
7:39 aws-ucws linux TestAccept/bundle/resources/database_catalogs/basic/DATABRICKS_BUNDLE_ENGINE=terraform
7:37 aws-ucws windows TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=database_catalog.yml.tmpl
7:35 gcp linux TestAccept/bundle/integration_whl/base/DATABRICKS_BUNDLE_ENGINE=terraform
7:34 gcp windows TestAccept/bundle/integration_whl/base/DATABRICKS_BUNDLE_ENGINE=terraform
7:32 gcp linux TestAccept/bundle/run/app-with-job/DATABRICKS_BUNDLE_ENGINE=terraform
7:32 gcp linux TestAccept/bundle/run/app-with-job/DATABRICKS_BUNDLE_ENGINE=direct
7:31 gcp linux TestAccept/bundle/integration_whl/base/DATABRICKS_BUNDLE_ENGINE=direct
7:24 azure-ucws windows TestAccept/bundle/integration_whl/base/DATABRICKS_BUNDLE_ENGINE=terraform
7:23 gcp windows TestAccept/bundle/integration_whl/base/DATABRICKS_BUNDLE_ENGINE=direct
7:22 azure windows TestAccept/bundle/integration_whl/base/DATABRICKS_BUNDLE_ENGINE=direct

github-merge-queue bot pushed a commit that referenced this pull request Mar 18, 2026
## Why

The CLI's CODEOWNERS catch-all assigns 6 people to every PR outside a
few narrow paths. This creates review noise and diffuses responsibility.
We want targeted reviewer suggestions based on who actually worked on
the changed code recently.

## Changes

Before: Every PR touching core code auto-assigns all 6 CODEOWNERS. No
signal about who is best suited to review.

Now: A new GitHub Action analyzes git history of the changed files and
posts a PR comment with two sections:
- **Suggested reviewers** (1-3 people best suited based on
recency-weighted git history)
- **Eligible reviewers** (everyone from CODEOWNERS who could review,
minus the suggested ones)

This is additive only. CODEOWNERS and auto-assign stay unchanged.

How it works:
- Triggers on PR open, synchronize, and ready-for-review (skips drafts
and fork PRs)
- Classifies changed files by type (source=1.0, tests=0.3,
acceptance=0.2, generated=0.0)
- Scores contributors using recency-weighted commit history (half-life
150 days)
- Resolves git author names to GitHub logins via the GitHub API (no
hardcoded alias table to maintain)
- Parses `.github/CODEOWNERS` to find eligible reviewers for the changed
paths
- Updates the comment in-place on re-runs (no notification churn)

Implementation: a single Python script (`tools/suggest_reviewers.py`,
281 lines) and a minimal workflow YAML.

## Test plan

- [x] Action ran on this PR itself and posted a comment successfully
- [x] Verified script parses cleanly, passed `make checks`, passed `ruff
format`
- [x] Dry-run tested against 4 recent merged PRs with different
characteristics:

**PR #4784** (66 files, by pietern, big DABs rename):
```
## Suggested reviewers
- @denik -- recent work in `./`, `bundle/`, `cmd/bundle/generate/`
Confidence: high

## Eligible reviewers
@andrewnester, @anton-107, @lennartkats-db, @shreyas-goenka, @simonfaltum
```
Correctly identifies Denis as the clear top reviewer (2x second place
score). All 6 CODEOWNERS shown as eligible.

**PR #4782** (13 files, by denik, bundle engine priority):
```
## Suggested reviewers
- @andrewnester -- recent work in `bundle/schema/`, `bundle/internal/schema/`, `cmd/bundle/generate/`
- @pietern -- recent work in `bundle/schema/`, `cmd/bundle/generate/`, `bundle/internal/schema/`
- @shreyas-goenka -- recent work in `bundle/schema/`, `bundle/internal/schema/`, `cmd/bundle/`
Confidence: medium

## Eligible reviewers
@anton-107, @simonfaltum
```
Suggests 3 reviewers when scores are close. Remaining CODEOWNERS shown
as eligible.

**PR #4785** (2 files, by MarioCadenas, apps bug fix):
```
## Suggested reviewers
- @arsenyinfo -- recent work in `cmd/apps/`
- @pietern -- recent work in `cmd/apps/`
- @pkosiec -- recent work in `cmd/apps/`
Confidence: low

## Eligible reviewers
@databricks/eng-apps-devex
```
Correctly suggests apps-area contributors (not the catch-all
CODEOWNERS). Shows the apps team as eligible. Low confidence since only
2 files.

**PR #4774** (28 files, by denik, direct engine grants):
```
## Suggested reviewers
- @andrewnester -- recent work in `bundle/direct/dresources/`, `acceptance/bundle/invariant/`
- @shreyas-goenka -- recent work in `bundle/direct/dresources/`
Confidence: high

## Eligible reviewers
@anton-107, @pietern, @simonfaltum
```
Correctly identifies the two main bundle/direct contributors. High
confidence with clear score separation.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants