Как выглядит базовый 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