Skip to main content

Автоматическая миграция DAG-файлов Airflow 2.x -> 3.x с интеграцией GitLab и Airflow API

Project description

airflow-v3-migrator

Инструмент автоматической миграции DAG-файлов Airflow 2.x → Airflow 3.x.

Делает три вещи:

  1. Диагностика — находит устаревшие модули, операторы и параметры (provide_context, @apply_defaults, schedule_interval, DummyOperator, старые импорты).
  2. Авто-исправление — заменяет импорты на новые SDK-пути, удаляет устаревшие аргументы, переименовывает операторы.
  3. Интеграция с GitLab — читает файлы DAG из исходной ветки (prod), применяет правки и коммитит результат в целевую ветку (v3-prod). Зависимые файлы (.sql, .json и т.д.) переносятся без изменений.

Установка

pip install .
# или режим разработки:
pip install -e .

Для шаринга можно собрать wheel и передать коллегам:

pip install build
python -m build          # создаст dist/airflow_v3_migrator-0.1.0-py3-none-any.whl
# коллега ставит:
pip install airflow_v3_migrator-0.1.0-py3-none-any.whl

Настройка

Секреты не зашиты в код. Скопируйте .env.example в .env и заполните:

cp .env.example .env
Переменная Описание
AIRFLOW_BASE_URL URL Airflow
AIRFLOW_USERNAME / AIRFLOW_PASSWORD доступ к Airflow REST API
GITLAB_URL URL GitLab
GITLAB_TOKEN Personal Access Token (read_api, write_repository)
GITLAB_PROJECT_PATH путь проекта, по умолчанию stark/airflow
GITLAB_SOURCE_BRANCH / GITLAB_TARGET_BRANCH ветки, по умолчанию prodv3-prod
CHANNEL_MAP опц. подмена ID, формат OLD:NEW,OLD2:NEW2

.env загружается автоматически. Можно также передавать переменные через окружение.

Использование

# Список активных DAG из Airflow
airflow-v3-migrate list-dags

# Мигрировать DAG по имени (путь к папке берётся из Airflow)
airflow-v3-migrate migrate-dag exchange_prices

# Мигрировать конкретную папку репозитория
airflow-v3-migrate migrate-folder dags/for_bison/moq

# Без интерактивного подтверждения
airflow-v3-migrate migrate-dag exchange_prices --yes

# Со своим сообщением коммита
airflow-v3-migrate migrate-dag exchange_prices -m "CDAT-2654 migrate exchange_prices"

# Применить правила к локальным файлам (без GitLab/Airflow)
airflow-v3-migrate fix-local ./dags
airflow-v3-migrate fix-local ./dags --diagnose   # только диагностика

Использование как класса (рекомендуется)

Все токены и доступы передаются один раз при инициализации, дальше — только методы. Полный пример: example.py.

from airflow_v3_migrator import AirflowV3Migrator

migrator = AirflowV3Migrator(
    airflow_base_url="https://airflow-cdat.autodoc.dev",
    airflow_username="admin",
    airflow_password="***",
    gitlab_url="https://gitlab.autodoc.dev",
    gitlab_token="***",                       # права: read_api, write_repository
    gitlab_project_path="stark/airflow",
    source_branch="prod",
    target_branch="v3-prod",
    channel_map={"PROD_CHANNEL_ID": "TEST_CHANNEL_ID"},   # опц. подмена ID
)

# либо собрать из .env / окружения:
# migrator = AirflowV3Migrator.from_env()

dags = migrator.get_active_dags()             # список активных DAG из Airflow
url = migrator.migrate_dag("exchange_prices") # возвращает ссылку на коммит

migrator.analyze_code(code)                   # список проблем в коде
migrator.migrate_code(code)                   # мигрированный код
migrator.migrate_dag("exchange_prices")       # миграция DAG по имени + коммит
migrator.migrate_folder("dags/for_bison/moq") # миграция папки + коммит

