Skip to content

Fix app resource drift on config field - #7326

Merged
andrewnester merged 2 commits into
mainfrom
fix/app-config-drift
Nov 4, 2026
Merged

andrewnester merged 2 commits into
mainfrom
fix/app-config-drift

Conversation

@andrewnester

Copy link
Copy Markdown
Contributor

Changes

Fix bundle plan reporting an update to an app's config.env values on every run, which also redeployed the app on every bundle deploy. The Apps API returns environment variable names only, so value and value_from are no longer compared against the remote deployment

Why

Fixes #7301

Tests

Added acceptance test

@andrewnester
andrewnester requested review from a team as code owners November 3, 2026 15:35
@github-actions github-actions Bot added the DABs DABs related issues label Nov 3, 2026
@github-actions

github-actions Bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

Commit: 6292de689 | Workflow run

Regression test report

Selected 3 changed tests (limit=20, 0 not selected)

6 tests: regression=4 unreleased=0 coverage=2 failing=0
test branch main (44f2eda) latest (v1.23.0)
TestAccept/bundle/resources/apps/config-drift-stopped/DMS= ✅ ✅ ✅
TestAccept/bundle/resources/apps/config-drift-stopped/DMS=true ✅ ✅ ✅
TestAccept/bundle/resources/apps/config-drift/DMS= ✅ ❌ ❌
TestAccept/bundle/resources/apps/config-drift/DMS=true ✅ ❌ ❌
TestAccept/bundle/resources/apps/config-env-no-drift/DMS= ✅ ❌ ❌
TestAccept/bundle/resources/apps/config-env-no-drift/DMS=true ✅ ❌ ❌
TestAccept/bundle/resources/apps/config-drift/DMS=: branch ✅ | main (44f2eda) ❌ | latest (v1.23.0) ❌

main (44f2eda):

acceptance_test.go:1342: 
        	Error Trace:	/home/runner/work/cli/cli/libs/testdiff/testdiff.go:22
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1342
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1095
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:660
        	Error:      	Not equal: 
        	            	expected: "{}\n{\n  \"config.command\": {\n    \"action\": \"update\",\n    \"old\": [\n      \"python\",\n      \"app.py\"\n    ],\n    \"new\": [\n      \"python\",\n      \"app.py\"\n    ],\n    \"remote\": [\n      \"streamlit\",\n      \"run\",\n      \"dashboard.py\"\n    ]\n  },\n  \"config.env\": {\n    \"action\": \"update\",\n    \"old\": [\n      {\n        \"name\": \"MY_VAR\",\n        \"value\": \"original_value\"\n      }\n    ],\n    \"new\": [\n      {\n        \"name\": \"MY_VAR\",\n        \"value\": \"original_value\"\n      }\n    ],\n    \"remote\": [\n      {\n        \"name\": \"MY_VAR\"\n      },\n      {\n        \"name\": \"NEW_VAR\"\n      }\n    ]\n  }\n}\n{}\n"
        	            	actual  : "{\n  \"config.env[0].value\": {\n    \"action\": \"update\",\n    \"old\": \"original_value\",\n    \"new\": \"original_value\"\n  }\n}\n{\n  \"config.command\": {\n    \"action\": \"update\",\n    \"old\": [\n      \"python\",\n      \"app.py\"\n    ],\n    \"new\": [\n      \"python\",\n      \"app.py\"\n    ],\n    \"remote\": [\n      \"streamlit\",\n      \"run\",\n      \"dashboard.py\"\n    ]\n  },\n  \"config.env\": {\n    \"action\": \"update\",\n    \"old\": [\n      {\n        \"name\": \"MY_VAR\",\n        \"value\": \"original_value\"\n      }\n    ],\n    \"new\": [\n      {\n        \"name\": \"MY_VAR\",\n        \"value\": \"original_value\"\n      }\n    ],\n    \"remote\": [\n      {\n        \"name\": \"MY_VAR\"\n      },\n      {\n        \"name\": \"NEW_VAR\"\n      }\n    ]\n  }\n}\n{\n  \"config.env[0].value\": {\n    \"action\": \"update\",\n    \"old\": \"original_value\",\n    \"new\": \"original_value\"\n  }\n}\n"
        	            	
        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -1,2 +1,8 @@
        	            	-{}
        	            	+{
        	            	+  "config.env[0].value": {
        	            	+    "action": "update",
        	            	+    "old": "original_value",
        	            	+    "new": "original_value"
        	            	+  }
        	            	+}
        	            	 {
        	            	@@ -42,3 +48,9 @@
        	            	 }
        	            	-{}
        	            	+{
        	            	+  "config.env[0].value": {
        	            	+    "action": "update",
        	            	+    "old": "original_value",
        	            	+    "new": "original_value"
        	            	+  }
        	            	+}
        	            	 
        	Test:       	TestAccept/bundle/resources/apps/config-drift/DMS=
        	Messages:   	bundle/resources/apps/config-drift/out.plan.direct.json vs /tmp/TestAcceptbundleresourcesappsconfig-driftDMS=2699675221/001/out.plan.direct.json

