Este repositório contém pipelines desenvolvidas com Prefect para automação de fluxos de dados da Prefeitura do Rio de Janeiro.
Se você deseja contribuir com o projeto, acesse nossa guia de contribuição.
pipelines/
├── rj_sec__pipeline1/
├── rj_sec__pipeline2/
└── ...
Dockerfile
pyproject.toml
rj_sec__pipeline
├── Dockerfile
├── flow.py
├── prefect.yaml
├── pyproject.toml
└── ...
Este repositório utiliza um modelo monorepo para gerenciar múltiplas pipelines Prefect de forma centralizada e padronizada:
-
Dockerfile base: o arquivo
Dockerfile
na raiz define a imagem base utilizada por todas as pipelines. Ele inclui as dependências essenciais para execução dos fluxos, como Python, Prefect, drivers de banco de dados e ferramentas auxiliares. Cada pipeline pode customizar sua própria imagem a partir desse Dockerfile base, garantindo consistência e facilidade de manutenção. -
pyproject.toml
centralizado com uv workspaces: opyproject.toml
na raiz do projeto gerencia as dependências Python de todas as pipelines utilizando uv workspaces.- Cada subdiretório em
pipelines/
representa um módulo Python independente, mas todos são importados automaticamente como membros do workspace. - As dependências e configurações definidas no
pyproject.toml
base são herdadas por todas as pipelines, facilitando a atualização e padronização do ambiente. - Novas pipelines adicionadas à pasta
pipelines/
são automaticamente reconhecidas e integradas ao workspace, sem necessidade de configuração manual adicional.
- Cada subdiretório em
Esse modelo garante reprodutibilidade, isolamento e facilidade de evolução para todas as pipelines do repositório.
Cada pipeline possui:
Dockerfile
: imagem customizada para execução no Prefectflow.py
: definição dos fluxos Prefectprefect.yaml
: configuração do deployment Prefectpyproject.toml
: dependências específicas da pipeline
Alterações específicas de cada pipeline devem ser adicionadas no Dockerfile
de cada pipeline, assim como dependências específicas devem ser adicionadas no pyproject.toml
de cada pipeline.
O arquivo prefect.yaml
é responsável por definir as configurações de deployment do flow Prefect. Esse arquivo especifica variáveis de ambiente, parâmetros, agendamento, infraestrutura de execução e outras opções necessárias para o correto funcionamento do fluxo. O arquivo também é utilizado nos workflows de CI/CD para registrar e disponibilizar os flows.
Consulte a documentação oficial do Prefect para detalhes sobre todas as opções disponíveis.
O parâmetro secretName
nas job_variables
do prefect.yaml
especifica qual Kubernetes Secret deve ser montado no container durante a execução do job. Esse secret contém variáveis de ambiente necessárias para o funcionamento da pipeline, como credenciais de banco de dados, tokens de API e outras informações sensíveis.
Valores padrão utilizados:
prefect-jobs-secrets
: para deployments de produçãoprefect-jobs-secrets-staging
: para deployments de staging
Exemplo de configuração no prefect.yaml
:
deployments:
- name: rj-secretaria--pipeline--prod
work_pool:
job_variables:
secretName: prefect-jobs-secrets
- name: rj-secretaria--pipeline--staging
work_pool:
job_variables:
secretName: prefect-jobs-secrets-staging
- Os diretórios de pipelines seguem o padrão:
rj_<secretaria>__<pipeline>
, utilizando apenas letras minúsculas, números e underscores. - Os arquivos principais de cada pipeline (
Dockerfile
,flow.py
,prefect.yaml
,pyproject.toml
) devem estar diretamente dentro do diretório da pipeline. - Os nomes de deployments Prefect seguem o padrão
rj-<secretaria>--<pipeline>--<ambiente>
, por exemplo:rj-segovi--dump-db-1746--staging
. - Use sempre nomes descritivos e padronizados para facilitar a identificação e automação dos fluxos.
Este repositório utiliza cookiecutter
para facilitar a criação de novas pipelines de forma padronizada. Os templates disponíveis em templates/
permitem gerar rapidamente a estrutura de diretórios e arquivos necessários para uma nova pipeline Prefect, incluindo Dockerfile
, flow.py
, prefect.yaml
e pyproject.toml
.
Para criar uma nova pipeline, instale uv
e rode:
uvx cookiecutter templates --output-dir=pipelines
Você será solicitado a informar valores como secretaria
e pipeline
, que serão utilizados para preencher os nomes dos diretórios, arquivos e variáveis nos templates. O template gerado já segue o padrão de nomenclatura definido anteriormente.
Este repositório utiliza dois work pools principais para execução dos deployments Prefect:
- default-pool: destinado à execução geral de pipelines, incluindo fluxos que não possuem requisitos especiais de rede ou infraestrutura. É o pool padrão para a maioria dos deployments.
- datario-pool: utilizado para pipelines que acessam bancos de dados ou sistemas internos da IplanRio, especialmente aqueles que exigem conexão via VPN. Esse pool garante que os jobs sejam executados em ambientes com acesso seguro e autorizado aos recursos internos.
Ao configurar um deployment no arquivo prefect.yaml
, selecione o pool apropriado conforme a necessidade de acesso aos dados ou sistemas.
O repositório utiliza GitHub Actions para automatizar todo o ciclo de vida das pipelines, incluindo build, deploy e publicação de imagens Docker:
-
Deploy automático dos flows: os workflows
.github/workflows/deploy-prefect-flows-prod.yaml
e.github/workflows/deploy-prefect-flows-staging.yaml
realizam o deploy automático dos flows Prefect para os ambientes de produção e staging, respectivamente.- O workflow de produção é acionado a cada push na branch
master
ou manualmente, sempre que houver alterações em arquivos dentro depipelines/**
. - O workflow de staging é acionado a cada push em branches
staging/*
ou manualmente, também monitorando alterações empipelines/**
. - Ambos executam:
- Checkout do código-fonte
- Login no GitHub Container Registry (
ghcr.io
) - Instalação das dependências Python com
uv
- Execução do script
.github/scripts/deploy_prefect_flows.py
, que faz o deploy automático de todos os flows definidos empipelines/*/prefect.yaml
- Caso algum deploy falhe, o workflow é interrompido e o erro é registrado nos logs
- O workflow de produção é acionado a cada push na branch
-
Build e publicação da imagem base: o workflow
.github/workflows/build-and-push-root-dockerfile.yaml
é acionado em alterações noDockerfile
da raiz a cada push na branchmaster
, além de poder ser executado manualmente. Ele realiza:- Build da imagem Docker definida no
Dockerfile
do repositório - Publicação da imagem no GitHub Container Registry (
ghcr.io/${{ github.repository }}:latest
)
- Build da imagem Docker definida no