Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
b7781f3
direct: Add preliminary job_runs resource
radakam Jun 15, 2026
2d12f1d
direct: Generate job_runs bundle schema
radakam Jun 15, 2026
8236aa9
direct: Generate job_runs required-field validation
radakam Jun 15, 2026
d23fa96
direct: Add job_runs happy-path acceptance test
radakam Jun 15, 2026
7756b6d
direct: Add job_runs redeploy acceptance test
radakam Jun 15, 2026
e4f1ee9
direct: Update resource enumeration tests for job_runs
radakam Jun 15, 2026
81c0092
direct: Fix job_runs lint and regenerate stale artifacts
radakam Jun 15, 2026
c24048c
direct: Update completeness tests for job_runs
radakam Jun 15, 2026
22802ea
direct: Extend job_runs acceptance tests
radakam Jun 17, 2026
243bc4a
direct: Address job_runs review feedback
radakam Jun 17, 2026
23e6afb
direct: Fix job_runs CI lint and field-count test
radakam Jun 17, 2026
927b7bc
direct: Record only faithfully-echoed fields in job_runs DoRead
radakam Jun 18, 2026
c268de2
direct: Return remote state from job_runs DoCreate
radakam Jun 19, 2026
88b87d1
Update generated files
radakam Jun 19, 2026
8a71c9e
Update generated files
radakam Jun 19, 2026
c9890d8
Revert unrelated uv.lock registry changes
radakam Jun 19, 2026
f0427e0
job_runs: Surface run URL in bundle summary
radakam Jun 19, 2026
f39bf63
direct: Re-trigger job_runs only on own config change
radakam Jun 25, 2026
b6bb90f
direct: Add job_runs to no_drift invariant test
radakam Jun 25, 2026
91282db
Merge remote-tracking branch 'origin/main' into job-runs-resource
radakam Jun 25, 2026
fd6a121
direct: Treat missing job run as not-found in Exists; add changelog
radakam Jun 25, 2026
8735c7f
job_runs: Fill in schema descriptions for resource and lifecycle
radakam Jun 25, 2026
9129a5b
direct: Show recreate plan in job_runs redeploy test and clarify re-t…
radakam Jun 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions NEXT_CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
### CLI

