CI/CD para Databricks Apps com GitHub Actions
Esta página explica como automatizar a implantação de um aplicativo Databricks a partir do GitHub usando o GitHub Actions e os Declarative Automation Bundles. Abrange a federação de identidades de carga de trabalho, o YAML do fluxo de trabalho e uma verificação de integridade que confirma se o aplicativo está fornecendo o código mais recente após cada implantação.
Para obter orientações gerais sobre GitHub Actions para trabalhos e pipelines Databricks , consulte GitHub Actions. Para configurar a federação de identidades de cargas de trabalho, consulte Ativar a federação de identidades de cargas de trabalho para o GitHub Actions.
Requisitos
- Uma entidade de serviço Databricks em sua account Databricks que possui o aplicativo implantado. Consulte Adicionar entidade de serviço à sua account.
- Uma configuração de pacote
databricks.ymlna raiz do seu repositório GitHub declarando o aplicativo como um recurso. Veja o aplicativo. - A CLI Databricks foi instalada localmente para uma tarefa de configuração única. Consulte Instalar ou atualizar a CLI do Databricks.
o passo 1. Configurar federação de identidade de carga de trabalho
A federação de identidade de carga de trabalho permite que o executor GitHub Actions se autentique com Databricks usando tokens OIDC de curta duração, em vez de armazenar credenciais em seu repositório.
Siga os passos descritos em Ativar a federação de identidade de carga de trabalho para o GitHub Actions para criar uma política de federação do GitHub Actions em sua entidade de serviço do Databricks. Anote o ID do aplicativo entidade de serviço (UUID) Databricks e a URL do seu workspace . Você precisa de ambas como variáveis no fluxo de trabalho.
Em seguida, conceda à entidade de serviço Databricks CAN MANAGE permissão no aplicativo ou permissão workspace para criar aplicativos se o aplicativo ainda não existir. Consulte Configurar permissões para um aplicativo Databricks.
o passo 2. Configure o repositório GitHub
Em seu repositório GitHub , crie um ambiente de implantação para armazenar as variáveis de conexão workspace . Utilizar um ambiente também permite exigir aprovação manual antes da execução das implementações.
- Em Configurações > Ambientes , crie um ambiente chamado
prod(ou qualquer nome que seu fluxo de trabalho utilize como referência). - Para variável de ambiente , adicione o seguinte:
Variável | Valor |
|---|---|
| O URL do seu workspace , por exemplo. |
| O ID do aplicativo entidade de serviço Databricks da etapa 1 |
Nenhum dos valores constitui uma credencial. A política de federação na entidade de serviço do Databricks controla quem pode se autenticar como ela, portanto, o ID do cliente por si só não concede acesso. Você não precisa de um segredo do cliente.
o passo 3. Configure seu pacote para implantações de produção
Em databricks.yml, declare um workspace explícito host e root_path em seu alvo prod . Isso garante que o pacote seja implantado no mesmo local em todas as execuções. A validação em modo de produção requer ambos os campos, a menos que run_as esteja definido como uma entidade de serviço. Consulte os modos de implantação dos Declarative Automation Bundles.
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
Substitua <service-principal-or-owner> pelo usuário workspace que possui os artefatos do pacote, normalmente o ID do aplicativo de entidade de serviço Databricks .
Substitua ./app pelo caminho para o código-fonte do seu aplicativo relativo a databricks.yml. O campo source_code_path é obrigatório quando o código do aplicativo reside no mesmo repositório que o pacote. Se o código do seu aplicativo estiver em um repositório separado, use git_source em vez disso. Veja o aplicativo.
o passo 4. Adicione o fluxo de trabalho implantado
Adicione .github/workflows/deploy.yml ao seu repositório:
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
Substitua my_app no último passo pela key de recurso que seu databricks.yml usa em resources.apps.
O executor precisa da permissão id-token: write para solicitar tokens OIDC. A ação databricks/setup-cli lê DATABRICKS_AUTH_TYPE=github-oidc e lida com a autenticação automaticamente.
databricks bundle deploy O código-fonte é carregado e o recurso é atualizado, mas o processo do aplicativo não é reiniciado. Se você pular o passo final databricks bundle run , o implantado passa no CI enquanto o aplicativo continua servindo o código anterior. Sempre execute o recurso bundle após implantado.
o passo 5. Aguarde até que o aplicativo esteja saudável
Databricks recomenda adicionar uma etapa de verificação de status após a implantação. databricks bundle run sai assim que sinaliza o início do aplicativo, mas o aplicativo pode ainda não estar em execução. Ainda pode falhar durante startup devido a problemas como dependências ausentes, uma variável de ambiente ausente ou um conflito de portas. Adicionar um polling o passo garante que uma startup com falha também falhe no fluxo de trabalho:
- 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
Defina APP_NAME para o valor que seu databricks.yml declara em resources.apps.<key>.name, não a key de recurso do pacote.
Gerenciando um aplicativo existente
Os nomes dos aplicativos são exclusivos em todo o workspace. O bundle deploy o passo falha com An app with the same name already exists quando outro pacote (ou um aplicativo criado manualmente) já possui um aplicativo com esse nome. Vincule seu pacote ao aplicativo existente em vez de recriá-lo.
Execute este comando localmente uma vez para anexar o pacote ao aplicativo existente:
databricks bundle deployment bind my_app <existing-app-name> --target prod --auto-approve
Em seguida, reexecução do fluxo de trabalho. Implantações subsequentes reutilizam a vinculação.
Se o aplicativo existente tiver configuração do lado do servidor (como budget_policy_id) que não está em seu databricks.yml, copie-o para o arquivo de pacote antes de reimplantar. As incompatibilidades aparecem como um erro de "resultado inconsistente" Terraform durante a implantação do pacote.
Escolhendo um gatilho
comece com workflow_dispatch para que a primeira implantação seja manual. Assim que algumas execuções forem bem-sucedidas, adicione push: branches: [main] a ser implantado em cada merge.
Para uma camada adicional de segurança, configure o ambiente prod com os revisores necessários em Configurações > Ambientes > prod > Regras de proteção de implantação . Cada execução de fluxo de trabalho aguarda um aprovador antes do início do trabalho implantado.
Próximos passos
- Configure a federação de identidade de carga de trabalho para configurar a política de federação do GitHub Actions em sua entidade de serviço do Databricks.
- Declare um aplicativo como um recurso de pacote para adicionar seu aplicativo a
databricks.yml. - Configure as permissões do aplicativo para controlar quem pode gerenciar ou usar o aplicativo implantado.
- Saiba mais sobre os Pacotes de Automação Declarativa para obter informações sobre o ciclo de vida do pacote e os modos de implantação.
- Use GitHub Actions com Databricks para obter orientações sobre trabalhos e pipelines além dos aplicativos.