Commit 6444cb8
authored
bundle deploy/destroy: report per-resource actions and a summary (#5720)
`bundle deploy` now lists the per-resource actions and summary lines,
instead of generic progress chatter:
```
Uploading bundle files to /Workspace/Users/me@example.com/.bundle/my_project/dev/files...
Created jobs.my_job
Created jobs.no_tasks_job
Files: 7 uploaded, 0 deleted
Resources: 2 created, 0 changed, 0 deleted, 0 unchanged
```
`Files:` is reported separately because a deploy that only changes
business logic (a `.py` or `.sql` file) leaves every resource unchanged,
so a lone `0 changed` reads like a no-op. Both lines always print, so
the shape of the output does not vary between deploys.
A deploy that fails after uploading still reports `Files:` — those files
were uploaded. It does not report `Resources:`, which would describe
what was intended rather than what was applied.
`bundle destroy` gets a matching summary line (`Destroy: N deleted`),
counting top-level resources to match its approval list.
## Details
- Add `CountActions()`/`ActionCounts` and `NotSelected` to
`deployplan.Plan`.
- `libs/sync` retains the upload/delete counts from its diff; `b.Files`
lists every tracked file, not the changed ones.
- `-q`/`--quiet` prints only the summary lines. Repeat it (`-qq`) to
print only warnings and errors, which also drops progress messages
(`Uploading bundle files to ...`, `Building ...`, `Executing
'postdeploy' script`). Supported on `plan`, `deploy`, `destroy` and
`pipelines deploy`; `destroy` did not have `-q` before. It is a repeat
counter, and progress suppression travels on the context
(`cmdio.WithQuiet`/`LogProgress`) because those messages come from
mutators that receive no bundle. `acceptance/bundle/quiet-levels` covers
all nine command/level combinations; acceptance tests use `-qq` where
the engines genuinely diverge per-resource.
- With `--select`, the resource summary appends `, N not selected`.
- Drop progress chatter: `Deploying resources...`, `Deployment
complete!`, `Updating deployment state...`, `Deleting files...`,
`Destroy complete!`.
- The summary prints after the `postdeploy` script, so a failing script
is not preceded by a line that appears to vouch for the run; it still
prints on that failure (the resources were applied) and the script's
error still propagates.1 parent b2cee42 commit 6444cb8
676 files changed
Lines changed: 3854 additions & 3444 deletions
File tree
- .nextchanges/notable-changes
- acceptance
- apps/deploy
- bundle-no-args-with-flags
- bundle-no-args
- bundle
- ai_runtime_task/local_code_source
- apps
- app_yaml
- compute_size
- git_source
- job_permissions
- artifacts
- ai_runtime_code_source
- artifact_upload_for_volumes
- artifact_upload_for_workspace
- artifact_upload_with_no_library_reference
- build_and_files_whl
- glob_exact_whl
- issue_3109
- shell
- bash
- basic
- cmd
- default
- sh
- unique_name_libraries
- upload_multiple_libraries
- whl_change_version
- whl_dbfs
- whl_dynamic
- whl_explicit
- whl_implicit_custom_path
- whl_implicit_notebook
- whl_implicit
- whl_multiple
- whl_no_cleanup
- whl_prebuilt_multiple
- whl_prebuilt_outside_dynamic
- whl_prebuilt_outside
- whl_via_environment_key
- bundle_tag
- id
- url_ref
- url
- config-remote-sync
- cli_defaults
- config_edits
- dashboard_etag
- flushed_cache
- formatting_preserved
- job_fields
- job_multiple_tasks
- job_params_variables
- job_pipeline_task
- multiple_files
- multiple_resources
- output_json
- output_no_changes
- pipeline_fields
- policy_injected_cluster_fields
- resolve_variables
- select_basic
- select_multiple
- skip_permissions
- split
- cli_default_split_element
- dotted_target
- isolation
- keyed_edit
- keyed_remove
- keyed_rename
- keyed_twoblock
- multifile
- nested_add_split_parent
- nested_sequence
- positional
- remove_field_both_blocks
- rename_ambiguous_pairing
- rename_ambiguous_single_block
- rename_two_removes_one_add
- target_variable
- variable_file_order
- target_override
- task_rename_revert
- validation_errors
- deployment
- bind
- alert
- catalog
- cluster
- dashboard
- recreation
- database_instance
- experiment
- external_location
- genie_space
- job
- already-managed-different
- already-managed-same
- engine-from-config
- generate-and-bind
- job-abort-bind
- job-spark-python-task
- noop-job
- python-job
- stale-state
- model-serving-endpoint
- pipelines
- recreate
- update
- postgres_database
- postgres_role
- quality-monitor
- registered-model
- schema
- secret-scope
- sql_warehouse
- vector_search_endpoint
- vector_search_index
- volume
- unbind
- engine-from-config
- grants
- job
- permissions
- python-job
- deploy
- empty-bundle
- experimental-python
- fail-on-active-runs
- files
- no-snapshot-sync
- out-of-band-delete
- force-lock-config
- immutable-no-artifacts
- immutable-permissions-change
- immutable
- mlops-stacks
- partial-summary-on-push-fail
- pipeline-config-dots
- python-notebook
- readplan
- basic
- cli-version-mismatch
- grants-remove-principal
- postgres_role
- serial-mismatch
- snapshot-comparison
- spark-jar-task
- wal
- chain-3-jobs
- corrupted-wal-entry
- crash-after-create
- empty-wal
- failed-plan-no-wal
- header-only-wal
- stale-wal
- wal-with-delete
- yaml-sync-empty-grants
- destroy
- all-resources
- force-lock-node-limit
- jobs-and-pipeline
- lineage-mismatch-after-redeploy
- empty_string_dropped
- environments/dependencies
- generate
- auto-bind
- dashboard-inplace
- genie_space_inplace
- pipeline_and_deploy
- python_job_and_deploy
- help
- bundle-deploy
- bundle-destroy
- integration_whl
- base
- custom_params
- interactive_cluster_dynamic_version
- interactive_cluster
- interactive_single_user
- serverless_custom_params
- serverless_dynamic_version
- serverless
- wrapper_custom_params
- wrapper
- libraries
- maven
- outside_of_bundle_root
- pypi
- lifecycle/prevent-destroy
- local_state_staleness
- migrate
- added-direct-only
- added
- auto-migrate-clean
- auto-migrate-direct-only-envvar
- auto-migrate-direct-only
- auto-migrate-empty-tfstate
- auto-migrate-envvar
- auto-migrate-push-failure
- auto-migrate-tfbackup-failure
- basic
- dashboards
- default-python
- grants
- permissions
- profile_arg
- removed
- runas
- var_arg
- open
- python
- mutator-permissions-owner-5682
- quiet-levels
- resource_deps
- bad_syntax
- create_error
- duplicate_ref
- grant_ref
- id_chain
- immutable_field_ref
- job_id_big_graph
- delete_all
- destroy
- job_id_delete_bar
- job_id_delete_foo
- job_id
- job_tasks
- jobs_update_remote
- jobs_update
- loop_jobs
- loop_self
- missing_ingestion_definition
- missing_map_key
- missing_string_field
- model_id_ref
- non_existent_field
- permission_ref
- pipelines_recreate
- remote_app_url
- remote_field_storage_location
- remote_pipeline
- resources_var_presets_implicit_deps
- resources_var_presets
- resources_var
- tf_path_only_error
- tf_path_renames
- unicode_reference
- volume_path_contains_id
- volume_path_job_ref
- resources
- alerts
- basic
- with_file
- apps
- config-drift-stopped
- config-drift
- config-no-deployment
- create_already_exists
- default_description
- git-source-no-deployment
- immutable
- inline_config
- lifecycle-started-omitted
- lifecycle-started-toggle
- lifecycle-started
- readplan-lifecycle
- resource-refs
- update
- catalogs
- auto-approve
- basic
- drift/managed_properties
- empty-name
- with-schemas
- clusters
- deploy
- data_security_mode
- instance_pool_and_node_type
- instance_pool
- local_ssd_count
- num_workers_absent
- simple
- update-after-create
- update-and-resize-autoscale
- update-and-resize
- workload_type
- lifecycle-started-toggle
- lifecycle-started
- readplan-lifecycle
- resize-terminated-fallback
- run/spark_python_task
- dashboards
- change-embed-credentials
- change-name
- change-parent-path
- change-serialized-dashboard
- dataset-catalog-schema
- delete-trashed-out-of-band
- destroy
- detect-change
- generate_inplace
- nested-folders
- publish-failure-cleans-up-dashboard
- publish-failure-stale-content
- republish-after-draft-update
- simple_outside_bundle_root
- simple_syncroot
- simple
- unpublish-out-of-band
- database_catalogs
- basic
- recreate
- database_instances
- recreate
- single-instance
- experiments/basic
- external_locations
- genie_spaces
- delete_warning
- inline
- parent_path_update
- recreate_when_gone
- serialized_space
- simple
- version_migration
- grants
- catalogs
- registered_models
- schemas
- all_privileges_coexist
- all_privileges
- change_privilege
- duplicate_principals
- duplicate_privileges
- out_of_band_principal
- remove_all
- remove_principal
- volumes
- independent
- instance_pools
- job_runs
- basic
- failed_run
- interrupted_run
- job_parameters
- redeploy
- retried_run_now
- wait
- jobs
- alert-task
- big_id
- check-metadata
- create-error
- delete_job
- delete_task
- double-underscore-keys
- fail-on-active-runs
- instance_pool_and_node_type
- no-git-provider
- num_workers
- on_failure_empty_slice
- remote_add_tag
- remote_delete
- deploy
- destroy
- removed_from_config
- remote_matches_config
- tags_empty_map
- task-source
- tasks-reorder-locally
- unknown-terraform-field
- update_single_node
- update
- webhook-reorder-remote
- model_serving_endpoints
- basic
- drift
- recreated_same_name
- telemetry_config_unmanaged
- telemetry_config_with_config_update
- write_only
- recreate
- catalog-name
- name-change
- route-optimized
- schema-name
- table-prefix
- running-endpoint
- update
- ai-gateway
- both_gateway_and_tags
- config
- email-notifications
- tags
- models
- basic
- empty-name
- readplan-permissions
- permissions
- apps
- current_can_manage
- other_can_manage
- clusters
- current_can_manage
- target
- dashboards/create
- database_instances/current_can_manage
- experiments/current_can_manage
- factcheck
- genie_spaces
- current_can_manage
- out_of_band_deletion
- jobs
- added_remotely
- current_can_manage_run
- current_can_manage
- current_is_owner
- delete_one
- deleted_remotely
- destroy_without_mgmtperms
- with_permissions
- without_permissions
- empty_list
- other_can_manage_run
- other_can_manage
- other_is_owner
- reorder_locally
- reorder_remotely
- update
- viewers
- models/current_can_manage
- pipelines
- 504
- create
- plan
- update
- current_can_manage
- current_is_owner
- empty_list
- other_can_manage
- other_is_owner
- update
- postgres_projects/current_can_manage
- sql_warehouses/current_can_manage
- target_permissions
- vector_search_endpoints/current_can_manage
- pipelines
- allow-duplicate-names
- auto-approve
- drift/parameters
- lakeflow-pipeline
- num-workers-zero
- photon-true
- recreate-keys
- change-ingestion-definition
- change-storage
- recreate
- remote_matches_config
- update
- zero-value-fields
- postgres_branches
- basic
- purge_on_delete_transitions
- purge_on_delete
- recreate
- replace_existing
- update_protected
- without_branch_id
- postgres_catalogs
- basic
- recreate
- postgres_databases
- basic
- live_errors
- bad_database_id
- bad_role_ref
- recreate
- replace_existing
- update
- postgres_endpoints
- basic
- recreate
- replace_existing
- update_autoscaling
- without_endpoint_id
- postgres_projects
- basic
- purge_on_delete_transitions
- purge_on_delete
- recreate
- update_display_name
- without_project_id
- postgres_roles
- basic
- inherited-role-bind
- inherited-role-conflict
- recreate-postgres-role
- recreate
- replace_existing
- update
- postgres_synced_tables
- basic
- recreate
- quality_monitors
- change_assets_dir
- change_output_schema_name
- change_table_name
- create
- registered_models
- aliases_converge
- basic
- drift/browse_only
- schemas
- auto-approve
- drift/managed_properties
- recreate
- update
- secret_scopes
- backend-type
- basic
- delete_scope
- permissions-collapse
- permissions
- secrets
- basic
- update-value
- sql_warehouses
- lifecycle-started-edit
- lifecycle-started-toggle
- lifecycle-started
- synced_database_tables
- basic
- recreate
- vector_search_endpoints
- basic
- drift
- budget_policy
- recreated_same_name
- target_qps
- recreate
- create-fails
- endpoint_type
- update
- budget_policy
- target_qps
- vector_search_indexes
- basic
- drift
- deleted_remotely
- orphaned_endpoint
- grants/select
- recreate
- embedding_dimension
- pending_deletion
- with_endpoint
- schema_normalization
- volumes
- change-comment
- change-name
- change-schema-name
- recreate
- remote-change-name
- remote-delete
- set-storage-location
- uppercase-name
- run_as
- job_default
- pipelines
- regular_user
- service_principal
- run
- app-with-job
- basic
- jobs/partial_run
- refresh-flags
- state-wiped
- scripts
- restricted-execution
- select
- basic
- grants_permissions
- plan_file_survives_not_selected
- state
- basic
- engine_default
- feature_flags
- force_pull_commands
- permission_level_migration
- state_present
- summary/modified_status
- telemetry
- config-remote-sync-recreate
- config-remote-sync-save
- config-remote-sync
- deploy-app-lifecycle-started
- deploy-artifact-path-type
- deploy-artifacts-variables
- deploy-compute-type
- deploy-config-file-count
- deploy-experimental
- deploy-mode
- deploy-name-prefix
- custom
- mode-development
- deploy-no-uuid
- deploy-run-as
- deploy-target-count
- deploy-variable-count
- deploy-whl-artifacts
- deploy-workspace-folder-permissions
- deploy
- templates
- default-python
- classic
- combinations
- classic
- serverless
- integration_classic
- serverless
- lakeflow-integrations
- pydabs/deploy-classic
- user_agent/simple
- validate/sync_patterns
- cache/simple
- pipelines
- deploy
- auto-approve
- create-pipeline
- fail-on-active-runs
- force-lock
- render-diagnostics-warning
- var-flag
- destroy
- auto-approve
- destroy-pipeline-cascade-state-divergence
- destroy-pipeline-cascade
- destroy-pipeline
- force-lock
- dry-run
- dry-run-pipeline
- no-wait
- restart
- e2e
- open/open-after-deployment
- run
- no-wait
- refresh-flags
- restart
- run-info
- stop
- bundle
- artifacts
- deployplan
- deploy
- files
- snapshot
- libraries
- phases
- scripts
- statemgmt
- cmd
- bundle
- utils
- pipelines
- libs
- cmdio
- sync
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
Lines changed: 4 additions & 5 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
5 | | - | |
6 | | - | |
7 | | - | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
| |||
21 | 21 | | |
22 | 22 | | |
23 | 23 | | |
24 | | - | |
25 | | - | |
| 24 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
5 | | - | |
6 | | - | |
7 | | - | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
| |||
21 | 21 | | |
22 | 22 | | |
23 | 23 | | |
24 | | - | |
25 | | - | |
| 24 | + | |
Lines changed: 7 additions & 8 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3 | 3 | | |
4 | 4 | | |
5 | 5 | | |
6 | | - | |
7 | | - | |
8 | | - | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
9 | 9 | | |
10 | 10 | | |
11 | 11 | | |
| |||
110 | 110 | | |
111 | 111 | | |
112 | 112 | | |
113 | | - | |
114 | | - | |
115 | | - | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
116 | 116 | | |
117 | 117 | | |
118 | 118 | | |
| |||
131 | 131 | | |
132 | 132 | | |
133 | 133 | | |
134 | | - | |
135 | | - | |
| 134 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
18 | | - | |
19 | | - | |
20 | | - | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
21 | 21 | | |
22 | 22 | | |
23 | 23 | | |
| |||
27 | 27 | | |
28 | 28 | | |
29 | 29 | | |
30 | | - | |
31 | | - | |
| 30 | + | |
32 | 31 | | |
33 | 32 | | |
34 | 33 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
4 | | - | |
5 | | - | |
6 | | - | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
| |||
Lines changed: 1 addition & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
4 | | - | |
5 | 4 | | |
6 | 5 | | |
7 | 6 | | |
| |||
14 | 13 | | |
15 | 14 | | |
16 | 15 | | |
17 | | - | |
| 16 | + | |
18 | 17 | | |
19 | 18 | | |
20 | 19 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
5 | | - | |
6 | | - | |
7 | | - | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
| |||
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
16 | | - | |
17 | | - | |
| 16 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
21 | | - | |
22 | | - | |
23 | | - | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
24 | 24 | | |
25 | 25 | | |
26 | 26 | | |
| |||
61 | 61 | | |
62 | 62 | | |
63 | 63 | | |
64 | | - | |
65 | | - | |
66 | | - | |
| 64 | + | |
| 65 | + | |
67 | 66 | | |
68 | 67 | | |
69 | 68 | | |
| |||
78 | 77 | | |
79 | 78 | | |
80 | 79 | | |
81 | | - | |
82 | | - | |
| 80 | + | |
Lines changed: 9 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
4 | 13 | | |
5 | 14 | | |
6 | 15 | | |
| |||
0 commit comments