This is a work item for EPIC https://github.com/AdoptOpenJDK/openjdk-build/issues/2522.
The aim being to "prototype" an initial attempt at being able to "recreate" an Adopt build based on specifying the basic "build info" currently available for an existing "release", and assuming the current available "infra" setup.
Assumptions for 1st prototype:
Spec:
Extend the current openjdk-pipeline & build jobs to take as extra inputs basic "build info":
The Jenkins build jobs are currently "generated" whenever openjdk-build or ci-jenkins-pipelines changes occur. The contents of these jobs also contain an extended amount of JSON configuration/settings, both the job parameters and the JSON settings are specific to the build setup at the time of the release/build.
It thus makes sense to architect the prototype as a two step process:
So utilizing the Adopt Build job USER build scripts settings to point at a SHA of a level of the openjdk-build scripts you want to use (eg.January 19th CPU Update), is quite easy to do. Here is a build of January jdk-11.0.10+9 Hotspot Release: https://ci.adoptopenjdk.net/job/build-scripts/job/jobs/job/jdk11u/job/jdk11u-linux-x64-hotspot/960/parameters/
So this is a re-build using the january build scripts of the january source tag, using the current infrastructure and tooling.
Q: Is this "reproduced"? A: Maybe!
In reality all this has done has re-built that source SHA using the current infrastructure and tooling levels. So as such, it's probably using different versions of numerous dependencies, especially for non-container build platforms.
The build above was on xLinux, so the build container it was using was from the current adoptopenjdk/centos6_build_image image. Improvement could be achieved if we cached along side each release we mark as reproducible the docker build images used to build them, so that would improve reproducibility of platforms:
Docker does have its limitations however, the use of dockerhub is one potential security exposure, with the reliance of storing/pulling images to build a secure JDK over the internet, not ideal.
Also Docker is not available on AIX.
An alternative approach maybe "cross-compiling" type setup, whereby the system dependency set is fixed through a defined location.
Rebuilding Jan CPU Update with the current Jenkins job:
{
"ARCHITECTURE": "x64",
"TARGET_OS": "linux",
"VARIANT": "hotspot",
"JAVA_TO_BUILD": "jdk11u",
"TEST_LIST": [
"sanity.openjdk",
"sanity.system",
"extended.system",
"sanity.perf",
"sanity.external"
],
"SCM_REF": "jdk-11.0.10+9_adopt",
"BUILD_ARGS": "",
"NODE_LABEL": "build&&linux&&x64",
"ADDITIONAL_TEST_LABEL": "",
"KEEP_TEST_REPORTDIR": false,
"ACTIVE_NODE_TIMEOUT": "",
"CODEBUILD": false,
"DOCKER_IMAGE": "adoptopenjdk/centos6_build_image@sha256:5655c9a66f4528210e307d033024bd65f5f736eac401fdeaed9dbc903b629a0c",
"DOCKER_NODE": "",
"DOCKER_REGISTRY": "",
"DOCKER_CREDENTIAL": "",
"PLATFORM_CONFIG_LOCATION": "AdoptOpenJDK/openjdk-build/master/build-farm/platform-specific-configurations",
"CONFIGURE_ARGS": "--enable-dtrace=auto",
"OVERRIDE_FILE_NAME_VERSION": "",
"USE_ADOPT_SHELL_SCRIPTS": false,
"RELEASE": true,
"PUBLISH_NAME": "jdk-11.0.10+9",
"ADOPT_BUILD_NUMBER": "",
"ENABLE_TESTS": false,
"ENABLE_INSTALLERS": true,
"ENABLE_SIGNER": true,
"CLEAN_WORKSPACE": true,
"CLEAN_WORKSPACE_AFTER": true,
"CLEAN_WORKSPACE_BUILD_OUTPUT_ONLY_AFTER": false
}
DEFAULTS_JSON:
"defaultsUrl": "https://raw.githubusercontent.com/andrew-m-leonard/ci-jenkins-pipelines/myrepo/pipelines/defaults.json"
In the "defaultsUrl" location:
"repository" : {
"build_url" : "https://github.com/AdoptOpenJDK/openjdk-build.git",
"build_branch" : "ea53ac3d1623de5ecefdcd9aee3379a776be84b2",
build_branch SHA is of the openjdk-build scripts commit used to build Jan CPU update.
Note, DOCKER_IMAGE uses @sha256:56... SHA digest of docker image used to build. Didn't have the exact SHA digest, but this could be used if we did store it.
diffoscope of the original Release jdk.tar.gz and the Reproduced one, shows many differences, which is not surprising really, as things like timestamps are different everywhere, also any filelists or zip contents(eg.jmods) have files in different orders.
However, doing a high level look at the folders and libs, it seems identical,eg:
Original "lib":
-rw-r--r-- 1 andrewleonard staff 38933 20 Jan 12:17 classlist
-rw-r--r-- 1 andrewleonard staff 4496469 20 Jan 12:17 ct.sym
-rwxr-xr-x 1 andrewleonard staff 13040 20 Jan 12:17 jexec
drwxr-xr-x 4 andrewleonard staff 128 20 Jan 12:17 jfr
drwxr-xr-x 3 andrewleonard staff 96 20 Jan 12:17 jli
-rw-r--r-- 1 andrewleonard staff 106676 20 Jan 12:17 jrt-fs.jar
-rwxr-xr-x 1 andrewleonard staff 18408 20 Jan 12:17 jspawnhelper
-rw-r--r-- 1 andrewleonard staff 29 20 Jan 12:17 jvm.cfg
-rw-r--r-- 1 andrewleonard staff 13344 20 Jan 12:17 libattach.so
-rw-r--r-- 1 andrewleonard staff 752736 20 Jan 12:17 libawt.so
-rw-r--r-- 1 andrewleonard staff 44728 20 Jan 12:17 libawt_headless.so
-rw-r--r-- 1 andrewleonard staff 484632 20 Jan 12:17 libawt_xawt.so
-rw-r--r-- 1 andrewleonard staff 28216 20 Jan 12:17 libdt_socket.so
-rw-r--r-- 1 andrewleonard staff 12992 20 Jan 12:17 libextnet.so
-rw-r--r-- 1 andrewleonard staff 67984 20 Jan 12:17 libfontmanager.so
-rw-r--r-- 1 andrewleonard staff 1888936 20 Jan 12:17 libharfbuzz.so
-rw-r--r-- 1 andrewleonard staff 51512 20 Jan 12:17 libinstrument.so
-rw-r--r-- 1 andrewleonard staff 47496 20 Jan 12:17 libj2gss.so
-rw-r--r-- 1 andrewleonard staff 18024 20 Jan 12:17 libj2pcsc.so
-rw-r--r-- 1 andrewleonard staff 88992 20 Jan 12:17 libj2pkcs11.so
-rw-r--r-- 1 andrewleonard staff 8064 20 Jan 12:17 libjaas.so
-rw-r--r-- 1 andrewleonard staff 214128 20 Jan 12:17 libjava.so
-rw-r--r-- 1 andrewleonard staff 262728 20 Jan 12:17 libjavajpeg.so
-rw-r--r-- 1 andrewleonard staff 7984 20 Jan 12:17 libjawt.so
-rw-r--r-- 1 andrewleonard staff 282752 20 Jan 12:17 libjdwp.so
-rw-r--r-- 1 andrewleonard staff 596448 20 Jan 12:17 libjimage.so
-rw-r--r-- 1 andrewleonard staff 13248 20 Jan 12:17 libjsig.so
-rw-r--r-- 1 andrewleonard staff 82936 20 Jan 12:17 libjsound.so
-rw-r--r-- 1 andrewleonard staff 576856 20 Jan 12:17 liblcms.so
-rw-r--r-- 1 andrewleonard staff 26128 20 Jan 12:17 libmanagement.so
-rw-r--r-- 1 andrewleonard staff 8040 20 Jan 12:17 libmanagement_agent.so
-rw-r--r-- 1 andrewleonard staff 33744 20 Jan 12:17 libmanagement_ext.so
-rw-r--r-- 1 andrewleonard staff 585064 20 Jan 12:17 libmlib_image.so
-rw-r--r-- 1 andrewleonard staff 111792 20 Jan 12:17 libnet.so
-rw-r--r-- 1 andrewleonard staff 88120 20 Jan 12:17 libnio.so
-rw-r--r-- 1 andrewleonard staff 8224 20 Jan 12:17 libprefs.so
-rw-r--r-- 1 andrewleonard staff 7744 20 Jan 12:17 librmi.so
-rw-r--r-- 1 andrewleonard staff 55664 20 Jan 12:17 libsaproc.so
-rw-r--r-- 1 andrewleonard staff 28960 20 Jan 12:17 libsctp.so
-rw-r--r-- 1 andrewleonard staff 373816 20 Jan 12:17 libsplashscreen.so
-rw-r--r-- 1 andrewleonard staff 776960 20 Jan 12:17 libsunec.so
-rw-r--r-- 1 andrewleonard staff 672416 20 Jan 12:17 libunpack.so
-rw-r--r-- 1 andrewleonard staff 81432 20 Jan 12:17 libverify.so
-rw-r--r-- 1 andrewleonard staff 37616 20 Jan 12:17 libzip.so
-rw-r--r-- 1 andrewleonard staff 142006963 20 Jan 12:17 modules
-rw-r--r-- 1 andrewleonard staff 3793 20 Jan 12:17 psfont.properties.ja
-rw-r--r-- 1 andrewleonard staff 11390 20 Jan 12:17 psfontj2d.properties
drwxr-xr-x 6 andrewleonard staff 192 20 Jan 12:17 security
drwxr-xr-x 5 andrewleonard staff 160 20 Jan 12:17 server
-rw-r--r-- 1 andrewleonard staff 58148661 20 Jan 12:17 src.zip
-rw-r--r-- 1 andrewleonard staff 107853 20 Jan 12:17 tzdb.dat
Reproduced "lib":
-rw-r--r-- 1 andrewleonard staff 38933 30 Apr 11:07 classlist
-rw-r--r-- 1 andrewleonard staff 4496469 30 Apr 11:07 ct.sym
-rwxr-xr-x 1 andrewleonard staff 13040 30 Apr 11:07 jexec
drwxr-xr-x 4 andrewleonard staff 128 30 Apr 11:07 jfr
drwxr-xr-x 3 andrewleonard staff 96 30 Apr 11:07 jli
-rw-r--r-- 1 andrewleonard staff 106676 30 Apr 11:07 jrt-fs.jar
-rwxr-xr-x 1 andrewleonard staff 18408 30 Apr 11:07 jspawnhelper
-rw-r--r-- 1 andrewleonard staff 29 30 Apr 11:07 jvm.cfg
-rw-r--r-- 1 andrewleonard staff 13344 30 Apr 11:07 libattach.so
-rw-r--r-- 1 andrewleonard staff 752736 30 Apr 11:07 libawt.so
-rw-r--r-- 1 andrewleonard staff 44728 30 Apr 11:07 libawt_headless.so
-rw-r--r-- 1 andrewleonard staff 484632 30 Apr 11:07 libawt_xawt.so
-rw-r--r-- 1 andrewleonard staff 28216 30 Apr 11:07 libdt_socket.so
-rw-r--r-- 1 andrewleonard staff 12992 30 Apr 11:07 libextnet.so
-rw-r--r-- 1 andrewleonard staff 67984 30 Apr 11:07 libfontmanager.so
-rw-r--r-- 1 andrewleonard staff 1888936 30 Apr 11:07 libharfbuzz.so
-rw-r--r-- 1 andrewleonard staff 51512 30 Apr 11:07 libinstrument.so
-rw-r--r-- 1 andrewleonard staff 47496 30 Apr 11:07 libj2gss.so
-rw-r--r-- 1 andrewleonard staff 18024 30 Apr 11:07 libj2pcsc.so
-rw-r--r-- 1 andrewleonard staff 88992 30 Apr 11:07 libj2pkcs11.so
-rw-r--r-- 1 andrewleonard staff 8064 30 Apr 11:07 libjaas.so
-rw-r--r-- 1 andrewleonard staff 214128 30 Apr 11:07 libjava.so
-rw-r--r-- 1 andrewleonard staff 262728 30 Apr 11:07 libjavajpeg.so
-rw-r--r-- 1 andrewleonard staff 7984 30 Apr 11:07 libjawt.so
-rw-r--r-- 1 andrewleonard staff 282752 30 Apr 11:07 libjdwp.so
-rw-r--r-- 1 andrewleonard staff 596448 30 Apr 11:07 libjimage.so
-rw-r--r-- 1 andrewleonard staff 13248 30 Apr 11:07 libjsig.so
-rw-r--r-- 1 andrewleonard staff 82936 30 Apr 11:07 libjsound.so
-rw-r--r-- 1 andrewleonard staff 576856 30 Apr 11:07 liblcms.so
-rw-r--r-- 1 andrewleonard staff 26128 30 Apr 11:07 libmanagement.so
-rw-r--r-- 1 andrewleonard staff 8040 30 Apr 11:07 libmanagement_agent.so
-rw-r--r-- 1 andrewleonard staff 33744 30 Apr 11:07 libmanagement_ext.so
-rw-r--r-- 1 andrewleonard staff 585064 30 Apr 11:07 libmlib_image.so
-rw-r--r-- 1 andrewleonard staff 111792 30 Apr 11:07 libnet.so
-rw-r--r-- 1 andrewleonard staff 88120 30 Apr 11:07 libnio.so
-rw-r--r-- 1 andrewleonard staff 8224 30 Apr 11:07 libprefs.so
-rw-r--r-- 1 andrewleonard staff 7744 30 Apr 11:07 librmi.so
-rw-r--r-- 1 andrewleonard staff 55664 30 Apr 11:07 libsaproc.so
-rw-r--r-- 1 andrewleonard staff 28960 30 Apr 11:07 libsctp.so
-rw-r--r-- 1 andrewleonard staff 373816 30 Apr 11:07 libsplashscreen.so
-rw-r--r-- 1 andrewleonard staff 776960 30 Apr 11:07 libsunec.so
-rw-r--r-- 1 andrewleonard staff 672416 30 Apr 11:07 libunpack.so
-rw-r--r-- 1 andrewleonard staff 81432 30 Apr 11:07 libverify.so
-rw-r--r-- 1 andrewleonard staff 37616 30 Apr 11:07 libzip.so
-rw-r--r-- 1 andrewleonard staff 142006992 30 Apr 11:07 modules
-rw-r--r-- 1 andrewleonard staff 3793 30 Apr 11:07 psfont.properties.ja
-rw-r--r-- 1 andrewleonard staff 11390 30 Apr 11:07 psfontj2d.properties
drwxr-xr-x 6 andrewleonard staff 192 30 Apr 11:07 security
drwxr-xr-x 5 andrewleonard staff 160 30 Apr 11:07 server
-rw-r--r-- 1 andrewleonard staff 58148665 30 Apr 11:07 src.zip
-rw-r--r-- 1 andrewleonard staff 107853 30 Apr 11:07 tzdb.dat
The only two files differing in size are "modules" and "src.zip":
-rw-r--r-- 1 andrewleonard staff 142006963 20 Jan 12:17 modules
-rw-r--r-- 1 andrewleonard staff 58148661 20 Jan 12:17 src.zip
-rw-r--r-- 1 andrewleonard staff 142006992 30 Apr 11:07 modules
-rw-r--r-- 1 andrewleonard staff 58148665 30 Apr 11:07 src.zip
Some jmods Release vs Reproduce:
-rw-r--r-- 1 andrewleonard staff 21632332 20 Jan 12:17 java.base.jmod
-rw-r--r-- 1 andrewleonard staff 119087 20 Jan 12:17 java.compiler.jmod
-rw-r--r-- 1 andrewleonard staff 58585 20 Jan 12:17 java.datatransfer.jmod
-rw-r--r-- 1 andrewleonard staff 13577286 20 Jan 12:17 java.desktop.jmod
-rw-r--r-- 1 andrewleonard staff 416817 20 Jan 12:17 jdk.internal.vm.ci.jmod
-rw-r--r-- 1 andrewleonard staff 6178633 20 Jan 12:17 jdk.internal.vm.compiler.jmod
-rw-r--r-- 1 andrewleonard staff 20467 20 Jan 12:17 jdk.internal.vm.compiler.management.jmod
-rw-r--r-- 1 andrewleonard staff 21632178 30 Apr 11:07 java.base.jmod
-rw-r--r-- 1 andrewleonard staff 119087 30 Apr 11:07 java.compiler.jmod
-rw-r--r-- 1 andrewleonard staff 58585 30 Apr 11:07 java.datatransfer.jmod
-rw-r--r-- 1 andrewleonard staff 13577286 30 Apr 11:07 java.desktop.jmod
-rw-r--r-- 1 andrewleonard staff 416817 30 Apr 11:07 jdk.internal.vm.ci.jmod
-rw-r--r-- 1 andrewleonard staff 6178634 30 Apr 11:07 jdk.internal.vm.compiler.jmod
-rw-r--r-- 1 andrewleonard staff 20467 30 Apr 11:07 jdk.internal.vm.compiler.management.jmod
Minor size differences.
There are several important aspects of "Reproducibility" that all work together:
Leading on from the "import aspects", we ought to clarify the "Requirements" again with those aspects in mind, and also reproducible-builds.org "How?":
"validate that the output matches the original build":
Source of "build scripts", "tooling" and "dependencies" must be "trusted" and "verified"
Access to "infra" must be under "access control", and "audited"
All changes to "build-scripts", "tooling" and "dependency" servers must be "change controlled"
Prototype setting up a new ubuntu 20.04 jdk17 hotspot build environment within a docker container:
docker pull ubuntu:20.04
docker run -i -t <container ID> /bin/bash
root@06acd4f5d2a9:/# apt install git
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
ca-certificates git-man krb5-locales less libasn1-8-heimdal libbrotli1 libbsd0 libcbor0.6 libcurl3-gnutls libedit2 liberror-perl libexpat1
libfido2-1 libgdbm-compat4 libgdbm6 libgssapi-krb5-2 libgssapi3-heimdal libhcrypto4-heimdal libheimbase1-heimdal libheimntlm0-heimdal
libhx509-5-heimdal libk5crypto3 libkeyutils1 libkrb5-26-heimdal libkrb5-3 libkrb5support0 libldap-2.4-2 libldap-common libnghttp2-14 libperl5.30
libpsl5 libroken18-heimdal librtmp1 libsasl2-2 libsasl2-modules libsasl2-modules-db libsqlite3-0 libssh-4 libssl1.1 libwind0-heimdal libx11-6
libx11-data libxau6 libxcb1 libxdmcp6 libxext6 libxmuu1 netbase openssh-client openssl patch perl perl-modules-5.30 publicsuffix xauth
Suggested packages:
gettext-base git-daemon-run | git-daemon-sysvinit git-doc git-el git-email git-gui gitk gitweb git-cvs git-mediawiki git-svn gdbm-l10n krb5-doc
krb5-user libsasl2-modules-gssapi-mit | libsasl2-modules-gssapi-heimdal libsasl2-modules-ldap libsasl2-modules-otp libsasl2-modules-sql keychain
libpam-ssh monkeysphere ssh-askpass ed diffutils-doc perl-doc libterm-readline-gnu-perl | libterm-readline-perl-perl make libb-debug-perl
liblocale-codes-perl
The following NEW packages will be installed:
ca-certificates git git-man krb5-locales less libasn1-8-heimdal libbrotli1 libbsd0 libcbor0.6 libcurl3-gnutls libedit2 liberror-perl libexpat1
libfido2-1 libgdbm-compat4 libgdbm6 libgssapi-krb5-2 libgssapi3-heimdal libhcrypto4-heimdal libheimbase1-heimdal libheimntlm0-heimdal
libhx509-5-heimdal libk5crypto3 libkeyutils1 libkrb5-26-heimdal libkrb5-3 libkrb5support0 libldap-2.4-2 libldap-common libnghttp2-14 libperl5.30
libpsl5 libroken18-heimdal librtmp1 libsasl2-2 libsasl2-modules libsasl2-modules-db libsqlite3-0 libssh-4 libssl1.1 libwind0-heimdal libx11-6
libx11-data libxau6 libxcb1 libxdmcp6 libxext6 libxmuu1 netbase openssh-client openssl patch perl perl-modules-5.30 publicsuffix xauth
0 upgraded, 56 newly installed, 0 to remove and 0 not upgraded.
As you can see installing "git" alone installs 56 new pkgs, do we need to record all those?
We could install all the required dependencies, then simply "scan"/"list" ALL the pkgs and "record" those as "build info"? What does that achieve? Not sure it's reproducible, as not easy to re-build with that exact set of 100s of specific versions.
An excellent project working on and discussing various approaches and issues with reproducible builds: https://wiki.yoctoproject.org/wiki/Reproducible_Builds
From the evidence my thinking the difficulty in achieving "exact binary reproducibility" and keeping it there actually don't achieve enough benefit for the cost, the continual effort to fix upstream and other tooling products that might be introducing a single timestamp where you don't want it is simply not a useful use of effort. We ought to concentrate on the benefits that "reproducible builds" is aiming to achieve,eg.trusted supply chain.
As you can see installing "git" alone installs 56 new pkgs, do we need to record all those?
Since git is not directly used as part of the build itself (another git version will generally extract the same source, a different version of the build tools will not necessarily produce the same output) I'd tentatively say no (at least as a first pass) although recording all versions used for a build is probably useful.
openjdk16 at a minimum is required for "reproducible" Java apps, as prior to that things like jmods/jars had random "hashes"
strace -ff -e trace=openat cat /etc/vdpau_wrapper.cfg
openat(AT_FDCWD, “/etc/ld.so.cache”, O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, “/lib64/libc.so.6”, O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, “/usr/lib/locale/locale-archive”, O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, “/etc/vdpau_wrapper.cfg”, O_RDONLY) = 3
enable_flash_uv_swap=1
disable_flash_pq_bg_color=1
+++ exited with 0 +++
stap -e ‘probe syscall.open { printf (“UID %d: %s(%d) open (%s)\n”, uid(), execname(), pid(), argstr) }’
Tooling:
The following NEW packages will be installed:
binutils binutils-common binutils-x86-64-linux-gnu build-essential cpp cpp-9 dpkg-dev g++ g++-9 gcc gcc-9 gcc-9-base libasan5
libatomic1 libbinutils libc-dev-bin libc6-dev libcc1-0 libcrypt-dev libctf-nobfd0 libctf0 libdpkg-perl libgcc-9-dev libgomp1
libisl22 libitm1 liblsan0 libmpc3 libmpfr6 libquadmath0 libstdc++-9-dev libtsan0 libubsan1 linux-libc-dev make xz-utils
apt list -a
binutils-common/focal-updates,focal-security,now 2.34-6ubuntu1.1 amd64 [installed,automatic]
binutils-common/focal 2.34-6ubuntu1 amd64
binutils-x86-64-linux-gnu/focal-updates,focal-security,now 2.34-6ubuntu1.1 amd64 [installed,automatic]
binutils-x86-64-linux-gnu/focal 2.34-6ubuntu1 amd64
binutils/focal-updates,focal-security,now 2.34-6ubuntu1.1 amd64 [installed,automatic]
binutils/focal 2.34-6ubuntu1 amd64
build-essential/focal-updates,now 12.8ubuntu1.1 amd64 [installed]
build-essential/focal 12.8ubuntu1 amd64
cpp-9/focal-updates,focal-security,now 9.3.0-17ubuntu1~20.04 amd64 [installed,automatic]
cpp-9/focal 9.3.0-10ubuntu2 amd64
cpp/focal,now 4:9.3.0-1ubuntu2 amd64 [installed,automatic]
dpkg-dev/focal,now 1.19.7ubuntu3 all [installed,automatic]
g++-9/focal-updates,focal-security,now 9.3.0-17ubuntu1~20.04 amd64 [installed,automatic]
g++-9/focal 9.3.0-10ubuntu2 amd64
g++/focal,now 4:9.3.0-1ubuntu2 amd64 [installed,automatic]
gcc-9-base/focal-updates,focal-security,now 9.3.0-17ubuntu1~20.04 amd64 [installed,automatic]
gcc-9-base/focal 9.3.0-10ubuntu2 amd64
gcc-9/focal-updates,focal-security,now 9.3.0-17ubuntu1~20.04 amd64 [installed,automatic]
gcc-9/focal 9.3.0-10ubuntu2 amd64
gcc/focal,now 4:9.3.0-1ubuntu2 amd64 [installed,automatic]
libasan5/focal-updates,focal-security,now 9.3.0-17ubuntu1~20.04 amd64 [installed,automatic]
libasan5/focal 9.3.0-10ubuntu2 amd64
libatomic1/focal-updates,focal-security,now 10.2.0-5ubuntu1~20.04 amd64 [installed,automatic]
libatomic1/focal 10-20200411-0ubuntu1 amd64
libbinutils/focal-updates,focal-security,now 2.34-6ubuntu1.1 amd64 [installed,automatic]
libbinutils/focal 2.34-6ubuntu1 amd64
libc-dev-bin/focal-updates,now 2.31-0ubuntu9.2 amd64 [installed,automatic]
libc-dev-bin/focal 2.31-0ubuntu9 amd64
libc6-dev/focal-updates,now 2.31-0ubuntu9.2 amd64 [installed,automatic]
libc6-dev/focal 2.31-0ubuntu9 amd64
libcc1-0/focal-updates,focal-security,now 10.2.0-5ubuntu1~20.04 amd64 [installed,automatic]
libcc1-0/focal 10-20200411-0ubuntu1 amd64
libcrypt-dev/focal,now 1:4.4.10-10ubuntu4 amd64 [installed,automatic]
libctf-nobfd0/focal-updates,focal-security,now 2.34-6ubuntu1.1 amd64 [installed,automatic]
libctf-nobfd0/focal 2.34-6ubuntu1 amd64
libctf0/focal-updates,focal-security,now 2.34-6ubuntu1.1 amd64 [installed,automatic]
libctf0/focal 2.34-6ubuntu1 amd64
libdpkg-perl/focal,now 1.19.7ubuntu3 all [installed,automatic]
libgcc-9-dev/focal-updates,focal-security,now 9.3.0-17ubuntu1~20.04 amd64 [installed,automatic]
libgcc-9-dev/focal 9.3.0-10ubuntu2 amd64
libgomp1/focal-updates,focal-security,now 10.2.0-5ubuntu1~20.04 amd64 [installed,automatic]
libgomp1/focal 10-20200411-0ubuntu1 amd64
libisl22/focal,now 0.22.1-1 amd64 [installed,automatic]
libitm1/focal-updates,focal-security,now 10.2.0-5ubuntu1~20.04 amd64 [installed,automatic]
libitm1/focal 10-20200411-0ubuntu1 amd64
liblsan0/focal-updates,focal-security,now 10.2.0-5ubuntu1~20.04 amd64 [installed,automatic]
liblsan0/focal 10-20200411-0ubuntu1 amd64
libmpc3/focal,now 1.1.0-1 amd64 [installed,automatic]
libmpfr6/focal,now 4.0.2-1 amd64 [installed,automatic]
libquadmath0/focal-updates,focal-security,now 10.2.0-5ubuntu1~20.04 amd64 [installed,automatic]
libquadmath0/focal 10-20200411-0ubuntu1 amd64
libstdc++-9-dev/focal-updates,focal-security,now 9.3.0-17ubuntu1~20.04 amd64 [installed,automatic]
libstdc++-9-dev/focal 9.3.0-10ubuntu2 amd64
libtsan0/focal-updates,focal-security,now 10.2.0-5ubuntu1~20.04 amd64 [installed,automatic]
libtsan0/focal 10-20200411-0ubuntu1 amd64
libubsan1/focal-updates,focal-security,now 10.2.0-5ubuntu1~20.04 amd64 [installed,automatic]
libubsan1/focal 10-20200411-0ubuntu1 amd64
linux-libc-dev/focal-updates,focal-security,now 5.4.0-73.82 amd64 [installed,automatic]
linux-libc-dev/focal 5.4.0-26.30 amd64
make/focal,now 4.2.1-1.2 amd64 [installed,automatic]
xz-utils/focal-updates,now 5.2.4-1ubuntu1 amd64 [installed,automatic]
xz-utils/focal 5.2.4-1 amd64
The following NEW packages will be installed:
curl libcurl4
apt list -a
curl/focal-updates,focal-security,now 7.68.0-1ubuntu2.5 amd64 [installed]
curl/focal 7.68.0-1ubuntu2 amd64
libcurl4/focal-updates,focal-security,now 7.68.0-1ubuntu2.5 amd64 [installed,automatic]
libcurl4/focal 7.68.0-1ubuntu2 amd64
The following NEW packages will be installed:
autoconf libsigsegv2 m4
apt list -a
autoconf/focal,now 2.69-11.1 all [installed]
libsigsegv2/focal,now 2.12-2 amd64 [installed,automatic]
m4/focal,now 1.4.18-4 amd64 [installed,automatic]
The following NEW packages will be installed:
file libmagic-mgc libmagic1
apt list -a
file/focal,now 1:5.38-4 amd64 [installed]
libmagic-mgc/focal,now 1:5.38-4 amd64 [installed,automatic]
libmagic1/focal,now 1:5.38-4 amd64 [installed,automatic]
The following NEW packages will be installed:
unzip
apt list -a
unzip/focal,now 6.0-25ubuntu1 amd64 [installed]
The following NEW packages will be installed:
zip
apt list -a
zip/focal,now 3.0-11build1 amd64 [installed]
The following NEW packages will be installed:
libice-dev libice6 libpthread-stubs0-dev libsm-dev libsm6 libxau-dev libxcb1-dev libxdmcp-dev libxfixes-dev libxfixes3
lib xi-dev libxi6 libxrandr2 libxrender1 libxt6 libxtst6 x11-common x11proto-core-dev x11proto-dev x11proto-input-dev
x11proto-randr-dev x11proto-record-dev x11proto-xext-dev xorg-sgml-doctools xtrans-dev
apt list -a
libice-dev/focal,now 2:1.0.10-0ubuntu1 amd64 [installed,automatic]
libice6/focal,now 2:1.0.10-0ubuntu1 amd64 [installed,automatic]
libpthread-stubs0-dev/focal,now 0.4-1 amd64 [installed,automatic]
libsm-dev/focal,now 2:1.2.3-1 amd64 [installed,automatic]
libsm6/focal,now 2:1.2.3-1 amd64 [installed,automatic]
libxau-dev/focal,now 1:1.0.9-0ubuntu1 amd64 [installed,automatic]
libxcb1-dev/focal,now 1.14-2 amd64 [installed,automatic]
libxdmcp-dev/focal,now 1:1.1.3-0ubuntu1 amd64 [installed,automatic]
libxfixes-dev/focal,now 1:5.0.3-2 amd64 [installed,automatic]
libxfixes3/focal,now 1:5.0.3-2 amd64 [installed,automatic]
libxi-dev/focal,now 2:1.7.10-0ubuntu1 amd64 [installed,automatic]
libxi6/focal,now 2:1.7.10-0ubuntu1 amd64 [installed,automatic]
libxrandr2/focal,now 2:1.5.2-0ubuntu1 amd64 [installed,automatic]
libxrender1/focal,now 1:0.9.10-1 amd64 [installed,automatic]
libxt6/focal,now 1:1.1.5-1 amd64 [installed,automatic]
libxtst6/focal,now 2:1.2.3-1 amd64 [installed,automatic]
x11-common/focal,now 1:7.7+19ubuntu14 all [installed,automatic]
x11proto-core-dev/focal,now 2019.2-1ubuntu1 all [installed,automatic]
x11proto-dev/focal,now 2019.2-1ubuntu1 all [installed,automatic]
x11proto-input-dev/focal,now 2019.2-1ubuntu1 all [installed,automatic]
x11proto-randr-dev/focal,now 2019.2-1ubuntu1 all [installed,automatic]
x11proto-record-dev/focal,now 2019.2-1ubuntu1 all [installed,automatic]
x11proto-xext-dev/focal,now 2019.2-1ubuntu1 all [installed,automatic]
xorg-sgml-doctools/focal,now 1:1.11-1 all [installed,automatic]
xtrans-dev/focal,now 1.4.0-1 all [installed,automatic]
The following NEW packages will be installed:
libavahi-client3 libavahi-common-data libavahi-common3 libcups2 libcups2-dev libcupsimage2 libcupsimage2-dev libdbus-1-3
libjbig-dev libjbig0 libjpeg-dev libjpeg-turbo8 libjpeg-turbo8-dev libjpeg8 libjpeg8-dev liblzma-dev libpng-dev libpng16-16
libtiff-dev libtiff5 libtiffxx5 libwebp6 zlib1g-dev
apt list -a
libavahi-client3/focal,now 0.7-4ubuntu7 amd64 [installed,automatic]
libavahi-common-data/focal,now 0.7-4ubuntu7 amd64 [installed,automatic]
libavahi-common3/focal,now 0.7-4ubuntu7 amd64 [installed,automatic]
libcups2-dev/focal-updates,focal-security,now 2.3.1-9ubuntu1.1 amd64 [installed]
libcups2-dev/focal 2.3.1-9ubuntu1 amd64
libcups2/focal-updates,focal-security,now 2.3.1-9ubuntu1.1 amd64 [installed,automatic]
libcups2/focal 2.3.1-9ubuntu1 amd64
libcupsimage2-dev/focal-updates,focal-security,now 2.3.1-9ubuntu1.1 amd64 [installed,automatic]
libcupsimage2-dev/focal 2.3.1-9ubuntu1 amd64
libcupsimage2/focal-updates,focal-security,now 2.3.1-9ubuntu1.1 amd64 [installed,automatic]
libcupsimage2/focal 2.3.1-9ubuntu1 amd64
libdbus-1-3/focal-updates,focal-security,now 1.12.16-2ubuntu2.1 amd64 [installed,automatic]
libdbus-1-3/focal 1.12.16-2ubuntu2 amd64
libjbig-dev/focal,now 2.1-3.1build1 amd64 [installed,automatic]
libjbig0/focal,now 2.1-3.1build1 amd64 [installed,automatic]
libjpeg-dev/focal,now 8c-2ubuntu8 amd64 [installed,automatic]
libjpeg-turbo8-dev/focal-updates,focal-security,now 2.0.3-0ubuntu1.20.04.1 amd64 [installed,automatic]
libjpeg-turbo8-dev/focal 2.0.3-0ubuntu1 amd64
libjpeg-turbo8/focal-updates,focal-security,now 2.0.3-0ubuntu1.20.04.1 amd64 [installed,automatic]
libjpeg-turbo8/focal 2.0.3-0ubuntu1 amd64
libjpeg8-dev/focal,now 8c-2ubuntu8 amd64 [installed,automatic]
libjpeg8/focal,now 8c-2ubuntu8 amd64 [installed,automatic]
liblzma-dev/focal-updates,now 5.2.4-1ubuntu1 amd64 [installed,automatic]
liblzma-dev/focal 5.2.4-1 amd64
libpng-dev/focal,now 1.6.37-2 amd64 [installed,automatic]
libpng16-16/focal,now 1.6.37-2 amd64 [installed,automatic]
libtiff-dev/focal-updates,focal-security,now 4.1.0+git191117-2ubuntu0.20.04.1 amd64 [installed,automatic]
libtiff-dev/focal 4.1.0+git191117-2build1 amd64
libtiff5/focal-updates,focal-security,now 4.1.0+git191117-2ubuntu0.20.04.1 amd64 [installed,automatic]
libtiff5/focal 4.1.0+git191117-2build1 amd64
libtiffxx5/focal-updates,focal-security,now 4.1.0+git191117-2ubuntu0.20.04.1 amd64 [installed,automatic]
libtiffxx5/focal 4.1.0+git191117-2build1 amd64
libwebp6/focal,now 0.6.1-2 amd64 [installed,automatic]
zlib1g-dev/focal-updates,now 1:1.2.11.dfsg-2ubuntu1.2 amd64 [installed,automatic]
zlib1g-dev/focal 1:1.2.11.dfsg-2ubuntu1 amd64
The following NEW packages will be installed:
fontconfig fontconfig-config fonts-dejavu-core libfontconfig1 libfreetype6 ucf
apt list -a
fontconfig-config/focal,now 2.13.1-2ubuntu3 all [installed,automatic]
fontconfig/focal,now 2.13.1-2ubuntu3 amd64 [installed]
fonts-dejavu-core/focal,now 2.37-1 all [installed,automatic]
libfontconfig1/focal,now 2.13.1-2ubuntu3 amd64 [installed,automatic]
libfreetype6/focal-updates,focal-security,now 2.10.1-2ubuntu0.1 amd64 [installed,automatic]
libfreetype6/focal 2.10.1-2 amd64
ucf/focal,now 3.0038+nmu1 all [installed,automatic]
The following additional packages will be installed:
libexpat1-dev libfreetype-dev libfreetype6-dev libglib2.0-0 pkg-config uuid-dev
apt list -a
libexpat1-dev/focal,now 2.2.9-1build1 amd64 [installed,automatic]
libfreetype-dev/focal-updates,focal-security,now 2.10.1-2ubuntu0.1 amd64 [installed,automatic]
libfreetype-dev/focal 2.10.1-2 amd64
libfreetype6-dev/focal-updates,focal-security,now 2.10.1-2ubuntu0.1 amd64 [installed,automatic]
libfreetype6-dev/focal 2.10.1-2 amd64
libglib2.0-0/focal-updates,focal-security,now 2.64.6-1~ubuntu20.04.3 amd64 [installed,automatic]
libglib2.0-0/focal 2.64.2-1~fakesync1 amd64
pkg-config/focal,now 0.29.1-0ubuntu4 amd64 [installed,automatic]
uuid-dev/focal-updates,now 2.34-0.1ubuntu9.1 amd64 [installed,automatic]
uuid-dev/focal 2.34-0.1ubuntu9 amd64
The following additional packages will be installed:
alsa-topology-conf alsa-ucm-conf libasound2 libasound2-data
apt list -a
alsa-topology-conf/focal,now 1.2.2-1 all [installed,automatic]
alsa-ucm-conf/focal-updates,now 1.2.2-1ubuntu0.7 all [installed,automatic]
alsa-ucm-conf/focal 1.2.2-1 all
libasound2-data/focal-updates,now 1.2.2-2.1ubuntu2.4 all [installed,automatic]
libasound2-data/focal 1.2.2-2.1 all
libasound2/focal-updates,now 1.2.2-2.1ubuntu2.4 amd64 [installed,automatic]
libasound2/focal 1.2.2-2.1 amd64
Had a go at installing and running SystemTap, unsuccessfully, issues with environment and compiling it, looks like system debug image is required. Seems a bit too low level for something we would use as part of a build.
strace is far easier and usable to use, however the output from running a jdk build is huge, as a trace file is created per process, and 1000s of processes are created to perform a JDK build. Here is a tiny section of the "grep'ing" for "include" output within a "delta" re-build of a JDK when changing just a single .c file:
strace.out.4873:openat(AT_FDCWD, "/jdk/src/hotspot/share/include/bits/sigaction.h", O_RDONLY|O_NOCTTY) = -1 ENOENT (No such file or directory)
strace.out.4873:openat(AT_FDCWD, "/jdk/src/hotspot/os/posix/include/bits/sigaction.h", O_RDONLY|O_NOCTTY) = -1 ENOENT (No such file or directory)
strace.out.4873:openat(AT_FDCWD, "/usr/lib/gcc/x86_64-linux-gnu/9/include/bits/sigaction.h", O_RDONLY|O_NOCTTY) = -1 ENOENT (No such file or directory)
strace.out.4873:openat(AT_FDCWD, "/usr/local/include/bits/sigaction.h", O_RDONLY|O_NOCTTY) = -1 ENOENT (No such file or directory)
strace.out.4873:openat(AT_FDCWD, "/usr/include/x86_64-linux-gnu/bits/sigaction.h", O_RDONLY|O_NOCTTY) = 6
strace.out.4873:openat(AT_FDCWD, "/jdk/build/linux-x86_64-server-release/support/modules_include/java.base/bits/sigcontext.h", O_RDONLY|O_NOCTTY) = -1 ENOENT (No such file or directory)
strace.out.4873:openat(AT_FDCWD, "/jdk/build/linux-x86_64-server-release/support/modules_include/java.base/linux/bits/sigcontext.h", O_RDONLY|O_NOCTTY) = -1 ENOENT (No such file or directory)
strace.out.4873:openat(AT_FDCWD, "/jdk/src/hotspot/share/include/bits/sigcontext.h", O_RDONLY|O_NOCTTY) = -1 ENOENT (No such file or directory)
strace.out.4873:openat(AT_FDCWD, "/jdk/src/hotspot/os/posix/include/bits/sigcontext.h", O_RDONLY|O_NOCTTY) = -1 ENOENT (No such file or directory)
strace.out.4873:openat(AT_FDCWD, "/usr/lib/gcc/x86_64-linux-gnu/9/include/bits/sigcontext.h", O_RDONLY|O_NOCTTY) = -1 ENOENT (No such file or directory)
strace.out.4873:openat(AT_FDCWD, "/usr/local/include/bits/sigcontext.h", O_RDONLY|O_NOCTTY) = -1 ENOENT (No such file or directory)
strace.out.4873:openat(AT_FDCWD, "/usr/include/x86_64-linux-gnu/bits/sigcontext.h", O_RDONLY|O_NOCTTY) = 6
strace.out.4873:openat(AT_FDCWD, "/usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h", O_RDONLY|O_NOCTTY) = 6
strace.out.4873:openat(AT_FDCWD, "/jdk/build/linux-x86_64-server-release/support/modules_include/java.base/bits/types/stack_t.h", O_RDONLY|O_NOCTTY) = -1 ENOENT (No such file or directory)
strace.out.4873:openat(AT_FDCWD, "/jdk/build/linux-x86_64-server-release/support/modules_include/java.base/linux/bits/types/stack_t.h", O_RDONLY|O_NOCTTY) = -1 ENOENT (No such file or directory)
strace.out.4873:openat(AT_FDCWD, "/jdk/src/hotspot/share/include/bits/types/stack_t.h", O_RDONLY|O_NOCTTY) = -1 ENOENT (No such file or directory)
strace.out.4873:openat(AT_FDCWD, "/jdk/src/hotspot/os/posix/include/bits/types/stack_t.h", O_RDONLY|O_NOCTTY) = -1 ENOENT (No such file or directory)
strace.out.4873:openat(AT_FDCWD, "/usr/lib/gcc/x86_64-linux-gnu/9/include/bits/types/stack_t.h", O_RDONLY|O_NOCTTY) = -1 ENOENT (No such file or directory)
strace.out.4873:openat(AT_FDCWD, "/usr/local/include/bits/types/stack_t.h", O_RDONLY|O_NOCTTY) = -1 ENOENT (No such file or directory)
It does illustrate the various System headers picked up from places like /usr/include, /usr/lib, /usr/local/include, ...
The strace test illustrates the problem of knowing exactly what system files are used to compile with. It is not practical to log, verify and determine the version of every single opened .h file for example.
So the above has illustrated logging exactly what you've built with to the Nth degree, ie.exact versions of includes, libs, .. is very difficult. For example, it's very hard to know what version or where did the file /usr/include/bits/sigaction.h come from?
Maybe the best answer is use Docker (ignoring AIX for the moment), as long as the "images" are created in a very secure environment. Then log the exact image SHA digest used for a build. You then know exactly what a build is built with.
This approach then "moves" the problem down to the Docker image creation, at least from the "definition" and "security" perspective.
Extend the openjdk-build scripts to log the exact "build info" for a jdk-17 Hotspot xLinux built in Docker
All information logged in Release meta data file
Not included in this prototype:
So the above has illustrated logging exactly what you've built with to the Nth degree, ie.exact versions of includes, libs, .. is very difficult. For example, it's very hard to know what version or where did the file /usr/include/bits/sigaction.h come from?
OK ... Assuming it hasn't been modified since the package was installed (which is another thing that could probably be checked) the answer would come from rpm -qf /usr/include/bits/sigaction.h (RPM based) or dpkg -S /usr/include/bits/sigaction.h (Debian-based). The E_NOENT ones can be ignored as that's just the compiler searching for where in the include path the file is. Once you have the list of files that were successfully opened, dedup-them, run that command on each of them, then de-dup that output. Since you have the output shown above perhaps something like this will probably work (untested as I don't have your file but I'm sure you can see what it's trying to do:
grep -v ENOENT strace.out.4873 | cut -d'"' -f2 | while read F; do dpkg -S "$F" >> packagelist.txt 2>> filesnotinpackage.txt; done
sort packagelist.txt | uniq
sort filesnotinpackage.txt | uniq
_NOTE: On the real build machines there will be more in filesnotinpackage.txt than on your system since, for example, gcc and all it's bits are in /usr/local/gcc* and not from the OS-supplied package as per this ansible role_
BUILD_CONFIG
What is the difference between this and Job "Build Config" - I'd assume one is a superset of the other. I'd also suggest that this isn't quite as important as the other stuff since the bits relevant to build are captured by the script parameters and everything else is mostly about other parts of the pipelines such as a tests/installers etc. so it has the potential to cause some confusion, but no harm in including it in this first pass :-)
secondary repos used, eg.installer, signing, ...
Bear in mind also that for OpenJ9 "secondary" repos would likely include the eclipse/openj9 and eclipse/omr repos that get pullled in.
@sxa Job "build Config" is:
{
"ARCHITECTURE": "x64",
"TARGET_OS": "linux",
"VARIANT": "hotspot",
"JAVA_TO_BUILD": "jdk",
"TEST_LIST": [
"sanity.openjdk",
"sanity.system",
"extended.system",
"sanity.perf",
"sanity.functional",
"extended.functional"
],
"SCM_REF": "",
"BUILD_ARGS": "",
"NODE_LABEL": "build&&linux&&x64",
"ADDITIONAL_TEST_LABEL": "",
"KEEP_TEST_REPORTDIR": false,
"ACTIVE_NODE_TIMEOUT": "0",
"CODEBUILD": false,
"DOCKER_IMAGE": "adoptopenjdk/centos6_build_image",
"DOCKER_NODE": "",
"DOCKER_REGISTRY": "",
"DOCKER_CREDENTIAL": "",
"PLATFORM_CONFIG_LOCATION": "AdoptOpenJDK/openjdk-build/master/build-farm/platform-specific-configurations",
"CONFIGURE_ARGS": "--enable-dtrace",
"OVERRIDE_FILE_NAME_VERSION": "",
"USE_ADOPT_SHELL_SCRIPTS": true,
"RELEASE": false,
"PUBLISH_NAME": "",
"ADOPT_BUILD_NUMBER": "",
"ENABLE_TESTS": true,
"ENABLE_INSTALLERS": true,
"ENABLE_SIGNER": true,
"CLEAN_WORKSPACE": false,
"CLEAN_WORKSPACE_AFTER": false,
"CLEAN_WORKSPACE_BUILD_OUTPUT_ONLY_AFTER": true
}
BUILD_CONFIG:
00:39:19 # ============================
00:39:19 # OPENJDK BUILD CONFIGURATION:
00:39:19 # ============================
00:39:19 BUILD_CONFIG[ADOPT_PATCHES]="true"
00:39:19 BUILD_CONFIG[ASSEMBLE_EXPLODED_IMAGE]="false"
00:39:19 BUILD_CONFIG[BRANCH]="dev"
00:39:19 BUILD_CONFIG[BUILD_FULL_NAME]="linux-x86_64-server-release"
00:39:19 BUILD_CONFIG[BUILD_VARIANT]="hotspot"
00:39:19 BUILD_CONFIG[CLEAN_DOCKER_BUILD]="false"
00:39:19 BUILD_CONFIG[CLEAN_GIT_REPO]="true"
00:39:19 BUILD_CONFIG[CLEAN_LIBS]="false"
00:39:19 BUILD_CONFIG[CONTAINER_NAME]="openjdk_container"
00:39:19 BUILD_CONFIG[COPY_MACOSX_FREE_FONT_LIB_FOR_JDK_FLAG]="false"
00:39:19 BUILD_CONFIG[COPY_MACOSX_FREE_FONT_LIB_F......
Prototype for Hotspot, so ignoring openj9 for the moment
Complete build with strace, 56000+ trace files !?!
0.6Gbs of trace
and took 3+ hours to run!
Complete build with strace, 56000+ trace files !?!
Does that include all the ENOENT trace points?