<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: CI/CD on Databricks with Asset Bundles (DABs) and GitHub Actions in Community Articles</title>
    <link>https://community.databricks.com/t5/community-articles/ci-cd-on-databricks-with-asset-bundles-dabs-and-github-actions/m-p/149785#M1049</link>
    <description>&lt;P&gt;Ecellent Article!&lt;BR /&gt;&lt;BR /&gt;We are also using DAB in our arg, and i like the statement Ìf it is not there in DAB, it does not exist in the workspace.`&lt;BR /&gt;Previous to DAB, we built our own framework on top of dbt, but that was really sub-optimal!&lt;BR /&gt;&lt;BR /&gt;We have DEV, STG, PRD and PRD - SHADOW bundles which works seamlessly!&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Wed, 04 Mar 2026 17:23:58 GMT</pubDate>
    <dc:creator>Kirankumarbs</dc:creator>
    <dc:date>2026-03-04T17:23:58Z</dc:date>
    <item>
      <title>CI/CD on Databricks with Asset Bundles (DABs) and GitHub Actions</title>
      <link>https://community.databricks.com/t5/community-articles/ci-cd-on-databricks-with-asset-bundles-dabs-and-github-actions/m-p/149565#M1047</link>
      <description>&lt;P&gt;Hi all.&lt;/P&gt;&lt;P class=""&gt;If you've ever manually promoted resources from dev to prod on Databricks — copying notebooks, updating configs, hoping nothing breaks — this post is for you.&lt;/P&gt;&lt;P class=""&gt;I've been building a CI/CD setup for a Speech-to-Text pipeline on Databricks, and I wanted to share the approach in case it's useful to others here. The goal was simple: treat Databricks resources as code, deploy them deterministically across environments, and authenticate from GitHub Actions without storing any long-lived tokens.&lt;/P&gt;&lt;P class=""&gt;The stack is:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;STRONG&gt;Databricks Asset Bundles&lt;/STRONG&gt; for infrastructure-as-code&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;GitHub Actions&lt;/STRONG&gt; for delivery&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;OIDC federation&lt;/STRONG&gt; for authentication.&lt;/LI&gt;&lt;/UL&gt;&lt;P class=""&gt;&lt;STRONG&gt;What gets deployed by the bundle&lt;/STRONG&gt;&lt;/P&gt;&lt;P class=""&gt;The bundle manages the full solution end-to-end:&lt;/P&gt;&lt;UL class=""&gt;&lt;LI&gt;&lt;STRONG&gt;Unity Catalog schema and volume&lt;/STRONG&gt; — created automatically on deploy, no manual setup&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Silver pipelines&lt;/STRONG&gt; (Spark Declarative Pipelines) — audio ingestion via Auto Loader and NLP enrichment with two parallel implementations: AI SQL functions and Foundation Model API&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Gold tables&lt;/STRONG&gt; — transcription output from Whisper Large V3 via Model Serving endpoint, plus NLP evaluation results tracked with MLflow&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Model Serving endpoint&lt;/STRONG&gt; — Whisper Large V3 for audio transcription&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;AI/BI Dashboard&lt;/STRONG&gt; — monitoring transcription quality and NLP results&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Genie Space&lt;/STRONG&gt; — deployed as a job, since direct bundle support isn't available yet; it's a workaround worth knowing about if you're hitting the same limitation&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Orchestration job&lt;/STRONG&gt; (stt_main) — sequences all the stages in order&lt;/LI&gt;&lt;/UL&gt;&lt;P class=""&gt;Everything lives in the bundle YAML. If it's not in the repo, it doesn't exist in the workspace.&lt;/P&gt;&lt;P class=""&gt;&lt;STRONG&gt;What the CI/CD setup covers&lt;/STRONG&gt;&lt;/P&gt;&lt;UL class=""&gt;&lt;LI&gt;Structuring the repo with the bundle isolated from application code&lt;/LI&gt;&lt;LI&gt;Declaring dev and prod environments using DAB targets — same bundle YAML, different configurations&lt;/LI&gt;&lt;LI&gt;Configuring a service principal with minimal Unity Catalog permissions&lt;/LI&gt;&lt;LI&gt;Setting up OIDC federation policies so GitHub Actions authenticates without PATs&lt;/LI&gt;&lt;LI&gt;GitHub Environments to isolate variables and secrets per environment, with required reviewers on Prod&lt;/LI&gt;&lt;LI&gt;A workflow that runs bundle validate → bundle plan → bundle deploy, passing service_principal_id as the only external variable&lt;/LI&gt;&lt;/UL&gt;&lt;P class=""&gt;One thing worth calling out: in dev, the workflow also syncs a Git folder in the workspace before deploying — useful for interactive development. In prod, the bundle is the only source of truth and the Git folder sync doesn't happen.&lt;/P&gt;&lt;P class=""&gt;&amp;nbsp;&lt;/P&gt;&lt;P class=""&gt;&lt;STRONG&gt;Resources&lt;/STRONG&gt;&lt;/P&gt;&lt;P class=""&gt;The full repo is on GitHub — the GitHub Actions workflows and all the DAB configuration with inline comments on every step are there: &lt;span class="lia-unicode-emoji" title=":link:"&gt;🔗&lt;/span&gt; &lt;A class="" href="https://github.com/alessandro9110/Speech-To-Text-With-Databricks" target="_blank" rel="noopener"&gt;https://github.com/alessandro9110/Speech-To-Text-With-Databricks&lt;/A&gt;&lt;/P&gt;&lt;P class=""&gt;If you want the full walkthrough with context and explanation behind each decision, I wrote a detailed article on Medium: &lt;span class="lia-unicode-emoji" title=":link:"&gt;🔗&lt;/span&gt; &lt;A class="" href="https://medium.com/towards-data-engineering/ci-cd-on-databricks-with-asset-bundles-and-github-actions-9d6fc0a337e9" target="_blank" rel="noopener"&gt;https://medium.com/towards-data-engineering/ci-cd-on-databricks-with-asset-bundles-and-github-actions-9d6fc0a337e9&lt;/A&gt;&lt;/P&gt;&lt;P class=""&gt;Happy to answer questions or discuss alternative approaches — particularly around multi-workspace setups, how to handle Unity Catalog permissions when the deploy identity differs from run_as, or the Genie workaround if you're dealing with the same limitation.&lt;/P&gt;&lt;P class=""&gt;&amp;nbsp;&lt;/P&gt;&lt;P class=""&gt;Thank you to everyone for the support &lt;span class="lia-unicode-emoji" title=":red_heart:"&gt;❤️&lt;/span&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Sun, 01 Mar 2026 13:12:27 GMT</pubDate>
      <guid>https://community.databricks.com/t5/community-articles/ci-cd-on-databricks-with-asset-bundles-dabs-and-github-actions/m-p/149565#M1047</guid>
      <dc:creator>Ale_Armillotta</dc:creator>
      <dc:date>2026-03-01T13:12:27Z</dc:date>
    </item>
    <item>
      <title>Re: CI/CD on Databricks with Asset Bundles (DABs) and GitHub Actions</title>
      <link>https://community.databricks.com/t5/community-articles/ci-cd-on-databricks-with-asset-bundles-dabs-and-github-actions/m-p/149785#M1049</link>
      <description>&lt;P&gt;Ecellent Article!&lt;BR /&gt;&lt;BR /&gt;We are also using DAB in our arg, and i like the statement Ìf it is not there in DAB, it does not exist in the workspace.`&lt;BR /&gt;Previous to DAB, we built our own framework on top of dbt, but that was really sub-optimal!&lt;BR /&gt;&lt;BR /&gt;We have DEV, STG, PRD and PRD - SHADOW bundles which works seamlessly!&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 04 Mar 2026 17:23:58 GMT</pubDate>
      <guid>https://community.databricks.com/t5/community-articles/ci-cd-on-databricks-with-asset-bundles-dabs-and-github-actions/m-p/149785#M1049</guid>
      <dc:creator>Kirankumarbs</dc:creator>
      <dc:date>2026-03-04T17:23:58Z</dc:date>
    </item>
    <item>
      <title>Re: CI/CD on Databricks with Asset Bundles (DABs) and GitHub Actions</title>
      <link>https://community.databricks.com/t5/community-articles/ci-cd-on-databricks-with-asset-bundles-dabs-and-github-actions/m-p/150101#M1059</link>
      <description>&lt;P&gt;I've recorded also a YouTube tutorial if someone needs support:&amp;nbsp;&lt;A href="https://youtu.be/kStRXqCznHA" target="_blank"&gt;https://youtu.be/kStRXqCznHA&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Sat, 07 Mar 2026 22:30:08 GMT</pubDate>
      <guid>https://community.databricks.com/t5/community-articles/ci-cd-on-databricks-with-asset-bundles-dabs-and-github-actions/m-p/150101#M1059</guid>
      <dc:creator>Ale_Armillotta</dc:creator>
      <dc:date>2026-03-07T22:30:08Z</dc:date>
    </item>
    <item>
      <title>Hi, Great question! Databricks Asset Bundles (DABs) are t...</title>
      <link>https://community.databricks.com/t5/community-articles/ci-cd-on-databricks-with-asset-bundles-dabs-and-github-actions/m-p/150309#M1061</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;
