Как вы управляли внешними зависимостями на последнем проекте?

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

Ответ

На последнем проекте мы использовали многоуровневый подход к управлению зависимостями, чтобы обеспечить воспроизводимость, безопасность и скорость сборок.

1. Системные пакеты (Ubuntu/Debian):

  • Использовали Ansible для управления конфигурацией.
  • Развернули локальный APT-зеркал (apt-mirror) для кэширования пакетов из официальных репозиториев. Это ускоряло развертывание и обеспечивало работу в изолированной среде.
  • Все версии пакетов фиксировались в Ansible playbooks.

2. Зависимости приложения (Python/Go):

  • Для Python использовали pip с requirements.txt, где все версии были зафиксированы (pip freeze).
  • Зависимости хранились в приватном репозитории JFrog Artifactory (режим PyPI remote repository). Это давало:
    • Кэширование публичных пакетов.
    • Единую точку контроля и аудита.
    • Возможность размещения приватных библиотек.
  • Пример команды установки:
    pip install --trusted-host artifactory.mycompany.com 
    --index-url https://artifactory.mycompany.com/artifactory/api/pypi/pypi-remote/simple 
    -r requirements.txt

3. Контейнерные образы (Docker):

  • Использовали приватный Harbor registry.
  • Все базовые образы (например, ubuntu:20.04, python:3.9-slim) проксировались через Harbor, что позволяло контролировать их версии и сканировать на уязвимости (Trivy).
  • В CI/CD пайплайне (GitLab CI) этап сборки всегда начинался с docker pull из нашего Harbor, а итоговый образ пушился туда же.

4. Инфраструктура как код (Terraform):

  • Провайдеры Terraform (например, aws, google) и их версии фиксировались в блоке terraform {...} и загружались из внутреннего сетевого хранилища.

Итог: Такой подход минимизировал зависимость от внешних сетей, обеспечивал безопасность цепочки поставок (Supply Chain Security) и гарантировал, что любая сборка или развертывание были полностью воспроизводимы.