latest (v1.23.0): same output as main (44f2eda)

TestAccept/bundle/resources/apps/config-drift/DMS=true: branch ✅ | main (44f2eda) ❌ | latest (v1.23.0) ❌

main (44f2eda):

acceptance_test.go:1342: 
        	Error Trace:	/home/runner/work/cli/cli/libs/testdiff/testdiff.go:22
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1342
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1095
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:660
        	Error:      	Not equal: 
        	            	expected: "{}\n{\n  \"config.command\": {\n    \"action\": \"update\",\n    \"old\": [\n      \"python\",\n      \"app.py\"\n    ],\n    \"new\": [\n      \"python\",\n      \"app.py\"\n    ],\n    \"remote\": [\n      \"streamlit\",\n      \"run\",\n      \"dashboard.py\"\n    ]\n  },\n  \"config.env\": {\n    \"action\": \"update\",\n    \"old\": [\n      {\n        \"name\": \"MY_VAR\",\n        \"value\": \"original_value\"\n      }\n    ],\n    \"new\": [\n      {\n        \"name\": \"MY_VAR\",\n        \"value\": \"original_value\"\n      }\n    ],\n    \"remote\": [\n      {\n        \"name\": \"MY_VAR\"\n      },\n      {\n        \"name\": \"NEW_VAR\"\n      }\n    ]\n  }\n}\n{}\n"
        	            	actual  : "{\n  \"config.env[0].value\": {\n    \"action\": \"update\",\n    \"old\": \"original_value\",\n    \"new\": \"original_value\"\n  }\n}\n{\n  \"config.command\": {\n    \"action\": \"update\",\n    \"old\": [\n      \"python\",\n      \"app.py\"\n    ],\n    \"new\": [\n      \"python\",\n      \"app.py\"\n    ],\n    \"remote\": [\n      \"streamlit\",\n      \"run\",\n      \"dashboard.py\"\n    ]\n  },\n  \"config.env\": {\n    \"action\": \"update\",\n    \"old\": [\n      {\n        \"name\": \"MY_VAR\",\n        \"value\": \"original_value\"\n      }\n    ],\n    \"new\": [\n      {\n        \"name\": \"MY_VAR\",\n        \"value\": \"original_value\"\n      }\n    ],\n    \"remote\": [\n      {\n        \"name\": \"MY_VAR\"\n      },\n      {\n        \"name\": \"NEW_VAR\"\n      }\n    ]\n  }\n}\n{\n  \"config.env[0].value\": {\n    \"action\": \"update\",\n    \"old\": \"original_value\",\n    \"new\": \"original_value\"\n  }\n}\n"
        	            	
        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -1,2 +1,8 @@
        	            	-{}
        	            	+{
        	            	+  "config.env[0].value": {
        	            	+    "action": "update",
        	            	+    "old": "original_value",
        	            	+    "new": "original_value"
        	            	+  }
        	            	+}
        	            	 {
        	            	@@ -42,3 +48,9 @@
        	            	 }
        	            	-{}
        	            	+{
        	            	+  "config.env[0].value": {
        	            	+    "action": "update",
        	            	+    "old": "original_value",
        	            	+    "new": "original_value"
        	            	+  }
        	            	+}
        	            	 
        	Test:       	TestAccept/bundle/resources/apps/config-drift/DMS=true
        	Messages:   	bundle/resources/apps/config-drift/out.plan.direct.json vs /tmp/TestAcceptbundleresourcesappsconfig-driftDMS=true4028242084/001/out.plan.direct.json