&lt;P&gt;Great question! Databricks Asset Bundles (DABs) are the recommended approach for CI/CD on Databricks. Here is a comprehensive walkthrough.&lt;/P&gt;
&lt;P&gt;WHAT ARE DATABRICKS ASSET BUNDLES?&lt;/P&gt;
&lt;P&gt;DABs let you define your Databricks resources (jobs, pipelines, dashboards, ML experiments, etc.) as YAML configuration alongside your source code. The Databricks CLI then validates, deploys, and runs these bundles. You initialize a project with:&lt;/P&gt;
&lt;PRE&gt;databricks bundle init default-python&lt;/PRE&gt;
&lt;P&gt;This gives you a project structure with databricks.yml, a resources/ folder for job/pipeline definitions, src/ for code, and tests/ for unit tests.&lt;/P&gt;
&lt;P&gt;Docs: &lt;A href="https://docs.databricks.com/dev-tools/bundles/" target="_blank"&gt;https://docs.databricks.com/dev-tools/bundles/&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;ENVIRONMENT PROMOTION (DEV -&amp;gt; STAGING -&amp;gt; PROD)&lt;/P&gt;
&lt;P&gt;DABs use "targets" in databricks.yml to define environment-specific settings:&lt;/P&gt;
&lt;PRE&gt;bundle:
  name: my_project

