-- Este repositório contém o código e configurações necessárias para o workshop de CI/CD com Databricks.
Por se tratar de um workshop, o código fonte do job foi simplificado para fins didáticos.
Devido à complexidade de demonstrar um cenário end-to-end completo de CI/CD (que envolve Git, CLI, runners e outros objetos externos), este repositório foi preparado com uma estrutura pronta contendo os seguintes assets do Databricks:
- Notebook que cria uma tabela de funcionários
- Workflow configurado para executar este Notebook
- Testes unitários previamente definidos
- Esteira de CI/CD utilizando GitHub Actions já configurada
- Pré-requisitos
- Ferramentas Utilizadas
- Passo a Passo
- Executando Testes Unitários e de Integração
- Validação de Código Estático com Flake8
- GitHub Actions
- Referência
- Conhecimento prévio de Git
- Conhecimento prévio dos conceitos de CI/CD
- Acesso a um workspace Databricks
- Token de acesso ao Databricks
Neste workshop, utilizaremos as seguintes ferramentas para implementar o pipeline de CI/CD:
A Databricks CLI é uma interface de linha de comando que permite interagir com a plataforma Databricks a partir do seu terminal local ou scripts de automação. Ela encapsula a API REST do Databricks, fornecendo endpoints para modificar ou solicitar informações sobre objetos do workspace Databricks.
Databricks Asset Bundles são uma ferramenta que facilita a adoção de boas práticas de engenharia de software, incluindo controle de código-fonte, revisão de código, testes e integração contínua e entrega (CI/CD) para seus projetos de dados e IA. Os bundles permitem descrever recursos do Databricks como jobs, pipelines e notebooks como arquivos de origem.
Databricks Connect é uma biblioteca cliente que permite conectar seu ambiente de desenvolvimento local ao Databricks. Isso possibilita:
- Desenvolvimento local
- Integração contínua
- Depuração remota
- Execução de testes automatizados que interagem com o ambiente Databricks
GitHub Actions é uma plataforma de automação que permite criar fluxos de trabalho de CI/CD diretamente no seu repositório GitHub. Com o GitHub Actions, você pode automatizar, personalizar e executar seus fluxos de trabalho de desenvolvimento de software diretamente no GitHub.
Instale o Databricks CLI utilizando pip:
pip install databricks-cliGere o token de acesso ao Databricks (vamos utilizar no proximo passo)

