Как выглядит базовый CI/CD пайплайн для Python-проекта

Ответ

Базовый CI/CD пайплайн для Python-проекта автоматизирует проверку качества кода, тестирование и развертывание. Он обычно состоит из нескольких ключевых этапов, запускаемых при каждом коммите в репозиторий.

Основные этапы пайплайна:

  1. Checkout: Загрузка исходного кода из репозитория.
  2. Setup Environment: Установка нужной версии Python и зависимостей проекта (обычно из requirements.txt).
  3. Linting & Formatting: Проверка кода на соответствие стилю с помощью инструментов вроде flake8, black или ruff.
  4. Testing: Запуск автоматических тестов (например, с помощью pytest) для проверки корректности работы кода.
  5. (Опционально) Build: Сборка артефактов, например, создание Docker-образа.
  6. (Опционально) Deploy: Автоматическое развертывание приложения на тестовый или продакшн-сервер.

Пример: CI-пайплайн с использованием GitHub Actions

Это типичный файл конфигурации .github/workflows/ci.yml, который выполняет линтинг и тестирование для Python-проекта.

# Имя рабочего процесса
name: Python CI

# Триггеры для запуска: push в main или создание pull request
on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  # Название задачи
  build-and-test:
    # ОС, на которой будет выполняться задача
    runs-on: ubuntu-latest

    strategy:
      # Запуск тестов на нескольких версиях Python
      matrix:
        python-version: ["3.9", "3.10", "3.11"]

    steps:
      # 1. Клонирование репозитория
      - name: Checkout repository
        uses: actions/checkout@v3

      # 2. Настройка Python нужной версии
      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v4
        with:
          python-version: ${{ matrix.python-version }}

      # 3. Установка зависимостей
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt
          pip install flake8 pytest

      # 4. Проверка кода линтером
      - name: Lint with flake8
        run: |
          flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics

      # 5. Запуск тестов
      - name: Test with pytest
        run: |
          pytest

Ответ 18+ 🔞

А, вот это тема, блядь! Сейчас я тебе на пальцах, как для полного чайника, объясню, что это за магия такая — CI/CD для питонячего кода. Представь, что ты не один, а целая банда распиздяев пишет в один проект. Чтобы они не насрали в общий код, и нужен этот самый пайплайн — он как злой надзиратель, который всех строит и заставляет делать всё по правилам.

Из чего эта хуйня состоит, по шагам:

  1. Checkout (Выкатка кода): Пайплайн лезет в твой репозиторий и выкачивает оттуда весь свежий код. Без этого нихуя не начнётся.
  2. Setup Environment (Подготовка площадки): Ставит нужную версию Питона и все библиотеки, которые твой проект жрёт. pip install -r requirements.txt — святое дело, блядь.
  3. Linting & Formatting (Причёсывание и обнюхивание): Тут приходят строгие училки вроде flake8 или black. Они смотрят, не пишешь ли ты криво, не нарушаешь ли стиль, и если что — сразу по рукам бьют. Чтобы код был красивый, а не как курица лапой.
  4. Testing (Испытания огнём): Самое интересное. Запускаются все твои автотесты через pytest. Если хоть один тест сдох — всё, пиздец, пайплайн красный и дальше не пускает. Значит, ты что-то сломал, мудак.
  5. (По желанию) Build (Сборка): Если проект серьёзный, тут могут собрать Docker-образ или какой-нибудь пакет.
  6. (По желанию) Deploy (Выкат): И наконец, если все предыдущие этапы прошли без сучка и задоринки, автоматически выкатывает твоё творение на сервера. Красота, ёпта!

Живой пример на GitHub Actions

Вот смотри, как это выглядит в реальности. Файлик .github/workflows/ci.yml — это и есть наша инструкция для надзирателя.

# Как этот конвейер зовут
name: Python CI

# Когда его будить: когда кто-то пихает код в main или создаёт pull request
on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  # Задача, которую он будет выполнять
  build-and-test:
    # На какой операционке работать
    runs-on: ubuntu-latest

    strategy:
      # Хитрость: прогнать всё на нескольких версиях Питона, чтобы везде работало
      matrix:
        python-version: ["3.9", "3.10", "3.11"]

    steps:
      # 1. Выкачать код из гита
      - name: Checkout repository
        uses: actions/checkout@v3

      # 2. Поставить нужный Питон
      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v4
        with:
          python-version: ${{ matrix.python-version }}

      # 3. Нажрать все зависимости
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt
          pip install flake8 pytest

      # 4. Прогнать линтер (пусть покритикует)
      - name: Lint with flake8
        run: |
          flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics

      # 5. Запустить тесты. Если упадут — будет овердохуища стыда.
      - name: Test with pytest
        run: |
          pytest

Вот и вся магия, блядь. Настроил один раз — и потом можно спать спокойно. Система сама будет орать, если кто-то из твоей команды накосячит. Удобно же, в рот меня чих-пых!