variables:
  catalog:
    description: The Unity Catalog catalog to use
  schema:
    description: The schema to use

targets:
  dev:
    mode: development
    default: true
    workspace:
      host: https://dev-workspace.cloud.databricks.com
    variables:
      catalog: dev_catalog
      schema: ${workspace.current_user.short_name}

  staging:
    workspace:
      host: https://staging-workspace.cloud.databricks.com
    variables:
      catalog: staging_catalog
      schema: staging
    run_as:
      service_principal_name: staging-sp@company.com

  prod:
    mode: production
    workspace:
      host: https://prod-workspace.cloud.databricks.com
    variables:
      catalog: prod_catalog
      schema: production
    run_as:
      service_principal_name: prod-sp@company.com
    permissions:
      - service_principal_name: prod-sp@company.com
        level: CAN_MANAGE&lt;/PRE&gt;
&lt;P&gt;Key behaviors per mode:&lt;/P&gt;
&lt;PRE&gt;- mode: development -- Prefixes resource names with [dev &amp;lt;username&amp;gt;], pauses schedules/triggers, enables concurrent job runs
- mode: production -- Validates that run_as and permissions are set, prevents cluster overrides, marks pipelines as production&lt;/PRE&gt;
&lt;P&gt;Docs:&lt;/P&gt;
&lt;PRE&gt;- Deployment modes: https://docs.databricks.com/en/dev-tools/bundles/deployment-modes.html
- Variables: https://docs.databricks.com/en/dev-tools/bundles/variables.html
- run_as: https://docs.databricks.com/en/dev-tools/bundles/run-as.html&lt;/PRE&gt;
&lt;P&gt;CI/CD INTEGRATION - CORE CLI COMMANDS&lt;/P&gt;
&lt;P&gt;The core commands used in any CI/CD pipeline:&lt;/P&gt;
&lt;PRE&gt;databricks bundle validate --target prod    # Validate configuration
databricks bundle deploy --target prod      # Deploy resources
databricks bundle run --target prod my_job  # Run a specific job&lt;/PRE&gt;
&lt;P&gt;GITHUB ACTIONS EXAMPLE&lt;/P&gt;
&lt;P&gt;Databricks provides the official databricks/setup-cli action:&lt;/P&gt;
&lt;PRE&gt;name: Deploy Bundle

