Шаг 12 из 12

Итог

К моменту этого шага у нас уже должна сформироваться полная картина действий. У нас есть все необходимые данные для настройки CI/CD:

  • Ключ для доступа к репозиторию
  • Ключ для авторизации на сервере

Осталось привести код для автоматизации деплоя через fabric и YAML-файл для запуска GitHub Actions:

import os

from fabric import Connection, task

home = os.path.expanduser('~')
dags_path = os.path.join(home, 'airflow', 'dags')
repo_path = os.path.join(home, 'repositories', 'dataeng_dags')
env_path = os.path.join(home, 'venvs', '.airflow', 'bin', 'activate')

@task
def deploy(context):
    with Connection('your_server.com') as conn:
        with conn.cd(repo_path):
            with conn.prefix(f'source {env_path}'):
                conn.run('git pull')
                conn.run('pip install -r requirements.txt')
                conn.run(f'cp -R dags/* {dags_path}')

Сохраните код под названием fabfile.py в корне вашего проекта с DAGами. Вам лишь необходимо отредактировать пути. Если разбирать его по шагам, то он выполняет следующие действия:

  1. Соединяется с хостом your_server.com
  2. Переходит в папку со склонированным репозиторием с дагами
  3. Активирует виртуальное окружение
  4. Обновляет репозиторий (стягивает изменения)
  5. Устанавливает зависимости в виртуальное окружение
  6. Копирует все даги из репозиторий в папку с дагами из настроек Airflow. Это, к слову, необязательный шаг если вы настраивали dags_folder на ваш репозиторий.

А теперь исходный код для GitHub Actions:

name: Airflow DAGs deployment

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: clone repo
        uses: actions/checkout@v2

      - name: Set up Python
        uses: actions/setup-python@v2
        with:
          python-version: 3.8.12

      - name: Install SSH key
        uses: shimataro/ssh-key-action@v2.3.1
        with:
          key: ${{ secrets.DEPLOY_KEY }}
          name: id_rsa
          known_hosts: ${{ secrets.KNOWN_HOSTS }}
          config: |
            Host <your_server.com>
              HostName <your_server.com>
              User <username>
              IdentityFile ~/.ssh/id_rsa
              Port 22

      - name: Install python dependencies
        run: |
          python -m pip install --upgrade pip
          pip install fabric==2.6.0

      - name: Run fabfile
        run: fab deploy

Тут также стоит дать пояснения по шагам:

  1. Клонируем репозиторий через actions/checkout
  2. Устанавливаем Python версии 3.8.12
  3. Устанавливаем приватный ключ для подключения по ssh к Airflow-хосту.
  4. Устанавливаем единственную зависимость fabric, чтобы запустить наш fabfile с инструкциями.

Готово! Итак, что нужно сделать чтобы всё заработало:

  1. Код для fabric сохранить в корень репозитория под названием fabfile.py
  2. Код для GitHub Actions положить по пути .github/workflows/deploy.yml относительно корня репозитория
  3. Закоммитить изменения в GitHub

Все выполненные или выполняющиеся Workflow можно смотреть в репозитории во вкладке Actions:

Комментарии