FAIL

latest (v1.23.0):

acceptance_test.go:1342: 
        	Error Trace:	/home/runner/work/cli/cli/libs/testdiff/testdiff.go:22
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1342
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1095
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:660
        	Error:      	Not equal: 
        	            	expected: "{}\n{\n  \"config.command\": {\n    \"action\": \"update\",\n    \"old\": [\n      \"python\",\n      \"app.py\"\n    ],\n    \"new\": [\n      \"python\",\n      \"app.py\"\n    ],\n    \"remote\": [\n      \"streamlit\",\n      \"run\",\n      \"dashboard.py\"\n    ]\n  },\n  \"config.env\": {\n    \"action\": \"update\",\n    \"old\": [\n      {\n        \"name\": \"MY_VAR\",\n        \"value\": \"original_value\"\n      }\n    ],\n    \"new\": [\n      {\n        \"name\": \"MY_VAR\",\n        \"value\": \"original_value\"\n      }\n    ],\n    \"remote\": [\n      {\n        \"name\": \"MY_VAR\"\n      },\n      {\n        \"name\": \"NEW_VAR\"\n      }\n    ]\n  }\n}\n{}\n"
        	            	actual  : "{\n  \"config.env[0].value\": {\n    \"action\": \"update\",\n    \"old\": \"original_value\",\n    \"new\": \"original_value\"\n  }\n}\n{\n  \"config.command\": {\n    \"action\": \"update\",\n    \"old\": [\n      \"python\",\n      \"app.py\"\n    ],\n    \"new\": [\n      \"python\",\n      \"app.py\"\n    ],\n    \"remote\": [\n      \"streamlit\",\n      \"run\",\n      \"dashboard.py\"\n    ]\n  },\n  \"config.env\": {\n    \"action\": \"update\",\n    \"old\": [\n      {\n        \"name\": \"MY_VAR\",\n        \"value\": \"original_value\"\n      }\n    ],\n    \"new\": [\n      {\n        \"name\": \"MY_VAR\",\n        \"value\": \"original_value\"\n      }\n    ],\n    \"remote\": [\n      {\n        \"name\": \"MY_VAR\"\n      },\n      {\n        \"name\": \"NEW_VAR\"\n      }\n    ]\n  }\n}\n{\n  \"config.env[0].value\": {\n    \"action\": \"update\",\n    \"old\": \"original_value\",\n    \"new\": \"original_value\"\n  }\n}\n"
        	            	
        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -1,2 +1,8 @@
        	            	-{}
        	            	+{
        	            	+  "config.env[0].value": {
        	            	+    "action": "update",
        	            	+    "old": "original_value",
        	            	+    "new": "original_value"
        	            	+  }
        	            	+}
        	            	 {
        	            	@@ -42,3 +48,9 @@
        	            	 }
        	            	-{}
        	            	+{
        	            	+  "config.env[0].value": {
        	            	+    "action": "update",
        	            	+    "old": "original_value",
        	            	+    "new": "original_value"
        	            	+  }
        	            	+}
        	            	 
        	Test:       	TestAccept/bundle/resources/apps/config-drift/DMS=true
        	Messages:   	bundle/resources/apps/config-drift/out.plan.direct.json vs /tmp/TestAcceptbundleresourcesappsconfig-driftDMS=true2420172946/001/out.plan.direct.json