Configure o acesso ao Databricks:
databricks configure --tokenVocê será solicitado a fornecer:
- URL do seu workspace Databricks (ex: https://adb-123456789.4.azuredatabricks.net)
- Token de acesso pessoal
Também é possivel utilizar authenticação via browser, caso prefira.
Clone este repositório para o seu ambiente local:
git clone https://github.com/databricks-demo-itau/cicd_handson_itau
cd cicd_handson_itauO repositorio já está configurado com um job existente, que cria uma tabela de funcionários. e um workflow configurado para executar este job. Caso você deseje utilizar um job diferente, você pode seguir o passo 3.
Para começar, importe um job existente do Databricks:
databricks bundle generate job --existing-job-id 663063874671210 -t devOnde:
--existing-job-id 663063874671210especifica o ID do job que você deseja importar-t devespecifica o ambiente de destino (target environment) de onde o job será importado
Este comando irá gerar os arquivos de configuração necessários para que você possa trabalhar com o job localmente.
Quando executamos o comando para importar um job existente:
> databricks bundle generate job --existing-job-id 393880860618601 -t dev -p itaudev
File successfully saved to src/create_table_job.py
Job configuration successfully saved to resources/lab_cicd_criar_tabela_funcionario.ymlComo podemos observar:
- O arquivo SQL do job foi salvo no diretório
src/ - A configuração do job foi salva no diretório
resources/
No job importado (lab_cicd_criar_tabela_funcionario.job.yml.job.yml), usamos variáveis parametrizadas para garantir a portabilidade entre diferentes ambientes:
catalogo: ${catalogo}
Essa abordagem permite que o mesmo job seja executado em diferentes ambientes (dev, qa, prod), utilizando o catálogo apropriado para cada um.
- No arquivo
databricks.yml, definimos os diferentes ambientes e suas respectivas configurações. - Para cada ambiente (target), especificamos o valor que deve ser usado para a variável
catalogo. - Quando implantamos ou executamos o job em um ambiente específico, o sistema substitui a variável
${catalogo}pelo valor configurado para aquele ambiente.
Por exemplo:
- No ambiente
dev,${catalogo}pode ser substituído porcatalogo_dev - No ambiente
qa,${catalogo}pode ser substituído porcatalogo_qa - No ambiente
prod,${catalogo}pode ser substituído porcatalogo_prod
Para fazer o deployment do job para um ambiente específico:
databricks bundle deploy -t devEste comando implantará o job no ambiente de desenvolvimento (dev), substituindo a variável ${catalogo} pelo valor definido para este ambiente.
Para implantar em outros ambientes:
databricks bundle deploy -t qa # Deploy para ambiente de QA
databricks bundle deploy -t prod # Deploy para ambiente de produçãoPara executar o job em um ambiente específico:
databricks bundle run -t devCaso exista mais de um job no bundle, será solicitado qual job você deseja executar.
Após executar o comando de deployment, o job será criado no Databricks com o usuário logado como proprietário:
Observe que:
- O nome do job inclui um prefixo indicando o ambiente (
[dev_alfeu_duran]) - O usuário que executou o comando de deployment é automaticamente definido como o proprietário do job
- As tags do job são preservadas durante o deployment
Este projeto utiliza pytest para testes unitários e o Databricks Connect para executar testes que interagem com um ambiente Databricks.
Databricks Connect é uma biblioteca cliente que permite conectar seu ambiente de desenvolvimento local ao Databricks. Isso possibilita:
- Desenvolvimento local: Escrever e testar código localmente antes de implantá-lo no Databricks
- Integração contínua: Executar testes automatizados que interagem com o ambiente Databricks
- Depuração remota: Depurar código que será executado no cluster Databricks diretamente da sua IDE
Com o Databricks Connect, seus testes podem:
- Criar e manipular tabelas no Databricks
- Executar consultas SQL e verificar resultados
- Simular a execução de jobs exatamente como aconteceria no ambiente Databricks
- Acessar o Unity Catalog, Delta Lake e outras funcionalidades do Databricks
Isso elimina a necessidade de mocks extensivos e permite testes mais realistas que validam a interação completa com a plataforma Databricks.
- Instalação das dependências de teste:
pip install -r requirements.txt
- Databricks CLI configurada (feito no inicio deste documento)
Os testes são organizados da seguinte forma:
tests/test_create_table_job.py: Testes para validar a criação de tabelas e manipulação de dados no Databricks
Estes testes simplificados, Unitarios e de Integração, verificam:
- Verificam se a tabela foi criada
- Verificam a estrutura da tabela criada (colunas esperadas)
- Verificam a contagem de registros inseridos na tabela
- Verificam se existem valores nulos no campo CPF
- Verificam se um registro específico está presente na tabela
Importante: Os testes estão configurados para serem executados após a criação da tabela no catálogo hml_hands_on. Isso é definido no arquivo tests/test_create_table_job_direct.py, que verifica a existência e o conteúdo da tabela neste catálogo específico.
Altere as variaveis de ambiente para o catalogo e schema correto antes de executar os testes.
-
O catalogo padrao setado é:
hml_hands_on(se estiver rodando no ambiente de dev, alterar paradev_hands_on) -
O schema setado é:
alfeu_duran(alterar para o schema do seu usuário, que foicriado automaticamente no momento que foi executado o job)
Para executar todos os testes (após a execução do job e alterar as variaveis no arquivo do pytest):
pytest tests/Para executar um teste específico:
pytest tests/test_create_table_job.pyPara executar com informações detalhadas:
pytest tests/ -vO Flake8 é um linter que verifica a qualidade do código Python. Ele é configurado para verificar:
- Erros de sintaxe
- Erros de estilo
- Erros de complexidade
Configuramos o Flake8 para verificar o código no momento do CI/CD com Github Actions.
Para automatizar o processo de CI/CD, foi configurado um workflow no GitHub Actions. O arquivo .github/workflows/validate-deploy-qa.yml define o pipeline que é executado quando um Pull Request é aberto ou atualizado na branch qa.
Nossa pipeline será composta por 5 jobs sequenciais, que serão explicados em detalhes abaixo:
-
Code Quality Check
- Verifica a qualidade do código usando Flake8
- Analisa complexidade e estilo do código
- Garante que não há erros de sintaxe
-
Validate Bundle
- Valida a configuração do bundle do Databricks
- Verifica se todas as configurações estão corretas para o ambiente QA
-
Deploy to QA
- Faz o deploy do job para o ambiente QA
- Utiliza as credenciais configuradas no GitHub Secrets
-
Run Job in QA
- Executa o job no ambiente QA
- Verifica se o job é executado com sucesso
-
Run Tests
- Executa os testes unitários e de integração
- Verifica se os testes passam após o deploy
Imagem visual sobre o fluxo de trabalho com GitHub Actions:
O fluxo de trabalho com GitHub Actions segue os seguintes passos:
-
Desenvolvimento na Branch Dev
- Os desenvolvedores realizam seus commits na branch
dev - Esta é a branch de desenvolvimento onde as novas features são implementadas
- Os desenvolvedores realizam seus commits na branch
-
Pull Request para QA
- Quando o código está pronto, é criado um Pull Request de
devparaqa - Este processo pode ser automatizado com ferramentas como o GitHub Auto-PR
- O PR dispara automaticamente o workflow de validação
- Quando o código está pronto, é criado um Pull Request de
-
Execução do Workflow
- O workflow definido em
.github/workflows/validate-deploy-qa.ymlé executado - Todos os 5 jobs são executados sequencialmente
- Qualquer falha em um dos jobs interrompe o processo
- O workflow definido em
-
Proteção da Branch QA
- A branch
qaé protegida por regras de branch protection - O merge só é permitido se todos os checks do workflow passarem
- Isso garante que apenas código validado chegue ao ambiente de QA
- A branch
-
Merge ou Rejeição
- Se todos os checks passarem, o PR pode ser aprovado e merged
- Se houver falhas, o PR é bloqueado até que os problemas sejam corrigidos
- O desenvolvedor recebe feedback imediato sobre qualquer problema
Este fluxo garante a qualidade do código e a integridade do ambiente de QA, estabelecendo um processo robusto de CI/CD.
Exemplo de configuração do workflow:
name: Validate QA PR
on:
pull_request:
branches:
- qa
types: [opened, synchronize, reopened]
jobs:
code_quality:
name: Code Quality Check
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install Flake8
run: |
python -m pip install --upgrade pip
pip install flake8
- name: Run Flake8
run: |
flake8 src/ --count --select=E9,F63,F7,F82 --ignore=F821 --show-source --statisticsEste workflow garante que:
- O código está em conformidade com os padrões de qualidade
- O bundle está configurado corretamente
- O deploy é realizado com sucesso
- O job é executado corretamente
- Os testes passam após o deploy
Para que o workflow funcione corretamente, é necessário configurar os seguintes secrets no GitHub:
DATABRICKS_HOST_HML: URL do workspace DatabricksDATABRICKS_TOKEN_HML: Token de acesso ao Databricks



