Skip to content

Initial release: pre-generated from databricks-bundle-template v1.3.0 #2

Initial release: pre-generated from databricks-bundle-template v1.3.0

Initial release: pre-generated from databricks-bundle-template v1.3.0 #2

# GitHub Actions Workflow for my_data_project
#
# This workflow validates and deploys Databricks Asset Bundles:
# - bundle-ci: Validates bundle configuration on Pull Requests to main
# - staging-cd: Deploys to staging when PRs are merged into main
# - prod-cd: Deploys to production when PRs are merged into release
#
# Prerequisites:
# 1. Configure repository secrets (see docs/CI_CD_SETUP.md)
# 2. Ensure Unity Catalog prerequisites are met
name: Bundle CI/CD for my_data_project
on:
push:
branches:
- main
- release
paths-ignore:
- 'README.md'
- 'docs/**'
- '.gitignore'
pull_request:
branches:
- main
paths-ignore:
- 'README.md'
- 'docs/**'
- '.gitignore'
workflow_dispatch:
permissions:
contents: read
checks: write
pull-requests: write
defaults:
run:
working-directory: .
env:
# AWS/GCP Databricks uses OAuth M2M authentication
STAGING_DATABRICKS_HOST: ${{ secrets.STAGING_DATABRICKS_HOST }}
STAGING_DATABRICKS_CLIENT_ID: ${{ secrets.STAGING_DATABRICKS_CLIENT_ID }}
STAGING_DATABRICKS_CLIENT_SECRET: ${{ secrets.STAGING_DATABRICKS_CLIENT_SECRET }}
PROD_DATABRICKS_HOST: ${{ secrets.PROD_DATABRICKS_HOST }}
PROD_DATABRICKS_CLIENT_ID: ${{ secrets.PROD_DATABRICKS_CLIENT_ID }}
PROD_DATABRICKS_CLIENT_SECRET: ${{ secrets.PROD_DATABRICKS_CLIENT_SECRET }}
jobs:
# =============================================================================
# Job: bundle-ci - Validate bundle on Pull Requests
# =============================================================================
bundle-ci:
name: 'Validate and Test'
if: github.event_name == 'pull_request'
runs-on: ubuntu-latest
concurrency:
group: my_data_project_ci_${{ github.ref }}
cancel-in-progress: true
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha || github.sha }}
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: |
if [ -f "requirements_dev.txt" ]; then
echo "Installing development dependencies..."
python -m pip install --upgrade pip
pip install -r requirements_dev.txt
else
echo "No requirements_dev.txt found, skipping dependency installation"
fi
- name: Run unit tests
run: |
if [ -d "tests" ] && [ -n "$(find tests -name 'test_*.py' -o -name '*_test.py' 2>/dev/null)" ]; then
echo "Running unit tests..."
python -m pytest tests/ -v --junitxml=test-results.xml
else
echo "No test files found, skipping unit tests"
fi
- name: Publish test results
uses: dorny/test-reporter@v1
if: success() || failure()
with:
name: Unit Tests - my_data_project
path: test-results.xml
reporter: java-junit
fail-on-error: false # Prevent "double failing" noise when pytest fails the job
token: ${{ github.token }}
- name: Install Databricks CLI
uses: databricks/setup-cli@v0.274.0
- name: Validate bundle for staging
env:
DATABRICKS_HOST: ${{ env.STAGING_DATABRICKS_HOST }}
DATABRICKS_CLIENT_ID: ${{ env.STAGING_DATABRICKS_CLIENT_ID }}
DATABRICKS_CLIENT_SECRET: ${{ env.STAGING_DATABRICKS_CLIENT_SECRET }}
run: |
databricks bundle validate -t stage
- name: Validate bundle for production
env:
DATABRICKS_HOST: ${{ env.PROD_DATABRICKS_HOST }}
DATABRICKS_CLIENT_ID: ${{ env.PROD_DATABRICKS_CLIENT_ID }}
DATABRICKS_CLIENT_SECRET: ${{ env.PROD_DATABRICKS_CLIENT_SECRET }}
run: |
databricks bundle validate -t prod
# =============================================================================
# Job: staging-cd - Deploy to staging on merge to main
# =============================================================================
staging-cd:
name: 'Deploy to Staging'
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
concurrency:
group: my_data_project_staging_deploy
cancel-in-progress: false
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Databricks CLI
uses: databricks/setup-cli@v0.274.0
- name: Validate bundle for staging
env:
DATABRICKS_HOST: ${{ env.STAGING_DATABRICKS_HOST }}
DATABRICKS_CLIENT_ID: ${{ env.STAGING_DATABRICKS_CLIENT_ID }}
DATABRICKS_CLIENT_SECRET: ${{ env.STAGING_DATABRICKS_CLIENT_SECRET }}
run: |
databricks bundle validate -t stage
- name: Deploy bundle to staging
env:
DATABRICKS_HOST: ${{ env.STAGING_DATABRICKS_HOST }}
DATABRICKS_CLIENT_ID: ${{ env.STAGING_DATABRICKS_CLIENT_ID }}
DATABRICKS_CLIENT_SECRET: ${{ env.STAGING_DATABRICKS_CLIENT_SECRET }}
run: |
databricks bundle deploy -t stage
# =============================================================================
# Job: prod-cd - Deploy to production on merge to release
# =============================================================================
prod-cd:
name: 'Deploy to Production'
if: github.event_name == 'push' && github.ref == 'refs/heads/release'
runs-on: ubuntu-latest
concurrency:
group: my_data_project_prod_deploy
cancel-in-progress: false
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Databricks CLI
uses: databricks/setup-cli@v0.274.0
- name: Validate bundle for production
env:
DATABRICKS_HOST: ${{ env.PROD_DATABRICKS_HOST }}
DATABRICKS_CLIENT_ID: ${{ env.PROD_DATABRICKS_CLIENT_ID }}
DATABRICKS_CLIENT_SECRET: ${{ env.PROD_DATABRICKS_CLIENT_SECRET }}
run: |
databricks bundle validate -t prod
- name: Deploy bundle to production
env:
DATABRICKS_HOST: ${{ env.PROD_DATABRICKS_HOST }}
DATABRICKS_CLIENT_ID: ${{ env.PROD_DATABRICKS_CLIENT_ID }}
DATABRICKS_CLIENT_SECRET: ${{ env.PROD_DATABRICKS_CLIENT_SECRET }}
run: |
databricks bundle deploy -t prod