TestAccept/bundle/resources/apps/config-env-no-drift/DMS=: branch ✅ | main (44f2eda) ❌ | latest (v1.23.0) ❌

main (44f2eda):

acceptance_test.go:1342: Diff:
        --- bundle/resources/apps/config-env-no-drift/output.txt
        +++ /tmp/TestAcceptbundleresourcesappsconfig-env-no-driftDMS=3167464119/002/output.txt
        @@ -20,58 +20,11 @@
         
         === Re-plan is clean: value and value_from are input-only and must not drift
         >>> [CLI] bundle plan
        -Plan: 0 to add, 0 to change, 0 to delete, 1 unchanged
        -
        ->>> [CLI] bundle plan -o json
        -{
        -  "config.env[0].value": {
        -    "action": "skip",
        -    "reason": "input_only",
        -    "old": "hello",
        -    "new": "hello"
        -  },
        -  "config.env[1].value_from": {
        -    "action": "skip",
        -    "reason": "input_only",
        -    "old": "my-secret",
        -    "new": "my-secret"
        -  }
        -}
        -
        -=== A local change to an env value still plans an update
        ->>> update_file.py databricks.yml value: hello value: goodbye
        -
        ->>> [CLI] bundle plan
         update apps.myapp
         
         Plan: 0 to add, 1 to change, 0 to delete, 0 unchanged
        +contains error: 'Plan: 0 to add, 0 to change, 0 to delete, 1 unchanged' not found in the output.
         
        ->>> [CLI] bundle plan -o json
        -{
        -  "config.env[0].value": {
        -    "action": "update",
        -    "old": "hello",
        -    "new": "goodbye"
        -  },
        -  "config.env[1].value_from": {
        -    "action": "skip",
        -    "reason": "input_only",
        -    "old": "my-secret",
        -    "new": "my-secret"
        -  }
        -}
        -
        -=== Deploy applies the change and the plan is clean again
        ->>> [CLI] bundle deploy
        -Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/apps-config-env-no-drift/default/files...
        -✓ Deployment succeeded
        -Updated apps.myapp
        -Files: 1 uploaded, 0 deleted
        -Resources: 0 created, 1 changed, 0 deleted, 0 unchanged
        -
        ->>> [CLI] bundle plan
        -Plan: 0 to add, 0 to change, 0 to delete, 1 unchanged
        -
         >>> [CLI] bundle destroy --auto-approve
         The following resources will be deleted:
           delete resources.apps.myapp
        @@ -79,3 +28,5 @@
         All files and directories at the following location will be deleted: /Workspace/Users/[USERNAME]/.bundle/apps-config-env-no-drift/default
         
         Destroy: 1 deleted
        +
        +Exit code: 1
        
    acceptance_test.go:1132: Test produced unexpected files:
        .databricks/.gitignore
        .databricks/bundle/default/deployment.json

latest (v1.23.0): same output as main (44f2eda)

TestAccept/bundle/resources/apps/config-env-no-drift/DMS=true: branch ✅ | main (44f2eda) ❌ | latest (v1.23.0) ❌

main (44f2eda):

