CI/CD pour Databricks Apps avec GitHub Actions
Cette page explique comment automatiser le déploiement d’une application Databricks à partir de GitHub à l’aide de GitHub Actions et des lots d’automatisation déclaratifs. Il couvre la fédération d'identité de charge de travail, le fichier YAML du workflow et un contrôle de santé qui confirme que l'application utilise le code le plus récent après chaque déploiement.
Pour obtenir des informations génériques sur GitHub Actions pour les jobs et les pipelines Databricks, consultez GitHub Actions. Pour la configuration de la fédération d'identité de charge de travail, consultez Activer la fédération d'identité de charge de travail pour GitHub Actions.
Pour redéployer votre application automatiquement à chaque push vers une Branch, utilisez les déploiements Git automatiques (Bêta). Consultez Activer les déploiements Git automatiques.
Exigences
- Un service principal Databricks dans votre compte Databricks qui est propriétaire de l'application déployée. Consultez Ajouter des services principaux à votre compte.
- Une configuration de bundle
databricks.ymlà la racine de votre repository GitHub déclarant l'application comme une ressource. Consultez l'application. - La CLI Databricks installée localement pour les tâches de configuration uniques. Consultez Installer ou mettre à jour la Databricks CLI.
Étape 1. Configurer la fédération d'identités des charges de travail
La fédération d'identités Workload permet au runner GitHub Actions de s'authentifier auprès de Databricks en utilisant un jeton OIDC de courte durée au lieu de stocker les informations d'identification dans votre repository.
- Suivez les étapes de Activer la fédération d'identité de workload pour GitHub Actions pour créer une politique de fédération GitHub Actions sur votre service principal Databricks. Enregistrez l'ID d'application du Service Principal Databricks (UUID) et votre URL de Workspace. Vous avez besoin des deux comme variables dans le workflow.
- Accordez au Service Principal Databricks
CAN MANAGEl'autorisation sur l'application, ou l'autorisation Workspace pour créer des applications si l'application n'existe pas encore. Voir Configurer les autorisations d'une application Databricks.
Étape 2. Configurez le repository GitHub
Dans votre repository GitHub, créez un environnement de déploiement pour stocker les variables de connexion du Workspace. L'utilisation d'un environnement vous permet également d'exiger une approbation manuelle avant l'exécution des déploiements.
- Dans Paramètres > Environnements , créez un environnement nommé
prod(ou tout nom auquel votre workflow fait référence). - Pour les variables d'environnement , ajoutez ce qui suit :
Variable | Valeur |
|---|---|
| L'URL de votre Workspace, par exemple |
| L’ID d’application du Service Principal Databricks de l’étape 1 |
Aucune des valeurs n'est un identifiant. La politique de fédération sur le Service Principal Databricks contrôle qui peut s'authentifier en tant que tel, de sorte que l'ID client seul ne donne pas accès. Vous n'avez pas besoin d'un secret client.
Étape 3. Configurez votre bundle pour les déploiements de production
Dans databricks.yml, déclarez un Workspace explicite host et root_path sur votre cible prod. Ceci garantit que le bundle se déploie au même emplacement à chaque exécution. La validation en mode production requiert les deux champs, sauf si run_as est défini sur un Service Principal. Consultez les modes de déploiement des Declarative Automation Bundles.
- Git source
- Workspace source
Utilisez git_source afin que les déploiements extraient le code directement de votre repository Git au lieu d'upload des fichiers vers le Workspace. Cela évite l'étape sync supplémentaire et maintient le code déployé synchronisé avec votre repository.
targets:
prod:
mode: production
workspace:
host: https://my-workspace.cloud.databricks.com
root_path: /Workspace/Users/<service-principal-or-owner>/.bundle/${bundle.name}/${bundle.target}
resources:
apps:
my_app:
name: my-app
git_repository:
url: https://github.com/org/repo
git_source:
branch: main
source_code_path: apps/my-app
Remplacez <service-principal-or-owner> par l'utilisateur du workspace qui possède les artefacts du bundle, généralement l'ID d'application du service principal Databricks. Remplacez l'URL git_repository par l'URL de votre repository GitHub. Si le code de votre application se trouve à la racine du repository, omettez source_code_path. Consultez l'application.
Pour les repository privés, configurez un identifiant Git sur le Service Principal Databricks de l'application avant le déploiement. Consultez les instructions CLI dans Déployer à partir d'un repository Git.
Utilisez source_code_path pour upload les fichiers d'application de votre repository local vers le workspace pendant le déploiement.
targets:
prod:
mode: production
workspace:
host: https://my-workspace.cloud.databricks.com
root_path: /Workspace/Users/<service-principal-or-owner>/.bundle/${bundle.name}/${bundle.target}
resources:
apps:
my_app:
name: my-app
source_code_path: ./app
Remplacez <service-principal-or-owner> par l'utilisateur du workspace qui possède les artefacts du bundle, généralement l'ID d'application du service principal Databricks. Remplacez ./app par le chemin d'accès au code source de votre application par rapport à databricks.yml. Consultez l'application.
Étape 4. Ajouter le workflow de déploiement
Ajoutez .github/workflows/deploy.yml à votre repository :
name: Deploy to Databricks Apps
on:
workflow_dispatch:
# Uncomment to deploy on every push to main once the workflow is validated.
# push:
# branches: [main]
permissions:
id-token: write # required for OIDC federation
contents: read
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
environment: prod
env:
DATABRICKS_AUTH_TYPE: github-oidc
DATABRICKS_HOST: ${{ vars.DATABRICKS_HOST }}
DATABRICKS_CLIENT_ID: ${{ vars.DATABRICKS_CLIENT_ID }}
steps:
- uses: actions/checkout@v4
- name: Install Databricks CLI
uses: databricks/setup-cli@main
- name: Validate bundle
run: databricks bundle validate --target prod
- name: Deploy bundle
run: databricks bundle deploy --target prod
- name: Start or restart app
run: databricks bundle run my_app --target prod
Remplacez my_app à la dernière étape par la clé de ressource que votre databricks.yml utilise sous resources.apps.
Le runner a besoin de l'autorisation id-token: write pour demander un jeton OIDC. L'action databricks/setup-cli lit DATABRICKS_AUTH_TYPE=github-oidc et gère l'authentification automatiquement.
databricks bundle deploy upload le code source et met à jour les ressources, mais il ne redémarre pas le processus de l'application. Si vous ignorez la dernière étape databricks bundle run, le déploiement passe en CI pendant que l'application continue de servir le code précédent. Toujours exécuter la ressource du bundle après le déploiement.
Étape 5. Attendez que l'application soit saine
Databricks recommande d'ajouter une étape d'interrogation de l'état après le déploiement. databricks bundle run se ferme dès qu'il signale à l'application de start, mais l'application pourrait ne pas encore être en cours d'exécution. Il peut toujours échouer lors du Startup en raison de problèmes tels que des dépendances manquantes, une variable d'environnement manquante ou un conflit de port. L'ajout d'une étape d'interrogation garantit qu'une Startup ayant échoué fait également échouer le workflow :
- name: Wait for app to be running
env:
APP_NAME: my-app
run: |
for i in $(seq 1 20); do
STATE=$(databricks apps get "$APP_NAME" --output json | jq -r '.app_status.state')
echo "Attempt $i/20: state=$STATE"
if [ "$STATE" = "RUNNING" ]; then
exit 0
fi
sleep 15
done
echo "App did not reach RUNNING state within 5 minutes" >&2
exit 1
Définissez APP_NAME sur la valeur que votre databricks.yml déclare sous resources.apps.<key>.name, et non la clé de ressource du bundle.
Gérer une application existante
Les noms d'application sont uniques dans tout le Workspace. L'étape bundle deploy échoue avec An app with the same name already exists lorsqu'un autre bundle (ou une application créée manuellement) possède déjà une application de ce nom. Liez votre bundle à l'application existante au lieu de le recréer.
Exécutez-le une fois localement pour attacher le bundle à l'application existante :
databricks bundle deployment bind my_app <existing-app-name> --target prod --auto-approve
Ensuite, réexécutez le workflow. Les déploiements ultérieurs réutilisent la liaison.
Si l'application existante possède une configuration côté serveur (telle que budget_policy_id) qui ne se trouve pas dans votre databricks.yml, copiez-la dans le fichier du bundle avant de redéployer. Les incohérences apparaissent sous la forme d'une erreur Terraform « résultat incohérent » pendant l'étape de déploiement du bundle.
Choisir un Trigger
start avec workflow_dispatch pour que le premier déploiement soit manuel. Une fois que quelques exécutions réussissent, ajoutez push: branches: [main] à déployer à chaque Merge.
Pour une barrière de sécurité supplémentaire, configurez l'environnement prod avec les relecteurs requis dans Paramètres > Environnements > prod > Règles de protection du déploiement . Chaque exécution de workflow attend un approbateur avant le start du job de déploiement.
Ressources supplémentaires
- Configurez la fédération des identités de charge de travail pour configurer la stratégie de fédération GitHub Actions sur votre Service Principal Databricks.
- Déclarer une application comme ressource de bundle pour ajouter votre application à
databricks.yml. - Configurer les autorisations de l'application pour contrôler qui peut gérer ou utiliser l'application déployée.
- En savoir plus sur les Declarative Automation Bundles pour en savoir plus sur le cycle de vie et les modes de déploiement des bundles.
- Utilisez GitHub Actions avec Databricks pour obtenir des conseils sur les Jobs et les pipelines au-delà des applications.