# сообщение коммита: при инициализации (commit_message=...),
# на лету в методе, или сменить атрибут для всех вызовов
migrator.migrate_dag("exchange_prices", commit_message="CDAT-2654 migrate")
migrator.commit_message = "CDAT-2654 auto dag move"
migrator.fix_local("./dags", diagnose=True)   # локально, без GitLab/Airflow

Методы класса

Метод Что делает
get_active_dags(only_active=True) список DAG из Airflow
find_dag(name) найти DAG по имени
analyze_code(code) список проблем Airflow 2.x
migrate_code(code) вернуть мигрированный код
migrate_dag(name, confirm=True) мигрировать DAG по имени и закоммитить
migrate_folder(folder, confirm=True) мигрировать папку репозитория
fix_local(path, diagnose=False) применить правила к локальным файлам

Перезапись существующей папки (update вместо create)

По умолчанию, если папка уже есть в целевой ветке, перенос отменяется. Чтобы вместо этого перезаписать файлы, передайте overwrite=True — тогда существующие файлы коммитятся с action=update, а новые с action=create (выбирается автоматически по каждому файлу):

migrator.migrate_dag("exchange_prices", overwrite=True)
migrator.migrate_folder("dags/for_bison/moq", overwrite=True)
airflow-v3-migrate migrate-dag exchange_prices --overwrite

migrate_dag / migrate_folder / push_commit возвращают ссылку на созданный коммит (web_url) или None, если коммитить нечего. Автор коммита по умолчанию — Adilkhan Zaidulla <a.zaidulla@autodoc.eu> (меняется параметрами author_name / author_email или переменными GITLAB_AUTHOR_NAME / GITLAB_AUTHOR_EMAIL).

Логирование

Уровень логов управляется через setup_logging или параметр log_level:

from airflow_v3_migrator import setup_logging
import logging

setup_logging(logging.DEBUG)   # подробно: HTTP-запросы, diff каждого файла
setup_logging("WARNING")       # только предупреждения и ошибки

В CLI — флаг --log-level:

airflow-v3-migrate --log-level DEBUG migrate-dag exchange_prices

Публикация в PyPI

pip install build twine
python -m build                       # соберёт dist/*.whl и dist/*.tar.gz
twine check dist/*                     # проверка метаданных
twine upload dist/*                    # публикация (спросит токен PyPI)

Токен PyPI берётся из ~/.pypirc или переменной TWINE_PASSWORD (username __token__). Для проверки можно сначала загрузить в TestPyPI: twine upload -r testpypi dist/*.

⚠️ Имя airflow-v3-migrator на PyPI может быть занято — проверьте на pypi.org и при необходимости поменяйте name в pyproject.toml.

Безопасность

  • Никогда не коммитьте .env и токены в репозиторий (.gitignore это учитывает).
  • Если токен/пароль уже попадал в общий ноутбук — отзовите его и выпустите новый.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

airflow_v3_migrator-0.2.0.tar.gz (16.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

airflow_v3_migrator-0.2.0-py3-none-any.whl (15.7 kB view details)

Uploaded Python 3

File details

Details for the file airflow_v3_migrator-0.2.0.tar.gz.

File metadata

  • Download URL: airflow_v3_migrator-0.2.0.tar.gz
  • Upload date:
  • Size: 16.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for airflow_v3_migrator-0.2.0.tar.gz
Algorithm Hash digest
SHA256 a288483ae29674a2ee03ce582853268f0d1e27ea8b9cf9b1fb9f5f6f698ee629
MD5 08d0c15aef9c61a7fd813d63e530433e
BLAKE2b-256 1d459d63e1e068f9afde51a54fbe4804f380f0b7fc33bd19ca5eba3b007f1d0a

See more details on using hashes here.

File details

Details for the file airflow_v3_migrator-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for airflow_v3_migrator-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 385e08a017847492d2ecf4aa4329730e82b9884c75ac609332e3e45f4f970604
MD5 9d7a57a8be3af277745510429175d531
BLAKE2b-256 70d24cd19ce4ad08f756247a3a947ab93c976e7b8f4a348589cc0773907ddd7e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page