acceptance_test.go:1342: Diff:
        --- bundle/resources/apps/config-env-no-drift/output.txt
        +++ /tmp/TestAcceptbundleresourcesappsconfig-env-no-driftDMS=true4243222304/002/output.txt
        @@ -20,58 +20,11 @@
         
         === Re-plan is clean: value and value_from are input-only and must not drift
         >>> [CLI] bundle plan
        -Plan: 0 to add, 0 to change, 0 to delete, 1 unchanged
        -
        ->>> [CLI] bundle plan -o json
        -{
        -  "config.env[0].value": {
        -    "action": "skip",
        -    "reason": "input_only",
        -    "old": "hello",
        -    "new": "hello"
        -  },
        -  "config.env[1].value_from": {
        -    "action": "skip",
        -    "reason": "input_only",
        -    "old": "my-secret",
        -    "new": "my-secret"
        -  }
        -}
        -
        -=== A local change to an env value still plans an update
        ->>> update_file.py databricks.yml value: hello value: goodbye
        -
        ->>> [CLI] bundle plan
         update apps.myapp
         
         Plan: 0 to add, 1 to change, 0 to delete, 0 unchanged
        +contains error: 'Plan: 0 to add, 0 to change, 0 to delete, 1 unchanged' not found in the output.
         
        ->>> [CLI] bundle plan -o json
        -{
        -  "config.env[0].value": {
        -    "action": "update",
        -    "old": "hello",
        -    "new": "goodbye"
        -  },
        -  "config.env[1].value_from": {
        -    "action": "skip",
        -    "reason": "input_only",
        -    "old": "my-secret",
        -    "new": "my-secret"
        -  }
        -}
        -
        -=== Deploy applies the change and the plan is clean again
        ->>> [CLI] bundle deploy
        -Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/apps-config-env-no-drift/default/files...
        -✓ Deployment succeeded
        -Updated apps.myapp
        -Files: 1 uploaded, 0 deleted
        -Resources: 0 created, 1 changed, 0 deleted, 0 unchanged
        -
        ->>> [CLI] bundle plan
        -Plan: 0 to add, 0 to change, 0 to delete, 1 unchanged
        -
         >>> [CLI] bundle destroy --auto-approve
         The following resources will be deleted:
           delete resources.apps.myapp
        @@ -79,3 +28,5 @@
         All files and directories at the following location will be deleted: /Workspace/Users/[USERNAME]/.bundle/apps-config-env-no-drift/default
         
         Destroy: 1 deleted
        +
        +Exit code: 1
        
    acceptance_test.go:1132: Test produced unexpected files:
        .databricks/.gitignore
        .databricks/bundle/default/deployment.json

latest (v1.23.0):

acceptance_test.go:1342: Diff:
        --- bundle/resources/apps/config-env-no-drift/output.txt
        +++ /tmp/TestAcceptbundleresourcesappsconfig-env-no-driftDMS=true2916214284/002/output.txt
        @@ -20,58 +20,11 @@
         
         === Re-plan is clean: value and value_from are input-only and must not drift
         >>> [CLI] bundle plan
        -Plan: 0 to add, 0 to change, 0 to delete, 1 unchanged
        -
        ->>> [CLI] bundle plan -o json
        -{
        -  "config.env[0].value": {
        -    "action": "skip",
        -    "reason": "input_only",
        -    "old": "hello",
        -    "new": "hello"
        -  },
        -  "config.env[1].value_from": {
        -    "action": "skip",
        -    "reason": "input_only",
        -    "old": "my-secret",
        -    "new": "my-secret"
        -  }
        -}
        -
        -=== A local change to an env value still plans an update
        ->>> update_file.py databricks.yml value: hello value: goodbye
        -
        ->>> [CLI] bundle plan
         update apps.myapp
         
         Plan: 0 to add, 1 to change, 0 to delete, 0 unchanged
        +contains error: 'Plan: 0 to add, 0 to change, 0 to delete, 1 unchanged' not found in the output.
         
        ->>> [CLI] bundle plan -o json
        -{
        -  "config.env[0].value": {
        -    "action": "update",
        -    "old": "hello",
        -    "new": "goodbye"
        -  },
        -  "config.env[1].value_from": {
        -    "action": "skip",
        -    "reason": "input_only",
        -    "old": "my-secret",
        -    "new": "my-secret"
        -  }
        -}
        -
        -=== Deploy applies the change and the plan is clean again
        ->>> [CLI] bundle deploy
        -Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/apps-config-env-no-drift/default/files...
        -✓ Deployment succeeded
        -Updated apps.myapp
        -Files: 1 uploaded, 0 deleted
        -Resources: 0 created, 1 changed, 0 deleted, 0 unchanged
        -
        ->>> [CLI] bundle plan
        -Plan: 0 to add, 0 to change, 0 to delete, 1 unchanged
        -
         >>> [CLI] bundle destroy --auto-approve
         The following resources will be deleted:
           delete resources.apps.myapp
        @@ -79,3 +28,5 @@
         All files and directories at the following location will be deleted: /Workspace/Users/[USERNAME]/.bundle/apps-config-env-no-drift/default
         
         Destroy: 1 deleted
        +
        +Exit code: 1
        
    acceptance_test.go:1132: Test produced unexpected files:
        .databricks/.gitignore
        .databricks/bundle/default/deployment.json
