Ответ
В 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), работают стабильно во всех окружениях.