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

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

Ответ

Выбор инструмента сборки (build tool) — это компромисс между стандартами экосистемы, производительностью и требованиями проекта. Я руковожусь следующими принципами:

1. Стандарт экосистемы — приоритет. Это минимизирует время на онбординг новых разработчиков.

  • Java/Kotlin: Gradle. Он гибче и быстрее Maven за счёт инкрементальных сборок и кэширования. Использую Maven только для legacy-проектов.
  • JavaScript/TypeScript: npm или yarn (classic). Yarn v1 был предпочтительнее из-за lock-файлов, но сейчас npm тоже их имеет. Выбор зависит от команды.
  • Go: Встроенный go build. Для сложных сценариев — Makefile.
  • C/C++: CMake как кроссплатформенный стандарт.

2. Производительность и кэширование. Для больших монолитов или монорепозиториев это критично. Например, Gradle Build Cache или Bazel (который строит граф зависимостей на уровне файлов) могут сократить время сборки с десятков минут до секунд для нефункциональных изменений.

3. Интеграция с CI/CD. Инструмент должен легко запускаться в контейнере, поддерживать кэширование зависимостей и артефактов. В конфигурации пайплайна я явно указываю шаги для кэша:

# Пример для Gradle в GitLab CI
cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - .gradle/caches
    - .gradle/wrapper
build:
  script:
    - ./gradlew assemble --build-cache

4. Воспроизводимость. Обязательно фиксирую версию самого инструмента сборки (Gradle Wrapper, .nvmrc для Node.js) и все зависимости (через lock-файлы: package-lock.json, gradle.lockfile). Это гарантирует, что сборка на машине разработчика и в CI идентичны.

Пример: Для нового микросервиса на Spring Boot мой выбор — Gradle + Docker multi-stage build. Gradle собирает JAR, а Dockerfile создаёт минимальный образ на основе openjdk:17-alpine.