FAIL

ignore_remote_changes:
- field: space # This field is not yet supported by Update APIs but exposed in the API spec. TODO: fix when update APIs supports it.
reason: managed
# The Apps API returns deployment env vars with their name only: value and value_from are

@janniklasrose janniklasrose Nov 3, 2026 •

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

can we fix this upstream in protos? (i.e. mark as input_only)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I believe we can, this is to fix it until addressed upstream

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Is this new?

@eng-dev-ecosystem-bot

eng-dev-ecosystem-bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Collaborator

Integration test report

Commit: 6292de6

Run: 41682433051

Env 🔄​flaky ✅​pass 🙈​skip Time
🔄​ aws linux-2core-8gb 1 270 18 12:27
✅​ aws-windows-latest-4core-16gb 273 16 9:21
✅​ azure linux-2core-8gb 270 18 10:27
✅​ azure-windows-latest-4core-16gb 272 16 7:25
✅​ gcp linux-2core-8gb 271 18 10:29
✅​ gcp-windows-latest-4core-16gb 273 16 7:35
Test Name aws linux-2core-8gb
🔄​ TestSyncNestedFolderSync 🔄​f
Top 13 slowest tests (at least 2 minutes):
duration env testname
4:06 aws-windows-latest-4core-16gb TestImportDirDoesNotOverwrite
3:12 azure-windows-latest-4core-16gb TestAccept
3:11 gcp-windows-latest-4core-16gb TestAccept
2:47 gcp-windows-latest-4core-16gb TestSyncIncrementalFileSync
2:38 gcp linux-2core-8gb TestFilerRecursiveDelete/workspace_files_extensions
2:37 aws-windows-latest-4core-16gb TestAccept
2:36 aws linux-2core-8gb TestFilerWorkspaceFilesExtensionsDelete
2:28 aws linux-2core-8gb TestFilerReadDir/workspace_files
2:21 azure linux-2core-8gb TestFilerWorkspaceFilesExtensionsStat
2:17 azure linux-2core-8gb TestFilerRecursiveDelete/workspace_files
2:17 aws-windows-latest-4core-16gb TestFilerWorkspaceFilesExtensionsRead
2:07 gcp linux-2core-8gb TestFilerWorkspaceFilesExtensionsReadDir
2:05 gcp linux-2core-8gb TestFilerWorkspaceFilesExtensionsDelete

@andrewnester
andrewnester requested review from janniklasrose and removed request for lennartkats-db November 3, 2026 17:11
@andrewnester
andrewnester added this pull request to the merge queue Nov 4, 2026
Merged via the queue into main with commit 2534bb0 Nov 4, 2026
28 checks passed
@andrewnester
andrewnester deleted the fix/app-config-drift branch November 4, 2026 09:36
deco-sdk-tagging Bot added a commit that referenced this pull request Nov 4, 2026
## Release v1.24.0

### Notable Changes

 * A variable used as the value of a secret is now sensitive: referencing it from any other field, such as a job parameter or a secret's `comment`, is an error because the value would be used in plain text. Mark other secret-holding variables with `sensitive: true` to get the same protection. ([#7288](#7288))