on:
  pull_request:
    branches: [main]
  push:
    branches: [main]

permissions:
  id-token: write
  contents: read

jobs:
  validate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: databricks/setup-cli@main
      - run: databricks bundle validate --target staging
        env:
          DATABRICKS_HOST: ${{ secrets.DATABRICKS_HOST }}
          DATABRICKS_AUTH_TYPE: github-oidc
          DATABRICKS_CLIENT_ID: ${{ secrets.DATABRICKS_CLIENT_ID }}

  deploy-prod:
    needs: validate
    if: github.event_name == 'push' &amp;amp;&amp;amp; github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    environment: production
    concurrency: production
    steps:
      - uses: actions/checkout@v4
      - uses: databricks/setup-cli@main
      - run: databricks bundle deploy --target prod
        env:
          DATABRICKS_HOST: ${{ secrets.PROD_HOST }}
          DATABRICKS_AUTH_TYPE: github-oidc
          DATABRICKS_CLIENT_ID: ${{ secrets.DATABRICKS_CLIENT_ID }}&lt;/PRE&gt;
&lt;P&gt;Docs: &lt;A href="https://docs.databricks.com/dev-tools/ci-cd/github" target="_blank"&gt;https://docs.databricks.com/dev-tools/ci-cd/github&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;AZURE DEVOPS EXAMPLE&lt;/P&gt;
&lt;PRE&gt;trigger:
  branches:
    include:
      - main

pool:
  vmImage: 'ubuntu-latest'

stages:
  - stage: Validate
    jobs:
      - job: ValidateBundle
        steps:
          - script: |
              curl -fsSL https://raw.githubusercontent.com/databricks/setup-cli/main/install.sh | sh
            displayName: 'Install Databricks CLI'
          - script: databricks bundle validate --target prod
            env:
              DATABRICKS_HOST: $(DATABRICKS_HOST)
              DATABRICKS_CLIENT_ID: $(DATABRICKS_CLIENT_ID)
              DATABRICKS_CLIENT_SECRET: $(DATABRICKS_CLIENT_SECRET)

  - stage: Deploy
    dependsOn: Validate
    condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
    jobs:
      - deployment: DeployProd
        environment: production
        strategy:
          runOnce:
            deploy:
              steps:
                - checkout: self
                - script: |
                    curl -fsSL https://raw.githubusercontent.com/databricks/setup-cli/main/install.sh | sh
                - script: databricks bundle deploy --target prod
                  env:
                    DATABRICKS_HOST: $(DATABRICKS_HOST)
                    DATABRICKS_CLIENT_ID: $(DATABRICKS_CLIENT_ID)
                    DATABRICKS_CLIENT_SECRET: $(DATABRICKS_CLIENT_SECRET)&lt;/PRE&gt;
