Обзор GitSync
GitSync — это сервис ADO, предназначенный для синхронизации содержимого удаленных Git-репозиториев. Хотя основным сценарием его использования является доставка DAG Airflow, GitSync также может синхронизировать другое содержимое репозиториев, например dbt-проекты или скрипты, с настраиваемыми целевыми директориями.
Основные возможности GitSync:
-
Синхронизация репозиториев — клонирование и обновление файлов из одного или нескольких Git-репозиториев.
-
Гибкие сценарии синхронизации — синхронизация нескольких репозиториев, нескольких веток или нескольких директорий одного репозитория.
-
Автоматическое обновление файлов — синхронизация содержимого репозиториев с настраиваемыми целевыми директориями.
-
Гибкая фильтрация — выбор файлов с использованием шаблонов.
-
Установка зависимостей на уровне репозитория — опциональная установка Python-зависимостей с использованием Python-окружения, заданного для конкретного репозитория.
-
Параллельная обработка — одновременная обработка нескольких задач синхронизации с помощью воркеров.
-
Очистка — опциональное удаление устаревших файлов из целевых директорий.
-
Управление SSH-ключами — централизованное управление SSH-ключами через действия в ADCM.
-
Мониторинг — экспорт метрик Prometheus и готовый дашборд Grafana для мониторинга состояния и производительности синхронизации.
Использование GitSync
GitSync работает как отдельный сервис и состоит из одного компонента (gitsync).
Процесс синхронизации включает следующие шаги:
-
Исходный код хранится в одном или нескольких Git-репозиториях.
-
GitSync клонирует или обновляет каждую настроенную конфигурацию репозитория независимо.
-
Файлы фильтруются в соответствии с конфигурацией GitSync.
-
Если задано конфигурацией, Python-зависимости устанавливаются с использованием Python-окружения, заданного для данного репозитория.
-
Выбранные файлы копируются в целевую директорию.
-
При необходимости удаляются устаревшие синхронизированные файлы.
-
GitSync записывает журналы и экспортирует метрики.
Airflow автоматически обнаруживает обновленные DAG, сканируя настроенную директорию DAG. Сканирование выполняется рекурсивно для всех подкаталогов (например, /opt/airflow/dags).
Конфигурация
Конфигурация GitSync состоит из двух уровней:
Конфигурация сервиса
Параметры сервисного уровня определяют общее поведение GitSync. Они задаются в разделе gitsync-env.sh в ADCM.
Основные параметры:
-
количество параллельных воркеров;
-
расписание синхронизации;
-
тайм-аут синхронизации по умолчанию;
-
настройки логирования;
-
Python-окружение по умолчанию (
TARGET_PYTHON), используемое для обратной совместимости, если для репозитория не указан собственный интерпретатор Python.
Конфигурация репозитория
Настройки репозиториев задаются в опции config.json в ADCM.
Каждая конфигурация репозитория представляет собой отдельную задачу синхронизации. Несколько конфигураций могут ссылаться на один и тот же репозиторий, ветку или директорию.
Пример конфигурации репозитория:
{
"url": "git@ssh.gitlab.example.io:org/repo.git", (1)
"branch": "main", (2)
"directory": "./dags", (3)
"files": "*.py", (4)
"sync_interval": 60,
"sync_timeout": 120,
"ssh_key": "my-git-key", (5)
"target_folder": "/opt/airflow/dags/project", (6)
"sync_requirements": true,
"requirements_path": "requirements.txt",
"target_python": "/usr/lib/airflow/venv/bin/python", (7)
"delete_old_files": true (8)
}
| 1 | URL Git-репозитория. |
| 2 | Ветка репозитория. |
| 3 | Директория репозитория для синхронизации. |
| 4 | Правила фильтрации файлов. |
| 5 | Имя SSH-ключа (для SSH-репозиториев). |
| 6 | Целевая директория. |
| 7 | Интерпретатор Python, используемый для установки зависимостей данного репозитория. Если "sync_requirements": true, для установки зависимостей используется значение target_python. Если параметр не указан, используется значение TARGET_PYTHON конфигурации сервиса. |
| 8 | Параметры удаления устаревших файлов (опционально). |
Каждая конфигурация репозитория обрабатывается независимо.
GitSync поддерживает следующие сценарии синхронизации:
-
синхронизацию нескольких независимых репозиториев;
-
синхронизацию нескольких веток одного репозитория;
-
синхронизацию нескольких директорий одного репозитория;
-
синхронизацию одной и той же директории из разных веток.
Во избежание конфликтов каждая задача синхронизации должна использовать уникальный target_folder.
[
{
"url": "git@ssh.gitlab.example.io:org/project.git",
"branch": "main",
"directory": "./dags",
"target_folder": "/opt/airflow/dags/main",
"target_python": "/usr/lib/airflow/venv/bin/python",
"files": "*.py"
},
{
"url": "git@ssh.gitlab.example.io:org/project.git",
"branch": "dev",
"directory": "./dags",
"target_folder": "/opt/airflow/dags/dev",
"target_python": "/usr/lib/airflow/venv/bin/python",
"files": "*.py"
},
{
"url": "git@ssh.gitlab.example.io:org/project.git",
"branch": "main",
"directory": "./dbt",
"target_folder": "/opt/dbt/project",
"target_python": "/usr/lib/dbt/venv/bin/python",
"files": "*"
},
{
"url": "https://github.com/org/shared-dags.git",
"branch": "main",
"directory": "./",
"target_folder": "/opt/airflow/dags/shared",
"files": "*.py",
"access_token": "******",
"https_username": "oauth2"
}
]
Синхронизация репозиториев
Каждая конфигурация репозитория рассматривается как независимая задача синхронизации.
GitSync хранит состояние синхронизации отдельно для каждой уникальной комбинации следующих параметров:
-
URL репозитория;
-
ветка;
-
директория.
Это позволяет выполнять независимую синхронизацию даже в том случае, если несколько задач используют один и тот же Git-репозиторий.
Например, одновременно поддерживаются следующие сценарии:
-
синхронизация разных веток одного репозитория в разные целевые директории;
-
синхронизация разных директорий одного репозитория;
-
комбинация этих подходов.
Аутентификация SSH
Для репозиториев с доступом по SSH GitSync предоставляет встроенное управление ключами:
-
SSH-ключи загружаются с помощью действия Upload private key.
-
Ключи хранятся и управляются GitSync в соответствии с конфигурацией сервиса.
-
В конфигурации репозитория указывается имя ключа.
-
Ключи добавляются во время выполнения.
Один и тот же SSH-ключ может использоваться для нескольких репозиториев.
Начало работы
Чтобы начать использовать GitSync:
-
Добавьте и установите сервис GitSync в ADO.
-
Настройте параметры сервиса.
-
При необходимости загрузите SSH-ключи с помощью действия Upload private key GitSync.
-
Определите конфигурации репозиториев.
-
Убедитесь, что целевые директории доступны соответствующим приложениям.
После завершения настройки GitSync автоматически синхронизирует каждую настроенную конфигурацию репозитория в соответствии с заданным интервалом.
Ограничения
При настройке GitSync учитывайте следующие ограничения:
-
Если параметр
delete_old_filesустановлен вtrue, файлы, созданные во время выполнения приложения, могут быть удалены, если они находятся внутри синхронизируемой директории. -
При использовании dbt-проектов необходимо учитывать, что директории, создаваемые во время выполнения (например, target/ и logs/), не должны синхронизироваться. Рекомендуется использовать следующую конфигурацию:
-
files = "*"; -
delete_old_files = false.
-
-
Требуется сетевой доступ к Git-репозиториям.
-
Для SSH-репозиториев требуется корректная настройка ключей.
-
Каждая задача синхронизации должна использовать уникальный
target_folder. -
Дублирование
dag_idв разных синхронизируемых репозиториях DAG приводит к конфликтам в Airflow.