### CLI

 * Fix `databricks auth login` and `databricks configure` overwriting the parent profile's host and token when saving a profile with a dotted name such as `team.prod` next to an existing `[team]`. ([#7266](#7266))
 * `databricks auth login` and `databricks auth token` now reject the name of an existing profile after "Create a new profile" instead of logging in to that profile. ([#7196](#7196))
 * `databricks auth login` and `databricks auth token` now reject a host that is not a URL with a hostname, such as `/`, `?o=123` or `https://`, instead of falling back to `DATABRICKS_HOST` or failing later. An empty host after "Enter a host URL manually" in the login profile picker no longer starts discovery login. ([#7195](#7195))
 * Prompts that validate their input, such as the `databricks configure` host prompt, no longer open with a red cross before anything is typed. ([#7314](#7314))
 * `databricks ssh connect` now documents `--environment-version` for choosing the serverless environment version, starts a separate default-named server for each version, and rejects the flag together with `--cluster`. Default connection names also include the environment version in their hash, so the default name when `--environment-version` is not specified changes with this release. Configuration associated with the old connection name (secret scope, SSH keys and known hosts in your local `.databricks` folder) will no longer be used and can be safely removed. ([#7310](#7310))

### AI Runtime

 * Show workspace-supported accelerator types in `databricks air run -h config.compute.accelerator_type`. ([#7275](#7275))
 * `air list` now reports `No active runs found.` for an empty active-only result. ([#7276](#7276))
 * Stop printing a retry notice on every `air run --watch`; retries are still reported when they happen. ([#7270](#7270))

### Bundles

 * Fix `bundle plan` reporting an update to an app's `config.env` values on every run, which also redeployed the app on every `bundle deploy`. The Apps API returns environment variable names only, so `value` and `value_from` are no longer compared against the remote deployment. ([#7326](#7326))
 * Add the `data_quality_monitors` resource for data quality monitors on Unity Catalog schemas and tables (direct engine only). ([#7094](#7094))
 * `bundle deploy` now asks for confirmation before recreating or deleting a Feature View, and `bundle deploy` and `bundle destroy` warn that FeatureSpecs using a Feature View are not checked. ([#7164](#7164))
 * Accept grant `privileges` values that the SDK enum does not list yet: `bundle validate` no longer warns (or errors under `--strict`) on them, and the PyDABs `Privilege` enum accepts unknown strings instead of raising. The JSON schema and PyDABs still advertise the known values for completion. ([#7315](#7315))
 * Add the `materialization_sets` resource, which materializes Feature Store Feature Views to offline and online stores. ([#7164](#7164))
 * Detect notebooks with the same rule as the workspace: a `.py`, `.sql`, `.scala` or `.r` file is a notebook when its first line contains `Databricks notebook source`, for example after a byte order mark. Previously such a file was tracked as a plain file, so removing it locally left the remote notebook behind. ([#7290](#7290))
 * Add `sensitive: true` for bundle variables. A variable used as the value of a secret is sensitive by default. `bundle validate -o json` redacts only sensitive variables instead of every string variable, and a sensitive variable can only be referenced from a sensitive resource field (such as a secret's `value`) or from another sensitive variable. ([#7288](#7288))

### Dependency Updates

 * Bump dependencies with known vulnerabilities. ([#7305](#7305))
 * Bump dependencies with known vulnerabilities. ([#7327](#7327))
 * Update the Go SDK to [v0.191.1](https://github.com/databricks/databricks-sdk-go/releases/tag/v0.191.1). ([#7277](#7277))
 * Update the Go SDK to [v0.193.0](https://github.com/databricks/databricks-sdk-go/releases/tag/v0.193.0). ([#7303](#7303))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

DABs DABs related issues

Projects

None yet

Development

Successfully merging this pull request may close these issues.

bundle plan always plans an App update for config.env values, because the Apps API does not return them

4 participants