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>