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.3.tar.gz (17.2 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.3-py3-none-any.whl (15.9 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: airflow_v3_migrator-0.2.3.tar.gz
  • Upload date:
  • Size: 17.2 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.3.tar.gz
Algorithm Hash digest
SHA256 085904e2bc11fef6bf975dcfd70322d8258c0e263f59e69a6d6e7813174bd588
MD5 ef42c04eabc80e4666ddb6f315089bae
BLAKE2b-256 1b724c115524459256518cdf2555bdec3c372a8de3e27f2fa43191433a12d24d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for airflow_v3_migrator-0.2.3-py3-none-any.whl
Algorithm Hash digest
SHA256 4e81425fd42794ebed597e5253fdd18c52f1a466e3f7a798f5d2e3beff13ade3
MD5 0769b09c6a2a242bae70d1ed80be9edc
BLAKE2b-256 ece9ab3c2b79ba142f3a85ad19e8a9c22d602ea4ff52e8cb5318407f0bd8540d

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