&lt;P&gt;Docs: &lt;A href="https://docs.databricks.com/en/dev-tools/ci-cd/azure-devops.html" target="_blank"&gt;https://docs.databricks.com/en/dev-tools/ci-cd/azure-devops.html&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;AUTHENTICATION IN CI/CD&lt;/P&gt;
&lt;P&gt;Two recommended approaches (do NOT use personal access tokens for automation):&lt;/P&gt;
&lt;P&gt;Option A: Workload Identity Federation (OIDC) -- Most Secure&lt;/P&gt;
&lt;PRE&gt;Eliminates stored secrets entirely. Your CI/CD platform provides an OIDC token that Databricks validates directly. Supported for GitHub Actions natively.&lt;/PRE&gt;
&lt;P&gt;Option B: OAuth M2M (Client Credentials) -- For Azure DevOps / GitLab / Jenkins&lt;/P&gt;
&lt;PRE&gt;Create an OAuth secret for your service principal, then store the credentials as CI/CD secrets. OAuth secrets are valid for up to 730 days and can be rotated.&lt;/PRE&gt;
&lt;P&gt;Docs:&lt;/P&gt;
&lt;PRE&gt;- OAuth M2M: https://docs.databricks.com/en/dev-tools/auth/oauth-m2m.html
- Service principals: https://docs.databricks.com/admin/users-groups/service-principals&lt;/PRE&gt;
&lt;P&gt;TESTING STRATEGIES&lt;/P&gt;
&lt;P&gt;A complete CI/CD pipeline should include:&lt;/P&gt;
&lt;PRE&gt;1. Lint and Unit Test -- On every PR (no Databricks access needed)
2. Bundle Validate -- On every PR (lightweight, catches YAML errors)
3. Deploy to Staging -- On PR merge or manual trigger
4. Integration Test -- Run test jobs in staging workspace
5. Deploy to Production -- On main branch push after staging passes&lt;/PRE&gt;
&lt;P&gt;BEST PRACTICES&lt;/P&gt;
&lt;PRE&gt;- Use service principals for all non-development deployments; set run_as in staging/prod targets
- Use mode: development for dev and mode: production for prod
- Store secrets properly -- never commit credentials
- Pin the CLI version in production pipelines for reproducibility
- Use variables for environment-specific values rather than duplicating resource definitions
- Validate before deploying -- always run "databricks bundle validate" as a separate CI step
- Use concurrency controls in your CI/CD to prevent parallel deployments to the same target&lt;/PRE&gt;
&lt;P&gt;Docs: &lt;A href="https://docs.databricks.com/dev-tools/ci-cd/best-practices" target="_blank"&gt;https://docs.databricks.com/dev-tools/ci-cd/best-practices&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;DOCUMENTATION REFERENCES&lt;/P&gt;
&lt;PRE&gt;- Asset Bundles overview: https://docs.databricks.com/dev-tools/bundles/
- CI/CD best practices: https://docs.databricks.com/dev-tools/ci-cd/best-practices
- GitHub Actions: https://docs.databricks.com/dev-tools/ci-cd/github
- Azure DevOps: https://docs.databricks.com/en/dev-tools/ci-cd/azure-devops.html
- Deployment modes: https://docs.databricks.com/en/dev-tools/bundles/deployment-modes.html
- Bundle variables: https://docs.databricks.com/en/dev-tools/bundles/variables.html
- run_as: https://docs.databricks.com/en/dev-tools/bundles/run-as.html
- OAuth M2M: https://docs.databricks.com/en/dev-tools/auth/oauth-m2m.html
- Service principals: https://docs.databricks.com/admin/users-groups/service-principals
- Bundle examples repo: https://github.com/databricks/bundle-examples&lt;/PRE&gt;
&lt;P&gt;Hope this helps! If you have a specific CI/CD platform or run into particular issues, feel free to share more details.&lt;/P&gt;
&lt;P&gt;* This reply used an agent system I built to research and draft this response based on the wide set of documentation I have available and previous memory. I personally review the draft for any obvious issues and for monitoring system reliability and update it when I detect any drift, but there is still a small chance that something is inaccurate, especially if you are experimenting with brand new features.&lt;/P&gt;</description>
      <pubDate>Mon, 09 Mar 2026 03:55:36 GMT</pubDate>
      <guid>https://community.databricks.com/t5/community-articles/ci-cd-on-databricks-with-asset-bundles-dabs-and-github-actions/m-p/150309#M1061</guid>
      <dc:creator>SteveOstrowski</dc:creator>
      <dc:date>2026-03-09T03:55:36Z</dc:date>
    </item>
  </channel>
</rss>

