This is an automated email from the ASF dual-hosted git repository.

pvillard31 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/main by this push:
     new 819ba6dbe95 NIFI-16209 Set Deterministic Build Timestamp (#11549)
819ba6dbe95 is described below

commit 819ba6dbe9527f15a5ca70d91cff00c21ba615d8
Author: David Handermann <[email protected]>
AuthorDate: Sat Aug 15 06:51:50 2026 -0500

    NIFI-16209 Set Deterministic Build Timestamp (#11549)
---
 nifi-docs/pom.xml                                  |  1 +
 .../manifest/impl/RuntimeManifestGenerator.java    | 34 +++++++++++++---------
 .../src/main/resources/build.properties            | 10 +++----
 pom.xml                                            |  2 +-
 4 files changed, 27 insertions(+), 20 deletions(-)

diff --git a/nifi-docs/pom.xml b/nifi-docs/pom.xml
index f0c8babbc57..06ea0ee8e23 100644
--- a/nifi-docs/pom.xml
+++ b/nifi-docs/pom.xml
@@ -72,6 +72,7 @@
                         <idseparator>-</idseparator>
                         <docinfo1>true</docinfo1>
                         <stylesheet>asciidoc-mod.css</stylesheet>
+                        <reproducible>true</reproducible>
                     </attributes>
                 </configuration>
             </plugin>
diff --git 
a/nifi-manifest/nifi-runtime-manifest-core/src/main/java/org/apache/nifi/runtime/manifest/impl/RuntimeManifestGenerator.java
 
b/nifi-manifest/nifi-runtime-manifest-core/src/main/java/org/apache/nifi/runtime/manifest/impl/RuntimeManifestGenerator.java
index 32dca433cc0..9d4e8da9fec 100644
--- 
a/nifi-manifest/nifi-runtime-manifest-core/src/main/java/org/apache/nifi/runtime/manifest/impl/RuntimeManifestGenerator.java
+++ 
b/nifi-manifest/nifi-runtime-manifest-core/src/main/java/org/apache/nifi/runtime/manifest/impl/RuntimeManifestGenerator.java
@@ -40,7 +40,7 @@ import java.io.OutputStream;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.time.OffsetDateTime;
-import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
@@ -56,10 +56,7 @@ public class RuntimeManifestGenerator {
     private static final String PROJECT_VERSION_PROPERTY = "Project-Version";
     private static final String BUILD_REVISION = "Build-Revision";
     private static final String BUILD_TIMESTAMP = "Build-Timestamp";
-    private static final String BUILD_TIMESTAMP_FORMAT = 
"yyyy-MM-dd'T'HH:mm:ss'Z'";
     private static final String BUILD_JDK = "Build-Jdk";
-    private static final String BUILD_JDK_VENDOR = "Build-Jdk-Vendor";
-    private static final DateTimeFormatter TIMESTAMP_FORMATTER = 
DateTimeFormatter.ofPattern(BUILD_TIMESTAMP_FORMAT);
 
     private final File extensionManifestBaseDir;
     private final File buildPropertiesFile;
@@ -84,20 +81,12 @@ public class RuntimeManifestGenerator {
         final String buildRevision = 
buildProperties.getProperty(BUILD_REVISION);
         final String buildTimestamp = 
buildProperties.getProperty(BUILD_TIMESTAMP);
         final String buildJdk = buildProperties.getProperty(BUILD_JDK);
-        final String buildJdkVendor = 
buildProperties.getProperty(BUILD_JDK_VENDOR);
-
-        long buildTimestampMillis;
-        try {
-            buildTimestampMillis = OffsetDateTime.parse(buildTimestamp, 
TIMESTAMP_FORMATTER).toInstant().toEpochMilli();
-        } catch (Exception e) {
-            buildTimestampMillis = System.currentTimeMillis();
-        }
 
         final BuildInfo buildInfo = new BuildInfo();
         buildInfo.setVersion(runtimeVersion);
         buildInfo.setRevision(buildRevision);
-        buildInfo.setTimestamp(buildTimestampMillis);
-        buildInfo.setCompiler(buildJdkVendor + " " + buildJdk);
+        buildInfo.setTimestamp(parseBuildTimestampMillis(buildTimestamp));
+        buildInfo.setCompiler(buildJdk);
 
         final List<ExtensionManifestContainer> extensionsManifests = 
extensionManifestProvider.getExtensionManifests();
 
@@ -140,6 +129,23 @@ public class RuntimeManifestGenerator {
         }
     }
 
+    private long parseBuildTimestampMillis(final String buildTimestamp) {
+        if (buildTimestamp == null || buildTimestamp.isBlank()) {
+            return 0L;
+        }
+
+        // project.build.outputTimestamp may be provided as seconds since the 
epoch or as an ISO-8601 timestamp
+        if (buildTimestamp.chars().allMatch(Character::isDigit)) {
+            return Long.parseLong(buildTimestamp) * 1000L;
+        }
+
+        try {
+            return 
OffsetDateTime.parse(buildTimestamp).toInstant().toEpochMilli();
+        } catch (final DateTimeParseException e) {
+            return 0L;
+        }
+    }
+
     private ExtensionManifestProvider createExtensionManifestProvider() {
         final ExtensionManifestParser extensionManifestParser = new 
JAXBExtensionManifestParser();
         return new 
DirectoryExtensionManifestProvider(extensionManifestBaseDir, 
extensionManifestParser);
diff --git 
a/nifi-manifest/nifi-runtime-manifest/src/main/resources/build.properties 
b/nifi-manifest/nifi-runtime-manifest/src/main/resources/build.properties
index 1edc6b1d698..2a9aa30c372 100644
--- a/nifi-manifest/nifi-runtime-manifest/src/main/resources/build.properties
+++ b/nifi-manifest/nifi-runtime-manifest/src/main/resources/build.properties
@@ -16,10 +16,10 @@
 Project-Version:${project.version}
 Build-Branch:${buildBranch}
 Build-Revision:${buildRevision}
-Build-Timestamp:${maven.build.timestamp}
+Build-Timestamp:${project.build.outputTimestamp}
 Maven-Version:${maven.version}
 Created-By:${maven.build.version}
-Build-Jdk:${java.version}
-Build-Jdk-Vendor:${java.vendor}
-Build-Arch:${os.arch}
-Build-Os:${os.name}
+Build-Jdk:${maven.compiler.release}
+Build-Jdk-Vendor:JDK
+Build-Arch:UNSPECIFIED
+Build-Os:UNSPECIFIED
diff --git a/pom.xml b/pom.xml
index 16806235b89..c404d72e420 100644
--- a/pom.xml
+++ b/pom.xml
@@ -14,7 +14,7 @@
     <parent>
         <groupId>org.apache</groupId>
         <artifactId>apache</artifactId>
-        <version>37</version>
+        <version>39</version>
         <relativePath />
     </parent>
     <groupId>org.apache.nifi</groupId>

Reply via email to