@Sanjeeb2024
Definitely DABs are good approach here. One thing I would add here is to keep the deployment identity and App run time Identity separate.
For DEV -> PROD, the recommended pattern is to deploy the app with DAB from CI/CD, ideally using a dedicated service principal. The app itself gets its own dedicated runtime service principal in each environment. and it's access to SQL warehouses/ tables/ volumes etc should be declared as app resources / bundle config (where supported) rather than granting manually after deployment.
For the permissions part specifically: you do not need to manually discover that runtime service principal after deployment. In the bundle it can be referenced directly using :
${resources.apps.<app-key>.service_principal_client_id}
and use that identity in grants/resources during same deployment.
Typical Flow is:
Git Actions/Dev-ops → CI/CD → bundle validate → bundle deploy -t prod → bundle run <app> -t prod
Note: bundle deploy updates the app resource/source but not necessarily restart the running app, so Databricks recommends bundle run after deployment. Reference for CI/CD from databricks docs here.
For environment specific resources: use bundle targets/variables, so DEV/TEST/PROD can point to respective catalogs/ warehouses / tables etc while keeping the same app definition.
If the App already exists because it was created manually or through another deployment process, can bind existing App to the bundle to avoid App name already exists kind of errors while deploying.
Can also declare App dependencies/resources in the Bundle Yaml. The supported app resource types documented here