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 de Declarative Automation Bundles. Cela couvre la fédération d’identités de charge de travail, le fichier YAML du workflow et une vérification d’intégrité qui confirme que l’application utilise bien la version la plus récente du code après chaque déploiement.

Pour obtenir des conseils de GitHub Actions génériques pour les travaux et les pipelines Azure Databricks, consultez GitHub Actions. Pour la configuration de la fédération des identités de charge de travail, consultez Activer la fédération des identités de charge de travail pour GitHub Actions.

Requirements

Étape 1. Configurer la fédération des identités de charge de travail

La fédération des identités de charge de travail permet à l’exécuteur GitHub Actions de s’authentifier avec Azure Databricks à l’aide d’un jeton OIDC de courte durée au lieu de stocker les informations d’identification dans votre référentiel.

Suivez les étapes dans Activer la fédération d’identité de charge de travail pour GitHub Actions pour créer une stratégie de fédération pour GitHub Actions sur votre principal de service. Notez l’ID d’application du principal de service (UUID) et l’URL de votre espace de travail. Vous avez besoin des deux variables dans le flux de travail.

Accordez ensuite au principal de service CAN MANAGE l’autorisation sur l’application ou, si l’application n’existe pas encore, l’autorisation sur l’espace de travail pour créer des applications. Consultez Configurer des autorisations pour une application Databricks.

Étape 2. Configurer le référentiel GitHub

Dans votre référentiel GitHub, créez un environnement de déploiement pour stocker les variables de connexion de l’espace de travail. L’utilisation d’un environnement vous permet également d’exiger une approbation manuelle avant l’exécution des déploiements.

  1. Dansles environnements>, créez un environnement nommé prod (ou n’importe quel nom de vos références de flux de travail).
  2. Pour les variables d’environnement, ajoutez les éléments suivants :
Variable Value
DATABRICKS_HOST URL de votre espace de travail, par exemple https://my-workspace.cloud.databricks.com
DATABRICKS_CLIENT_ID ID d’application du principal de service à l’étape 1

Aucune de ces valeurs n’est un identifiant. La stratégie de fédération appliquée au principal de service contrôle qui peut s’authentifier avec cette identité, de sorte que l’ID client à lui seul n’accorde pas l’accès. Vous n’avez pas besoin d’un secret client.

Étape 3. Configurer votre bundle pour les déploiements de production

Dans databricks.yml, déclarez un espace de travail host explicite et root_path sur votre prod cible. Cela garantit que le package est déployé au même emplacement à chaque exécution. La validation en mode production nécessite les deux champs, sauf si run_as est défini comme principal de service. ** Consultez les modes de déploiement des ensembles d'automatisation déclarative.

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 de l’espace de travail propriétaire des artefacts groupés, généralement l’ID d’application du principal de service.

Remplacez ./app par le chemin d’accès au code source de votre application par rapport à databricks.yml. Le champ est requis lorsque le source_code_path code de l’application se trouve dans le même référentiel que le bundle. Si votre code d’application se trouve dans un référentiel distinct, utilisez git_source plutôt. Voir l’application.

Étape 4. Ajouter le workflow de déploiement

Ajoutez .github/workflows/deploy.yml à votre dépôt :

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 qu’utilise votre databricks.yml sous resources.apps.

Le runner doit disposer 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 automatiquement l’authentification.

Avertissement

databricks bundle deploy charge le code source et met à jour les ressources, mais il ne redémarre pas le processus d’application. Si vous ignorez l’étape finale databricks bundle run , le déploiement passe dans CI pendant que l’application continue de servir le code précédent. Exécutez toujours la ressource groupée après le déploiement.

Étape 5. Attendez que l’application soit saine

Databricks recommande d’ajouter une étape d’interrogation d’état après le déploiement. databricks bundle run se ferme dès qu’elle envoie à l’application le signal de démarrage, mais l’application n’est peut-être pas encore en cours d’exécution. Il peut toujours échouer au démarrage en raison de problèmes tels que les dépendances manquantes, une variable d’environnement manquante ou un conflit de port. L’ajout d’une étape d’interrogation garantit qu’un démarrage ayant échoué échoue également dans le flux de travail :

- 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 databricks.yml déclare sous resources.apps.<key>.name, et non sur la clé de ressource du bundle.

Gestion d’une application existante

Les noms d’application sont uniques dans l’espace de travail. L’étape bundle deploy échoue avec An app with the same name already exists lorsqu’un autre paquet (ou une application créée manuellement) possède déjà une application portant ce nom. Liez votre offre groupée à l’application existante au lieu de la recréer.

Exécutez cette opération une fois localement pour attacher l’offre groupée à l’application existante :

databricks bundle deployment bind my_app <existing-app-name> --target prod --auto-approve

Réexécutez ensuite le flux de travail. Les déploiements suivants réutilisent la liaison.

Si l’application existante dispose d’une configuration côté serveur (par exemple budget_policy_id) qui n’est pas dans votre databricks.ymlfichier, copiez-la dans le fichier groupé avant de le redéployer. Les incompatibilités apparaissent sous la forme d’une erreur Terraform « résultat incohérent » lors de l’étape de déploiement du bundle.

Choix d’un déclencheur

Commencez par workflow_dispatch afin que le premier déploiement soit manuel. Une fois que quelques exécutions ont réussi, ajoutez push: branches: [main] pour déployer à chaque fusion.

Pour une mesure de sécurité supplémentaire, configurez l’environnement prod avec des réviseurs obligatoires dans Paramètres>Environnements>prod>Règles de protection du déploiement. Chaque exécution du workflow attend une approbation avant que la tâche de déploiement ne démarre.

Étapes suivantes