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

«Какие задачи выполняются при сборке проекта с помощью Gradle?» — вопрос из категории Системы сборки, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Gradle выполняет последовательность задач (tasks), определенных в скрипте сборки (build.gradle или build.gradle.kts). Основные этапы и задачи:

  1. Инициализация (Initialization): Определяет, является ли проект частью мультипроектной сборки, и настраивает экземпляры Project.
  2. Конфигурация (Configuration): Выполняет скрипт сборки, конфигурирует задачи и зависимости между ними. Загружаются зависимости для конфигурации.
  3. Выполнение (Execution): Запускаются задачи, указанные в командной строке, и все от которых они зависят.

Ключевые задачи в жизненном цикле Java-проекта:

  • compileJava — компиляция исходного кода Java.
  • processResources — копирование ресурсов в выходную директорию классов.
  • classes — агрегирующая задача для compileJava и processResources.
  • testClasses — подготавливает классы для тестов.
  • test — запускает модульные тесты (например, с использованием JUnit или TestNG).
  • jar — собирает JAR-артефакт из скомпилированных классов и ресурсов.
  • assemble — собирает все артефакты проекта (JAR, WAR и т.д.), но не запускает тесты.
  • build — полная сборка проекта (assemble + test).
  • clean — удаляет выходные директории сборки.

Пример для QA: В проекте с автотестами часто создают кастомные задачи, например, для запуска набора интеграционных тестов или генерации отчетов Allure.

// Пример build.gradle для Java-проекта с тестами
test {
    useJUnitPlatform()
    testLogging {
        events "passed", "skipped", "failed"
    }
}

// Задача для запуска API-тестов из отдельной директории
task apiTest(type: Test) {
    description = 'Runs API tests.'
    group = 'verification'
    testClassesDirs = sourceSets.apiTest.output.classesDirs
    classpath = sourceSets.apiTest.runtimeClasspath
}