View on GitHub

blog

Настройка для воспроизводимых сборок

Что такое воспроизводимые сборки?

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

Как настроить сборку Maven?

Необходимые условия для версии Maven отсутствуют. Все происходит на уровне плагина:

  1. Обновите свои плагины до воспроизводимых версий, в частности maven-jar-plugin, maven-source-plugin и maven-assembly-plugin, до версии минимум 3.2.0.
  2. Добавьте свойство 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, вы можете проверить, что вторая сборка вашего проекта дает тот же результат, что и исходная сборка:

  1. Собрать и установить свой проект: mvn clean install -e -DskipTests (не стесняйтесь настраивать аргументы, чтобы они лучше соответствовали вашему проекту)
  2. Пересоберите (без установки) и сверьтесь с предыдущей установкой: mvn clean verify -e -DskipTests artifact:buildinfo -Dreference.repo=central

Цель buildinfo во втором запуске вычислит отпечатки пальцев (fingerprints) для выходных данных второй сборки, затем сравнит их с эталонной сборкой, установленной при первом запуске, и отобразит результат сравнения.

Если что-то по-прежнему не воспроизводится:

  1. Использовать diffoscope что бы найти нестабильный результат. Цель artifact: buildinfo предлагает команду с путем к файлам: просто скопируйте / вставьте для запуска.
  2. Найдите плагин, который сгенерировал этот вывод.
  3. Проверьте, доступна ли воспроизводимая версия плагина. Если нет, откройте проблему, чтобы помочь разработчикам плагинов улучшить поддержку воспроизводимых сборок на каждом уровне плагина..

Примечание: воспроизводимые сборки для Maven:

Подробные объяснения см. На странице Wiki Maven «Воспроизводимые / проверяемые сборки».

Сколько проектов можно воспроизводить?

Вы можете заглянуть в Reproducible Central, чтобы узнать, какие выпуски проектов были проверены как воспроизводимые, путем перестройки независимо от эталонной сборки, опубликованной в Central Repository. Вы также можете сами проверить, можете ли вы перестроить локально и получить тот же результат.

FAQ

Q. Может ли свойство project.build.outputTimestamp в pom.xml обновляться автоматически во время выпуска?

A. Да.

Детали зависят от вашего инструментария процесса выпуска:

Не стесняйтесь делиться своими вопросами или решениями в списке рассылки пользователей.

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 еще не в порядке)