Глава 31. Сравнение сборок.

Поддержка сравнения сборок - инкубационная функция. Это означает, что она незаконченая и все еще не соответствует качеству Gradle. Это также означает, что эта глава все еще в разработке.

Gradle предоставляет поддержку сравнения результатов (например, полученных двоичных архивов) двух сборок. Есть несколько причин, по которым вам может понадобиться сравнение результатов двух сборок. Вам может понадобиться сравнить:

  • Сборку с более новой, по сравнению с используемой, версией Gradle (т.е. обновление версии Gradle).
  • Сборку Gradle со сборкой, выполненной другим иструментом, таким как Apache Ant, Apache Maven или каким-либо еще (т.е. переход на Gradle).
  • Одну и ту же сборку Gradle, на одной той же версии, но только до и после изменения самой сборки (т.е. проверка изменений сборки).

Сравнив сборки в эти сценариях, вы можете принять обоснованное решение об обновлении Gradle, переходе на него или изменении сборки, поняв различия в результатах. После сравнения, выдается HTML-отчет, в общих чертах показывающий какие результаты идентичны и указывающий различия между неидентичными.

31.1. Определение терминов.

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

'Сборка'

В контексте сравнения, сборка не обязательно сборка Gradle. Это может быть любой исполняемый 'процесс', который дает видимый 'результат'. Как минимум одна из сборок в сравнении будет сборкой Gradle.

'Результат сборки'

Нечто наблюдаемое во время сборки, такое как создание zip-файла или тестовый запуск. Это вещи, которые можно сравнить.

'Исходная сборка'

Сборка, с которой будут сравниваться, обычно сборка в ее 'текущем' состоянии. Другими словами, левая часть сравнения.

'Целевая сборка'

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

'Ведущая сборка'

Сборка Gradle, которая выполняет процесс сравнения. Это может быть тот же проект что и у 'целевой' или 'исходной' сборки или совершенно отдельный проект. Версия Gradle необязательно совпадать с версией 'исходной' или 'целевой' сборок. Ведущая сборка должна быть запущена с Gradle 1.2 или новее.

'Сравнимый результат сборки'

Результаты сборки, которые могут быть логически равны в 'исходной' и 'целевой' сборках и, таким образом, сравнимые.

'Несравниваемый результат сборки'

Результат сборки несравниваемый, если логический эквивалент другой сборки не может быть найден (например, сборка выдает zip-файл, тогда как другая не выдает).

'Неизвестный результат сборки'

Результат сборки не может быть разобран ведущей сборкой. Такое может случиться, когда исходная или целевая сборка используют версию Gradle новее, чем ведущая и в такой версии Gradle появились новые типы результатов. Неизвестный результат сборки можно сравнить до той степени, до какой может быть распознан логический эквивалент неизвестного результата другой сборки, но никакого содержательного сравнения чем является результат, невозможно выполнить. Использование последней версии Gradle для ведущей сборки позволит избежать таких случаев.

31.2. Текущие возможности.

Так как эта возможность инкубационная, ограниченный набор конечной функциональности реализован к сегодняшнему моменту.

31.2.1. Поддерживаемые сборки.

На данный момент поддерживается сравнение только сборок Gradle. Обе сборки, исходная и целевая, должны выполняться с Gradle версии 1.0 или новее. Ведущая сборка должна быть как минимум версии 1.2. Если ведущая сборка запущена с версией 3.0 или новее, исходная и целевая должны быть как минимум версии 1.2. Если ведущая сборка запущена с версией ниже 2.0, исходная и целевая должны быть ниже 3.0. Так, например, если вы хотите сравнить сборку версии 1.1 со сборкой версии 3.0, вы должны запустить ведущую сборка с версией 2.х.

Будущие версии предоставять поддержку выполнения сборок из других систем сборка, таких как Apache Ant или Apache Maven, наряду с поддержкой выполнения произвольных процессов (например, сборки, основанные на скриптах оболочки командной строки).

31.2.2. Поддерживаемые результаты сборки.

На данный момент поддерживается сравнение только zip-архивов. Сюда включаются jar-, war- и ear-архивы.

Будущие версии предоставят поддержку сравнения таких результатов, как тестовое выполнение (т.е. какие тесты завершились успешно, какие с ошибкой и т.д.).

31.3. Сравнение сборок Gradle.

Плагин compare-gradle-builds можно использовать для облегчения сравнения двух сборок Gradle. Плагин добавляет задачу CompareGradleBuilds с именем 'compareGradleBuilds' к проекту. Конфигурация этой задачи определяет что будет сравниваться. По умолчанию, она настроена для сравнения текущей сборка с самой собой с использованием текущей версии Gradle, выполняя задачи: 'clean assemble'.

apply plugin: 'compare-gradle-builds'
	  

Сравниваемые элементы можно изменить.

compareGradleBuilds {
    sourceBuild {
        projectDir "/projects/project-a"
        gradleVersion "1.1"
    }
    targetBuild {
        projectDir "/projects/project-b"
        gradleVersion "1.2"
    }
}
          

В примере выше сравниваются два различных проекта, использующих разные версии Gradle.

31.3.1. Проба обновлений Gradle.

Вы можете использовать функциональность сравнения сборок для того, чтобы быстро опробировать новую версию Gradle с вашей сборкой.

Чтобы протестировать вашу текущую сборку с другой версией Gradle, просто добавьте следующее в файл build.gradle корневого проекта.

apply plugin: 'compare-gradle-builds'

compareGradleBuilds {
    targetBuild.gradleVersion = "«gradle version»"
}
	  

Потом останется только выполнить задачу compareGradleBuilds. Вы увидите вывод на консоль 'исходной' и 'целевой' сборок во время их выполнения.

31.3.2. 'Итог' сравнения.

Если есть хоть малейшее различие между сравниваемыми результатам, задача завершится с ошибкой. Будет выдано расположение HTML-отчета с итогом. Если все сравниваемые результаты идентичны и нет результатов, которые еще не сравнивались, и нет неизвестных результатов сборки, задача завершится успешно.

Вы можете настроить задачу так, чтобы она не завершалась с ошибкой при нахождении различий между результатами. Для этого установите свойство ignoreFailures в true.

compareGradleBuilds {
    ignoreFailures = true
}
	  

31.3.3. Какие архивы сравниваются.

Чтобы архив мог быть кандидатом на сравнение, он должен быть добавлен как артефакт конфигурации архивов. Чтобы узнать больше о настройке и добавлении артефактов, смотрите Главу 32 Публикация артефактов.

Также архив должен быть создан одной из задач - Zip, Jar, War, Ear. Будущие версии Gradle будут поддерживать гораздо большую гибкость в этой области.