Gradle та же контрольная сумма для повторной сборки - PullRequest
0 голосов
/ 26 октября 2018

Я строю Java-проект с Gradle и хочу опубликовать файлы контрольной суммы вместе с артефактами моей сборки.Проблема в том, что повторные сборки генерируют разные контрольные суммы без каких-либо изменений кода.Потратив некоторое время на поиски проблемы, причина стала совершенно очевидной:

  1. Сгенерированные файлы классов получают метку времени создания / изменения того времени, в которое они были созданы ( отличная находка !! )
  2. Эта дата изменения добавляется в качестве метаданных в сгенерированные архивы jar / zip, что приводит к различиям в контрольной сумме

То есть практически невозможно восстановить определенную версиюв более поздний момент времени будут выводиться идентичные файлы.

Я думаю, что это довольно легко "исправить", изменив дату модификации / создания артефактов после создания на некоторое значение по умолчанию.Но это привело бы к каким-то странным метаданным в архивах - что-то вроде 1970-01-01T00:00:00Z было бы совершенно очевидно, но на первый взгляд все еще сбивало с толку.

Есть ли другой способ, возможно, полностью исключить метаданные меток времени при созданиииз архивов.Или удалить его после создания архивов?

Или, может быть, есть какой-нибудь другой способ заставить повторные сборки генерировать идентичных артефактов?

Мне действительно интересно, чтолучшая практика для этого сценария?!

1 Ответ

0 голосов
/ 26 октября 2018

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

Вам нужно настроить свои проекты так:

tasks.withType(AbstractArchiveTask) {
    preserveFileTimestamps = false
    reproducibleFileOrder = true
}

Похоже, есть даже плагин, который настраивает его для вас, хотя он больше не активен: https://github.com/Johni0702/gradle-reproducible-builds-plugin

...