Воспроизводимые сборки с помощью jlink

#java #jlink #binary-reproducibility

#java #jlink ( ссылка ) #двоичный файл-воспроизводимость #jlink

Вопрос:

Уменьшенный JDK (созданный с помощью jlink ) является частью нашего приложения. Требуемые модули для образа JDK редко меняются. К сожалению, создание нового образа JDK (с точно такими же jlink параметрами) приводит к разным результатам, поэтому клиентам приходится загружать один и тот же файл снова и снова во время дифференциального обновления без необходимости.

Вот PoC:

 $ mkdir jdk-15a jdk-15b
$ tar xzf openjdk-15_linux-x64_bin.tar.gz --directory jdk-15a/
$ tar xzf openjdk-15_linux-x64_bin.tar.gz --directory jdk-15b/
$ jdk-15a/jdk-15/bin/jlink --compress=1 --module-path jdk-15a/jdk-15/jmods --add-modules java.base,jdk.management,jdk.unsupported,jdk.charsets --output output01
$ jdk-15b/jdk-15/bin/jlink --compress=1 --module-path jdk-15b/jdk-15/jmods --add-modules java.base,jdk.management,jdk.unsupported,jdk.charsets --output output02
$ md5sum output*/lib/modules
9ae5ae63df59593a0892c5ed411d7e59  output01/lib/modules
24b4af31553670799ab286ad1186329e  output02/lib/modules
  

(Я использую каталоги jdk-15a и jdk-15b , аналогичные экземплярам JDK, на нескольких серверах сборки.)

Есть ли какой-либо способ получить побайтно идентичный вывод (воспроизводимую сборку) из jlink в этом случае?

Используемая версия JDK:

 $ cat jdk-15a/jdk-15/release 
IMPLEMENTOR="Oracle Corporation"
JAVA_VERSION="15"
JAVA_VERSION_DATE="2020-09-15"
...
OS_ARCH="x86_64"
OS_NAME="Linux"
SOURCE=".:hg:e3f940bd3c8f"
  

Комментарии:

1. Существует JDK-8241602 , который утверждает, что он исправлен в jdk-15 build 22. Какую версию вы используете?

2. @Marcono1234: Спасибо за ссылку! Это сборка 36 (2020/8/11). Должен ли я сообщать об этом как о регрессии?

3. Да, я думаю, было бы хорошо, если бы вы это сделали. Я также немного смущен их исправлением для JDK-8241602, поскольку оно, похоже, на самом деле не решает основную проблему (коллекция не упорядочивается?).

4. Хорошо, я сообщил о bugreport.java.com .

5. Отлично, не могли бы вы, пожалуйста, обновить этот вопрос, как только будет создан общедоступный отчет об ошибке.

Ответ №1:

Это ошибка JDK, о которой сообщается в JDK-8252730.