Настройка для воспроизводимых сборок
Что такое воспроизводимые сборки?
Воспроизводимые сборки - это набор практик разработки программного обеспечения, которые создают поддающийся независимой проверке путь от исходного кода до двоичного кода. Сборка является воспроизводимой, если ей задан тот же исходный код, среда сборки и инструкции сборки, любая сторона может воссоздать побитовые идентичные копии всех указанных артефактов.
Как настроить сборку Maven?
Необходимые условия для версии Maven отсутствуют. Все происходит на уровне плагина:
- Обновите свои плагины до воспроизводимых версий, в частности maven-jar-plugin, maven-source-plugin и maven-assembly-plugin, до версии минимум 3.2.0.
- Добавьте свойство project.build.outputTimestamp в pom.xml проекта со значением отметки времени, которое будет использоваться в архивах zip / jar / tar (см. FAQ для будущей стратегии обновления значений):
<properties>
<project.build.outputTimestamp>2019-10-02T08:04:00Z</project.build.outputTimestamp>
</properties>
Вы настроили основы. Теперь результат должен быть воспроизводимым.
Как проверить и исправить воспроизводимость моей сборки Maven
Используя цель buildinfo maven-artifact-plugin, вы можете проверить, что вторая сборка вашего проекта дает тот же результат, что и исходная сборка:
- Собрать и установить свой проект: mvn clean install -e -DskipTests (не стесняйтесь настраивать аргументы, чтобы они лучше соответствовали вашему проекту)
- Пересоберите (без установки) и сверьтесь с предыдущей установкой: mvn clean verify -e -DskipTests artifact:buildinfo -Dreference.repo=central
Цель buildinfo во втором запуске вычислит отпечатки пальцев (fingerprints) для выходных данных второй сборки, затем сравнит их с эталонной сборкой, установленной при первом запуске, и отобразит результат сравнения.
Если что-то по-прежнему не воспроизводится:
- Использовать diffoscope что бы найти нестабильный результат. Цель artifact: buildinfo предлагает команду с путем к файлам: просто скопируйте / вставьте для запуска.
- Найдите плагин, который сгенерировал этот вывод.
- Проверьте, доступна ли воспроизводимая версия плагина. Если нет, откройте проблему, чтобы помочь разработчикам плагинов улучшить поддержку воспроизводимых сборок на каждом уровне плагина..
Примечание: воспроизводимые сборки для Maven:
- Не требовать диапазонов версий в зависимостях,
- Обычно дают разные результаты в Windows и Unix из-за разных символов новой строки. (перевод строки возврата каретки в Windows, перевод строки в Unix)
- Обычно зависит от основной версии JDK, используемой для компиляции. (Даже с определенным источником / целью каждая основная версия JDK изменяет сгенерированный байт-код)
Подробные объяснения см. На странице Wiki Maven «Воспроизводимые / проверяемые сборки».
Сколько проектов можно воспроизводить?
Вы можете заглянуть в Reproducible Central, чтобы узнать, какие выпуски проектов были проверены как воспроизводимые, путем перестройки независимо от эталонной сборки, опубликованной в Central Repository. Вы также можете сами проверить, можете ли вы перестроить локально и получить тот же результат.
FAQ
Q. Может ли свойство project.build.outputTimestamp в pom.xml обновляться автоматически во время выпуска?
A. Да.
Детали зависят от вашего инструментария процесса выпуска:
-
если вы используете maven-release-plugin, вам понадобится версия 3.0.0-M1 или более поздняя: она автоматически обновит значение отметки времени в pom.xml во время выпуска в том же коммите, который обновляет версию,
-
если у вас есть настраиваемый инструмент для процесса выпуска, вам необходимо добавить эту функцию в свой инструмент для выпуска.
Не стесняйтесь делиться своими вопросами или решениями в списке рассылки пользователей.
Q. Какие дополнительные плагины необходимо обновить для воспроизводимых сборок?
A. Вот упрощенный список:
plugin | minimum version | comments |
---|---|---|
maven-assembly-plugin | 3.2.0 | |
maven-jar-plugin | 3.2.0 | |
maven-ejb-plugin | 3.1.0 | |
maven-javadoc-plugin | 3.2.0 | |
maven-plugin-plugin | 3.5.1 | |
maven-remote-resources-plugin | 1.7.0 | |
maven-shade-plugin | 3.2.3 | |
maven-site-plugin | 3.9.0 | |
maven-source-plugin | 3.2.1 | |
maven-war-plugin | 3.3.1 | |
plexus-component-metadata | 2.1.0 | |
bnd-maven-plugin | see configuration instructions | |
Apache Felix maven-bundle-plugin | manifest goal requires <_removeheaders>Bnd-LastModified</_removeheaders> as configuration instructions, and bundle goal requires <_reproducible>true (see FELIX-6304) |
|
springboot-maven-plugin | 2.3.0-M4 | еще не для войны (потому что maven-war-plugin еще не в порядке) |