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

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

Ответ

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

Для контейнеризированных приложений:

  • Многоступенчатые Docker-сборки (multi-stage builds) для минимизации финального образа. Исходные зависимости копировались на этапе builder, а в итоговый образ попадали только скомпилированные артефакты.
  • Локальный кэш зависимостей монтировался как volume в CI-агентах (~/.m2, ~/.npm, ~/.cache/go/pkg) для ускорения сборок.

Для управления зависимостями:

  • Фиксация версий: Использовали package-lock.json (npm), Gemfile.lock (Ruby), requirements.txt с точными версиями (Python) или go.sum (Go). Эти файлы обязательно коммитились в репозиторий.
  • Прокси-репозитории: Все внешние зависимости проксировались через корпоративный Artifactory. В CI-скриптах и конфигурациях сборщиков (.npmrc, settings.xml для Maven) были прописаны URL-ы этого артефактори.
  • Приватные зависимости: Внутренние библиотеки публиковались в тот же Artifactory. Для доступа CI-джобов использовались заранее настроенные учетные данные (например, через Jenkins Credentials или GitLab CI Variables типа NPM_AUTH_TOKEN).

Для инфраструктуры как код (IaC):

  • Terraform модули хранились в отдельных Git-репозиториях и подключались по Git-ссылке с указанием тега версии.
  • Провайдеры Terraform кэшировались в локальном кэше на CI-раннерах после первой загрузки.

Контроль безопасности:

  • В пайплайн была интегрирована стадия dependency scanning с помощью Trivy или GitLab Dependency Scanning для выявления уязвимостей в зависимостях.
  • Для Java/Maven проектов использовали OWASP Dependency-Check.

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