Configurer CI/CD pour votre agent Databricks Apps

Un pipeline CI/CD exécute chaque modification apportée à votre agent par le biais d’une révision de code et d’un déploiement automatisé, de sorte que les déploiements de production ne dépendent pas de l’ordinateur portable d’un développeur. Une fois le pipeline configuré, chaque fusion vers votre branche principale déploie et redémarre votre agent sur Databricks Apps.

Cette page couvre les éléments spécifiques à l’agent. CI/CD pour Databricks Apps avec GitHub Actions documente la configuration principale du flux de travail : fédération d’identité de charge de travail, environnement GitHub et déploiement YAML. Terminez d’abord cette page, puis revenez ici pour les ajouts qui s’appliquent aux applications de l’agent.

Requirements

Étape 1. Utiliser le flux de travail de démarrage

Plusieurs modèles d’agents dans databricks/app-templates sont fournis avec un .github/workflows/deploy.yml prêt à l’emploi, vous n’avez donc pas besoin d’écrire le flux de travail à partir de zéro.

  1. Choisissez un modèle d’agent à partir de databricks/app-templates, comme agent-langgraph ou agent-openai-agents-sdk.
  2. Dans votre répertoire du modèle cloné, vérifiez si .github/workflows/deploy.yml existe.
  3. Configurez le flux de travail :
    • Si deploy.yml existe : ouvrez-le, confirmez que l’étape databricks bundle run fait référence à la clé de ressource de votre bundle depuis databricks.yml, puis suivez les prérequis indiqués dans le commentaire d’en-tête du fichier.
    • Si deploy.yml n’existe pas : copiez-le à partir d’un modèle qui l’inclut, ou depuis l’étape 4 : ajoutez le workflow de déploiement. Ensuite, mettez à jour l’étape databricks bundle run <key> pour qu’elle corresponde à la clé de ressource de votre bundle.

Étape 2. Préremplez l’ID d’expérience MLflow

Les modèles d’agent laissent MLFLOW_EXPERIMENT_ID vide dans databricks.yml. Le quickstart script le remplit localement lors de la première configuration, mais un nouveau exécuteur CI ne le fait pas. Si experiment_id est vide, databricks bundle deploy échoue avec une erreur de type Terraform (For input string: "").

Pour résoudre ce problème, validez la valeur renseignée :

  1. Exécutez uv run quickstart --profile <your-profile> localement sur l’ordinateur sur lequel vous avez créé l’agent.
  2. Vérifiez que la ressource d’expérience dans databricks.yml (l’entrée avec name: 'experiment' sous resources.apps.<key>.resources) a maintenant un nombre numérique experiment_id.
  3. Validez la modification.

L’expérience est délimitée à l’espace de travail. Par conséquent, le même ID est valide pour chaque déploiement CI ciblant cet espace de travail. Si vous effectuez un déploiement sur plusieurs espaces de travail, déclarez une expérience par cible dans databricks.yml (une par targets.<env> bloc) ou utilisez une variable groupée.

Accorder des autorisations Postgres pour les modèles de mémoire Lakebase

Les modèles d’agents avancés (agent-langgraph-advanced, agent-openai-advanced) déclarent directement dans databricks.yml une ressource Postgres Lakebase avec mise à l’échelle automatique. Avec Databricks CLI v0.295.0 et versions ultérieures, databricks bundle deploy provisionne la ressource en même temps que l’application.

La ressource DAB postgres accorde au principal de service de l’application un accès au niveau de l’espace de travail au projet Lakebase, mais Lakebase conserve une couche distincte de rôles Postgres pour l’accès à la base de données (schémas, tables et séquences). Le principal de service a besoin d’un rôle Postgres avec les privilèges appropriés avant que l’agent puisse lire ou écrire ses tables de mémoire. Consultez l’architecture d’authentification pour le modèle à deux couches.

L’octroi de ces privilèges de niveau Postgres est une configuration unique. Exécutez-le localement entre le premier bundle deploy et bundle run. CI se redéploie ensuite via le chemin standard deploy, puis run, car le rôle Postgres du principal de service persiste pendant toute la durée de vie de l’application.

  1. Déployez l’offre groupée pour approvisionner la ressource Lakebase :

    databricks bundle deploy --target prod
    
  2. Accordez au principal de service les privilèges de niveau Postgres dont il a besoin :

    uv run python scripts/grant_lakebase_permissions.py \
      "$(databricks apps get <app-name> --output json | jq -r '.service_principal_client_id')" \
      --memory-type openai \
      --autoscaling-endpoint <endpoint>
    

    Pour le modèle LangGraph, passez --memory-type langgraph. Le script prend aussi en charge --project <project> --branch <branch> pour Lakebase avec mise à l’échelle automatique, ou --instance-name <name> pour Lakebase provisionné.

  3. Démarrez l’application :

    databricks bundle run <bundle-key> --target prod
    

Étape 3. Test de fumée de l’agent déployé

databricks bundle run se termine dès que l’exécuteur indique à l’agent de démarrer, mais le processus de l’agent peut néanmoins échouer pendant son initialisation. Après la vérification de l’état de santé de l’étape 5 : Attendez que l’application soit en bon état de fonctionnement, ajoutez à deploy.yml l’étape de test de validation rapide suivante, qui envoie une requête canary à /invocations :

- name: Smoke test invocations
  env:
    APP_NAME: my-agent
  run: |
    APP_URL=$(databricks apps get "$APP_NAME" --output json | jq -r '.url')
    TOKEN=$(databricks auth token | jq -r '.access_token')
    STATUS=$(curl -sS -o /tmp/canary.json -w "%{http_code}" \
      -X POST "$APP_URL/invocations" \
      -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type: application/json" \
      -d '{"input": [{"role": "user", "content": "ping"}], "stream": false}')
    if [ "$STATUS" != "200" ]; then
      echo "Smoke test failed with status $STATUS:" >&2
      cat /tmp/canary.json >&2
      exit 1
    fi
    echo "Smoke test passed."

Note

Databricks Apps accepte uniquement les jetons OAuth pour l’appel. Utiliser le jeton OAuth de l’espace de travail à partir de databricks auth token; Databricks Apps rejette tout autre type de jeton.

Ressources supplémentaires