Автоматическая миграция DAG-файлов Airflow 2.x -> 3.x с интеграцией GitLab и Airflow API
Project description
airflow-v3-migrator
Инструмент автоматической миграции DAG-файлов Airflow 2.x → Airflow 3.x.
Делает три вещи:
- Диагностика — находит устаревшие модули, операторы и параметры
(
provide_context,@apply_defaults,schedule_interval,DummyOperator, старые импорты). - Авто-исправление — заменяет импорты на новые SDK-пути, удаляет устаревшие аргументы, переименовывает операторы.
- Интеграция с 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 |
ветки, по умолчанию prod → v3-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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file airflow_v3_migrator-0.2.4.tar.gz.
File metadata
- Download URL: airflow_v3_migrator-0.2.4.tar.gz
- Upload date:
- Size: 17.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a804d68fcb955c4cb6d1e1dbd30b682b8e55452072372cb029067351ea046730
|
|
| MD5 |
38def6a601aa9690c3ebd9f4e69dbe91
|
|
| BLAKE2b-256 |
5d69891d71d8f3b4262c7b3e381187b0b185a389618a1a2a4955fe1819cf6ddf
|
File details
Details for the file airflow_v3_migrator-0.2.4-py3-none-any.whl.
File metadata
- Download URL: airflow_v3_migrator-0.2.4-py3-none-any.whl
- Upload date:
- Size: 16.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cd88fdedc64502087efc7997330d3b6a749b33822d8fa039e4a9c0a9ee022142
|
|
| MD5 |
30a2ac65d38c82ac483c6c4656ee0535
|
|
| BLAKE2b-256 |
ea523eb0da292974a8d98ba4b368d81f93e66307a94c1b96fe2217886df6ab7c
|