### Bundles
* Add a `job_runs` resource (direct engine only) that triggers a job run as part of `bundle deploy`. Any change to the run configuration re-triggers the run; otherwise it is considered up to date ([#5603](https://github.com/databricks/cli/pull/5603)).

### Dependency updates

Expand Down
20 changes: 20 additions & 0 deletions acceptance/bundle/invariant/configs/job_run.yml.tmpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
bundle:
name: test-bundle-$UNIQUE_NAME

resources:
jobs:
foo:
name: test-job-$UNIQUE_NAME
tasks:
- task_key: only_task
notebook_task:
notebook_path: /Shared/notebook
new_cluster:
spark_version: $DEFAULT_SPARK_VERSION
node_type_id: $NODE_TYPE_ID
instance_pool_id: $TEST_INSTANCE_POOL_ID
num_workers: 1

job_runs:
foo_run:
job_id: ${resources.jobs.foo.id}
1 change: 1 addition & 0 deletions acceptance/bundle/invariant/continue_293/out.test.toml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions acceptance/bundle/invariant/continue_293/test.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ EnvMatrixExclude.no_vector_search_endpoint = ["INPUT_CONFIG=vector_search_endpoi
# genie_spaces resource is not supported on v0.293.0
EnvMatrixExclude.no_genie_space = ["INPUT_CONFIG=genie_space.yml.tmpl"]

# job_runs resource is not supported on v0.293.0
EnvMatrixExclude.no_job_run = ["INPUT_CONFIG=job_run.yml.tmpl"]

# Dotted pipeline configuration keys are not supported on v0.293.0
EnvMatrixExclude.no_pipeline_config_dots = ["INPUT_CONFIG=pipeline_config_dots.yml.tmpl"]

Expand Down
1 change: 1 addition & 0 deletions acceptance/bundle/invariant/migrate/out.test.toml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions acceptance/bundle/invariant/migrate/test.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@
EnvMatrixExclude.no_vector_search_endpoint = ["INPUT_CONFIG=vector_search_endpoint.yml.tmpl"]
EnvMatrixExclude.no_vector_search_index = ["INPUT_CONFIG=vector_search_index.yml.tmpl"]

# job_runs is a direct-only resource with no terraform converter, so the
# terraform deploy that seeds the migration fails for it.
EnvMatrixExclude.no_job_run = ["INPUT_CONFIG=job_run.yml.tmpl"]

# Error: Catalog resources are only supported with direct deployment mode
EnvMatrixExclude.no_catalog = ["INPUT_CONFIG=catalog.yml.tmpl"]
EnvMatrixExclude.no_external_location = ["INPUT_CONFIG=external_location.yml.tmpl"]
Expand Down
1 change: 1 addition & 0 deletions acceptance/bundle/invariant/no_drift/out.test.toml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions acceptance/bundle/invariant/test.toml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ EnvMatrix.INPUT_CONFIG = [
"job_pydabs_1000_tasks.yml.tmpl",
"job_cross_resource_ref.yml.tmpl",
"job_permission_ref.yml.tmpl",
"job_run.yml.tmpl",
"job_run_job_ref.yml.tmpl",
"job_with_depends_on.yml.tmpl",
"job_with_permissions.yml.tmpl",
Expand Down
39 changes: 39 additions & 0 deletions acceptance/bundle/refschema/out.fields.txt
Original file line number Diff line number Diff line change
Expand Up @@ -756,6 +756,45 @@ resources.genie_spaces.*.permissions[*].group_name string ALL
resources.genie_spaces.*.permissions[*].level iam.PermissionLevel ALL
resources.genie_spaces.*.permissions[*].service_principal_name string ALL
resources.genie_spaces.*.permissions[*].user_name string ALL
resources.job_runs.*.dbt_commands []string ALL
resources.job_runs.*.dbt_commands[*] string ALL
resources.job_runs.*.id string INPUT
resources.job_runs.*.idempotency_token string ALL
resources.job_runs.*.jar_params []string ALL
resources.job_runs.*.jar_params[*] string ALL
resources.job_runs.*.job_id int64 ALL
resources.job_runs.*.job_parameters map[string]string ALL
resources.job_runs.*.job_parameters.* string ALL
resources.job_runs.*.lifecycle resources.Lifecycle INPUT
resources.job_runs.*.lifecycle.prevent_destroy bool INPUT
resources.job_runs.*.modified_status string INPUT
resources.job_runs.*.notebook_params map[string]string ALL
resources.job_runs.*.notebook_params.* string ALL
resources.job_runs.*.only []string ALL
resources.job_runs.*.only[*] string ALL
resources.job_runs.*.performance_target jobs.PerformanceTarget ALL
resources.job_runs.*.pipeline_params *jobs.PipelineParams ALL
resources.job_runs.*.pipeline_params.full_refresh bool ALL
resources.job_runs.*.pipeline_params.full_refresh_selection []string ALL
resources.job_runs.*.pipeline_params.full_refresh_selection[*] string ALL
resources.job_runs.*.pipeline_params.refresh_flow_selection []string ALL
resources.job_runs.*.pipeline_params.refresh_flow_selection[*] string ALL
resources.job_runs.*.pipeline_params.refresh_selection []string ALL
resources.job_runs.*.pipeline_params.refresh_selection[*] string ALL
resources.job_runs.*.pipeline_params.reset_checkpoint_selection []string ALL
resources.job_runs.*.pipeline_params.reset_checkpoint_selection[*] string ALL
resources.job_runs.*.python_named_params map[string]string ALL
resources.job_runs.*.python_named_params.* string ALL
resources.job_runs.*.python_params []string ALL
resources.job_runs.*.python_params[*] string ALL
resources.job_runs.*.queue *jobs.QueueSettings ALL
resources.job_runs.*.queue.enabled bool ALL
resources.job_runs.*.run_id int64 REMOTE
resources.job_runs.*.spark_submit_params []string ALL
resources.job_runs.*.spark_submit_params[*] string ALL
resources.job_runs.*.sql_params map[string]string ALL
resources.job_runs.*.sql_params.* string ALL
resources.job_runs.*.url string INPUT
resources.jobs.*.budget_policy_id string ALL
resources.jobs.*.continuous *jobs.Continuous ALL
resources.jobs.*.continuous.pause_status jobs.PauseStatus ALL
Expand Down
15 changes: 15 additions & 0 deletions acceptance/bundle/resources/job_runs/basic/databricks.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
bundle:
Comment thread
radakam marked this conversation as resolved.
name: job-runs-basic

resources:
jobs:
my_job:
name: my-job
tasks:
- task_key: main
notebook_task:
notebook_path: /Workspace/test
Comment thread
radakam marked this conversation as resolved.

job_runs:
my_run:
job_id: ${resources.jobs.my_job.id}
3 changes: 3 additions & 0 deletions acceptance/bundle/resources/job_runs/basic/out.test.toml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

90 changes: 90 additions & 0 deletions acceptance/bundle/resources/job_runs/basic/output.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@

=== deploy triggers exactly one run
>>> [CLI] bundle validate
Name: job-runs-basic
Target: default
Workspace:
User: [USERNAME]
Path: /Workspace/Users/[USERNAME]/.bundle/job-runs-basic/default

Validation OK!

>>> [CLI] bundle plan
create job_runs.my_run
create jobs.my_job

Plan: 2 to add, 0 to change, 0 to delete, 0 unchanged

>>> [CLI] bundle summary
Name: job-runs-basic
Target: default
Workspace:
User: [USERNAME]
Path: /Workspace/Users/[USERNAME]/.bundle/job-runs-basic/default
Resources:
Job Runs:
my_run:
Name:
URL: (not deployed)
Jobs:
my_job:
Name: my-job
URL: (not deployed)

>>> [CLI] bundle deploy
Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/job-runs-basic/default/files...
Deploying resources...
Updating deployment state...
Deployment complete!

>>> [CLI] bundle deploy
Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/job-runs-basic/default/files...
Deploying resources...
Updating deployment state...
Deployment complete!

>>> [CLI] bundle plan
Plan: 0 to add, 0 to change, 0 to delete, 2 unchanged

>>> [CLI] bundle summary
Name: job-runs-basic
Target: default
Workspace:
User: [USERNAME]
Path: /Workspace/Users/[USERNAME]/.bundle/job-runs-basic/default
Resources:
Job Runs:
my_run:
Name:
URL: [DATABRICKS_URL]/jobs/[MY_JOB_ID]/runs/[MY_RUN_ID]?w=[NUMID]
Jobs:
my_job:
Name: my-job
URL: [DATABRICKS_URL]/jobs/[MY_JOB_ID]?w=[NUMID]

=== exactly one run-now request was made
>>> print_requests.py //jobs/run-now
{
"method": "POST",
"path": "/api/2.2/jobs/run-now",
"body": {
"job_id": [MY_JOB_ID]
}
}

=== the triggered run id is stored in state
>>> read_id.py my_run
[MY_RUN_ID]

>>> read_id.py my_job
[MY_JOB_ID]

>>> [CLI] bundle destroy --auto-approve
The following resources will be deleted:
delete resources.job_runs.my_run
delete resources.jobs.my_job

All files and directories at the following location will be deleted: /Workspace/Users/[USERNAME]/.bundle/job-runs-basic/default

Deleting files...
Destroy complete!
24 changes: 24 additions & 0 deletions acceptance/bundle/resources/job_runs/basic/script
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
cleanup() {
trace $CLI bundle destroy --auto-approve
rm out.requests.txt
}
trap cleanup EXIT

title "deploy triggers exactly one run"
trace $CLI bundle validate
trace $CLI bundle plan
trace $CLI bundle summary
trace $CLI bundle deploy
Comment thread
radakam marked this conversation as resolved.
Comment thread
radakam marked this conversation as resolved.

# confirm that redeploy does not trigger a second run
trace $CLI bundle deploy

trace $CLI bundle plan
trace $CLI bundle summary

title "exactly one run-now request was made"
trace print_requests.py //jobs/run-now

title "the triggered run id is stored in state"
trace read_id.py my_run
trace read_id.py my_job
4 changes: 4 additions & 0 deletions acceptance/bundle/resources/job_runs/basic/test.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# job_runs is a direct-engine-only resource; the Terraform provider has no
# equivalent, so restrict the matrix to direct.
EnvMatrix.DATABRICKS_BUNDLE_ENGINE = ["direct"]
RecordRequests = true
26 changes: 26 additions & 0 deletions acceptance/bundle/resources/job_runs/job_parameters/databricks.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
bundle:
name: job-runs-job-parameters

resources:
jobs:
my_job:
name: my-job
parameters:
- name: env
default: dev
- name: region
default: us
tasks:
- task_key: main
notebook_task:
notebook_path: /Workspace/test

job_runs:
my_run:
job_id: ${resources.jobs.my_job.id}
# Override only one of the job's two parameters. GetRun resolves the full
# parameter set (including the un-overridden `region` default), so without
# job_parameters in ignore_remote_changes this drift would recreate the run
# on every plan.
job_parameters:
env: prod

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

49 changes: 49 additions & 0 deletions acceptance/bundle/resources/job_runs/job_parameters/output.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@

=== deploy triggers the run with only the overridden parameter
>>> [CLI] bundle deploy
Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/job-runs-job-parameters/default/files...
Deploying resources...
Updating deployment state...
Deployment complete!

>>> print_requests.py //jobs/run-now
{
"method": "POST",
"path": "/api/2.2/jobs/run-now",
"body": {
"job_id": [NUMID],
"job_parameters": {
"env": "prod"
}
}
}

=== plan is stable: the resolved job default does not look like drift
>>> [CLI] bundle plan
Plan: 0 to add, 0 to change, 0 to delete, 2 unchanged

>>> [CLI] bundle summary
Name: job-runs-job-parameters
Target: default
Workspace:
User: [USERNAME]
Path: /Workspace/Users/[USERNAME]/.bundle/job-runs-job-parameters/default
Resources:
Job Runs:
my_run:
Name:
URL: [DATABRICKS_URL]/jobs/[NUMID]/runs/[NUMID]?w=[NUMID]
Jobs:
my_job:
Name: my-job
URL: [DATABRICKS_URL]/jobs/[NUMID]?w=[NUMID]

>>> [CLI] bundle destroy --auto-approve
The following resources will be deleted:
delete resources.job_runs.my_run
delete resources.jobs.my_job

All files and directories at the following location will be deleted: /Workspace/Users/[USERNAME]/.bundle/job-runs-job-parameters/default

Deleting files...
Destroy complete!
13 changes: 13 additions & 0 deletions acceptance/bundle/resources/job_runs/job_parameters/script
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
cleanup() {
trace $CLI bundle destroy --auto-approve
rm out.requests.txt
}
trap cleanup EXIT

title "deploy triggers the run with only the overridden parameter"
trace $CLI bundle deploy
trace print_requests.py //jobs/run-now

title "plan is stable: the resolved job default does not look like drift"
trace $CLI bundle plan
trace $CLI bundle summary
4 changes: 4 additions & 0 deletions acceptance/bundle/resources/job_runs/job_parameters/test.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# job_runs is a direct-engine-only resource; the Terraform provider has no
# equivalent, so restrict the matrix to direct.
EnvMatrix.DATABRICKS_BUNDLE_ENGINE = ["direct"]
RecordRequests = true
17 changes: 17 additions & 0 deletions acceptance/bundle/resources/job_runs/redeploy/databricks.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
bundle:
name: job-runs-redeploy

resources:
jobs:
my_job:
name: my-job
tasks:
- task_key: main
notebook_task:
notebook_path: /Workspace/test

job_runs:
my_run:
job_id: ${resources.jobs.my_job.id}
job_parameters:
env: dev
3 changes: 3 additions & 0 deletions acceptance/bundle/resources/job_runs/redeploy/out.test.toml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading