Как автоматизировать сборку и управление зависимостями для Python-скриптов в DevOps-контексте?

«Как автоматизировать сборку и управление зависимостями для Python-скриптов в DevOps-контексте?» — вопрос из категории Скриптинг и автоматизация, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В DevOps для Python-скриптов (например, для автоматизации AWS, обработки логов) я фокусируюсь на воспроизводимости и изоляции, а не на публикации в PyPI.

1. Управление зависимостями и виртуальным окружением через poetry:

# Инициализация проекта и установка зависимостей
poetry new my-automation-script
cd my-automation-script
poetry add boto3 pandas requests
poetry add --dev pytest black mypy

# Активация виртуального окружения и запуск скрипта
poetry shell
python my_script.py

# Или запуск без активации оболочки
poetry run python my_script.py

Файл pyproject.toml гарантирует одинаковые версии зависимостей у всех членов команды.

2. Сборка минимального Docker-образа для выполнения скриптов:

# Использую многоступенчатую сборку для уменьшения образа
FROM python:3.11-slim as builder

WORKDIR /app

# Копируем только файлы зависимостей для лучшего кэширования слоев
COPY pyproject.toml poetry.lock ./ 
RUN pip install --no-cache-dir poetry==1.7.0 && 
    poetry config virtualenvs.create false && 
    poetry install --no-dev --no-interaction --no-ansi

# Финальный образ
FROM python:3.11-alpine
WORKDIR /app
COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
COPY . .

CMD ["python", "my_script.py"]

Итоговый образ весит ~120 МБ вместо ~900 МБ.

3. Интеграция в CI/CD пайплайн для проверки качества:

# .gitlab-ci.yml
lint-and-test:
  image: python:3.11-slim
  before_script:
    - pip install poetry
    - poetry install
  script:
    - poetry run black --check .          # Форматирование
    - poetry run mypy .                   # Проверка типов
    - poetry run pytest tests/ -v         # Unit-тесты
    - poetry run bandit -r . -ll          # Анализ безопасности

4. Упаковка в ZIP-архив для AWS Lambda (если скрипт — функция):

# Скрипт сборки для Lambda
poetry export --without-hashes --format=requirements.txt > requirements.txt
pip install -r requirements.txt --target ./package
cd package && zip -r ../deployment_package.zip . && cd ..
zip -g deployment_package.zip my_lambda_function.py

Такой подход обеспечивает, что скрипты, используемые для автоматизации инфраструктуры (Terraform, Ansible), работают стабильно во всех окружениях.