Skip to content

Commit 1d15128

Browse files
authored
Build: Make META-INF/MANIFEST.MF content reproducible (#2421)
As described in #2204, some jar manifest attributes prevent having a reproducible build, to eventually be able to generate the _exact_ same artifacts on different systems at different times. Committers shall then be able to re-run the build and compare proposed release artifacts bit-by-bit. This change changes the jar manifest attributes: * `Apache-Polaris-Is-Release` is now also set to `true`, if `-PjarWithGitInfo` is specified * `Apache-Polaris-Build-Git-Describe` is now also generated, if `-PjarWithGitInfo` is specified * `Apache-Polaris-Build-Java-Version` has been removed * `Apache-Polaris-Build-Java-Specification-Version` has been added (it's only the Java major version) * `Apache-Polaris-Build-Timestamp` has been removed * `Apache-Polaris-Build-System` has been removed Contributes to: #2204
1 parent 3fa1df3 commit 1d15128

File tree

5 files changed

+35
-76
lines changed

5 files changed

+35
-76
lines changed

build-logic/src/main/kotlin/publishing/MemoizedGitInfo.kt

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919

2020
package publishing
2121

22-
import org.gradle.api.GradleException
2322
import org.gradle.api.Project
2423
import org.gradle.api.java.archives.Attributes
2524
import org.gradle.kotlin.dsl.extra
@@ -54,21 +53,18 @@ internal class MemoizedGitInfo {
5453
@Suppress("UNCHECKED_CAST")
5554
rootProject.extra["gitReleaseInfo"] as Map<String, String>
5655
} else {
57-
val isRelease = rootProject.hasProperty("release")
56+
val isRelease =
57+
rootProject.hasProperty("release") || rootProject.hasProperty("jarWithGitInfo")
5858
val gitHead = execProc(rootProject, "git", "rev-parse", "HEAD")
5959
val gitDescribe =
60-
if (isRelease) {
60+
if (isRelease)
6161
try {
6262
execProc(rootProject, "git", "describe", "--tags")
63-
} catch (e: Exception) {
64-
throw GradleException("'git describe --tags' failed - no Git tag?", e)
63+
} catch (_: Exception) {
64+
execProc(rootProject, "git", "describe", "--always", "--dirty")
6565
}
66-
} else {
67-
execProc(rootProject, "git", "describe", "--always", "--dirty")
68-
}
69-
val timestamp = execProc(rootProject, "date", "+%Y-%m-%d-%H:%M:%S%:z")
70-
val system = execProc(rootProject, "uname", "-a")
71-
val javaVersion = System.getProperty("java.version")
66+
else ""
67+
val javaSpecificationVersion = System.getProperty("java.specification.version")
7268

7369
val version = rootProject.version.toString()
7470
val info =
@@ -78,9 +74,7 @@ internal class MemoizedGitInfo {
7874
"Apache-Polaris-Is-Release" to isRelease.toString(),
7975
"Apache-Polaris-Build-Git-Head" to gitHead,
8076
"Apache-Polaris-Build-Git-Describe" to gitDescribe,
81-
"Apache-Polaris-Build-Timestamp" to timestamp,
82-
"Apache-Polaris-Build-System" to system,
83-
"Apache-Polaris-Build-Java-Version" to javaVersion,
77+
"Apache-Polaris-Build-Java-Specification-Version" to javaSpecificationVersion,
8478
)
8579
rootProject.extra["gitReleaseInfo"] = info
8680
return info

build-logic/src/main/kotlin/publishing/PublishingHelperPlugin.kt

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ package publishing
1818

1919
import com.github.jengelman.gradle.plugins.shadow.ShadowPlugin
2020
import javax.inject.Inject
21-
import org.gradle.api.*
21+
import org.gradle.api.Plugin
22+
import org.gradle.api.Project
2223
import org.gradle.api.component.SoftwareComponentFactory
2324
import org.gradle.api.publish.PublishingExtension
2425
import org.gradle.api.publish.maven.MavenPublication
@@ -27,16 +28,23 @@ import org.gradle.api.publish.tasks.GenerateModuleMetadata
2728
import org.gradle.api.tasks.SourceSetContainer
2829
import org.gradle.api.tasks.javadoc.Javadoc
2930
import org.gradle.jvm.tasks.Jar
30-
import org.gradle.kotlin.dsl.*
31+
import org.gradle.kotlin.dsl.apply
32+
import org.gradle.kotlin.dsl.configure
33+
import org.gradle.kotlin.dsl.getValue
34+
import org.gradle.kotlin.dsl.named
35+
import org.gradle.kotlin.dsl.provideDelegate
36+
import org.gradle.kotlin.dsl.register
37+
import org.gradle.kotlin.dsl.registering
38+
import org.gradle.kotlin.dsl.withType
3139
import org.gradle.plugins.signing.SigningExtension
3240
import org.gradle.plugins.signing.SigningPlugin
3341

3442
/**
3543
* Release-publishing helper plugin to generate publications that pass Sonatype validations,
3644
* generate Apache release source tarball.
3745
*
38-
* The `release` Gradle project property triggers: signed artifacts + jars with Git information. The
39-
* current Git HEAD must point to a Git tag.
46+
* The `release` Gradle project property triggers: signed artifacts and jars with Git information.
47+
* The current Git HEAD must point to a Git tag.
4048
*
4149
* The `jarWithGitInfo` Gradle project property triggers: jars with Git information (not necessary
4250
* with `release`).

tools/version/src/jarTest/java/org/apache/polaris/version/TestPolarisVersion.java

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,8 @@
2121
import static java.lang.String.format;
2222
import static org.apache.polaris.version.PolarisVersion.getBuildGitHead;
2323
import static org.apache.polaris.version.PolarisVersion.getBuildGitTag;
24-
import static org.apache.polaris.version.PolarisVersion.getBuildJavaVersion;
24+
import static org.apache.polaris.version.PolarisVersion.getBuildJavaSpecificationVersion;
2525
import static org.apache.polaris.version.PolarisVersion.getBuildReleasedVersion;
26-
import static org.apache.polaris.version.PolarisVersion.getBuildSystem;
27-
import static org.apache.polaris.version.PolarisVersion.getBuildTimestamp;
2826
import static org.apache.polaris.version.PolarisVersion.isReleaseBuild;
2927
import static org.apache.polaris.version.PolarisVersion.polarisVersionString;
3028

@@ -50,7 +48,7 @@ public class TestPolarisVersion {
5048
@InjectSoftAssertions private SoftAssertions soft;
5149

5250
/**
53-
* Test runs using a "non release" build, so the MANIFEST.MF file has no release version
51+
* Test runs using a "non-release" build, so the MANIFEST.MF file has no release version
5452
* information.
5553
*/
5654
@Test
@@ -59,18 +57,14 @@ public void versionAvailable() {
5957
soft.assertThat(polarisVersionString()).isEqualTo(System.getProperty("polarisVersion"));
6058
if (isReleaseBuild()) {
6159
soft.assertThat(getBuildReleasedVersion()).isNotEmpty();
62-
soft.assertThat(getBuildTimestamp()).isNotEmpty();
6360
soft.assertThat(getBuildGitHead()).isNotEmpty();
6461
soft.assertThat(getBuildGitTag()).isNotEmpty();
65-
soft.assertThat(getBuildSystem()).isNotEmpty();
66-
soft.assertThat(getBuildJavaVersion()).isNotEmpty();
62+
soft.assertThat(getBuildJavaSpecificationVersion()).isNotEmpty();
6763
} else {
6864
soft.assertThat(getBuildReleasedVersion()).isEmpty();
69-
soft.assertThat(getBuildTimestamp()).isEmpty();
7065
soft.assertThat(getBuildGitHead()).isEmpty();
7166
soft.assertThat(getBuildGitTag()).isEmpty();
72-
soft.assertThat(getBuildSystem()).isEmpty();
73-
soft.assertThat(getBuildJavaVersion()).isEmpty();
67+
soft.assertThat(getBuildJavaSpecificationVersion()).isEmpty();
7468
}
7569
}
7670

@@ -88,13 +82,9 @@ public void fakeReleaseManifest() {
8882
soft.assertThat(polarisVersionString()).isEqualTo(System.getProperty("polarisVersion"));
8983
soft.assertThat(isReleaseBuild()).isTrue();
9084
soft.assertThat(getBuildReleasedVersion()).contains("0.1.2-incubating-SNAPSHOT");
91-
soft.assertThat(getBuildTimestamp()).contains("2024-12-26-10:31:19+01:00");
9285
soft.assertThat(getBuildGitHead()).contains("27cf81929cbb08e545c8fcb1ed27a53d7ef1af79");
9386
soft.assertThat(getBuildGitTag()).contains("foo-tag-bar");
94-
soft.assertThat(getBuildSystem())
95-
.contains(
96-
"Linux myawesomehost 6.12.6 #81 SMP PREEMPT_DYNAMIC Fri Dec 20 09:22:38 CET 2024 x86_64 x86_64 x86_64 GNU/Linux");
97-
soft.assertThat(getBuildJavaVersion()).contains("21.0.5");
87+
soft.assertThat(getBuildJavaSpecificationVersion()).contains("21");
9888
}
9989

10090
@Test

tools/version/src/jarTest/resources/META-INF/FAKE_MANIFEST.MF

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,4 @@ Apache-Polaris-Version: 0.1.2-incubating-SNAPSHOT
33
Apache-Polaris-Is-Release: true
44
Apache-Polaris-Build-Git-Head: 27cf81929cbb08e545c8fcb1ed27a53d7ef1af79
55
Apache-Polaris-Build-Git-Describe: foo-tag-bar
6-
Apache-Polaris-Build-Timestamp: 2024-12-26-10:31:19+01:00
7-
Apache-Polaris-Build-System: Linux myawesomehost 6.12.6 #81 SMP PREEMPT_DY
8-
NAMIC Fri Dec 20 09:22:38 CET 2024 x86_64 x86_64 x86_64 GNU/Linux
9-
Apache-Polaris-Build-Java-Version: 21.0.5
6+
Apache-Polaris-Build-Java-Specification-Version: 21

tools/version/src/main/java/org/apache/polaris/version/PolarisVersion.java

Lines changed: 9 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -98,43 +98,16 @@ public static Optional<String> getBuildGitTag() {
9898
}
9999

100100
/**
101-
* Returns the Java version used during the build as in the jar manifest, if {@linkplain
102-
* #isReleaseBuild() build-time Git information} is available, when Polaris has been built with
103-
* the Gradle {@code -Prelease} project property.
104-
*
105-
* <p>Example value: {@code 21.0.5}
106-
*
107-
* @see #isReleaseBuild()
108-
*/
109-
public static Optional<String> getBuildJavaVersion() {
110-
return PolarisVersionJarInfo.buildInfo(MF_BUILD_JAVA_VERSION);
111-
}
112-
113-
/**
114-
* Returns information about the system that performed the build, if {@linkplain #isReleaseBuild()
115-
* build-time Git information} is available, when Polaris has been built with the Gradle {@code
116-
* -Prelease} project property.
117-
*
118-
* <p>Example value: {@code Linux myawesomehost 6.12.6 #81 SMP PREEMPT_DYNAMIC Fri Dec 20 09:22:38
119-
* CET 2024 x86_64 x86_64 x86_64 GNU/Linux}
120-
*
121-
* @see #isReleaseBuild()
122-
*/
123-
public static Optional<String> getBuildSystem() {
124-
return PolarisVersionJarInfo.buildInfo(MF_BUILD_SYSTEM);
125-
}
126-
127-
/**
128-
* Returns the build timestamp as in the jar manifest, if {@linkplain #isReleaseBuild() build-time
129-
* Git information} is available, when Polaris has been built with the Gradle {@code -Prelease}
130-
* project property.
101+
* Returns the Java <em>specification</em> version used during the build as in the jar manifest,
102+
* if {@linkplain #isReleaseBuild() build-time Git information} is available, when Polaris has
103+
* been built with the Gradle {@code -Prelease} project property.
131104
*
132-
* <p>Example value: {@code 2024-12-16-11:54:05+01:00}
105+
* <p>Example value: {@code 21}
133106
*
134107
* @see #isReleaseBuild()
135108
*/
136-
public static Optional<String> getBuildTimestamp() {
137-
return PolarisVersionJarInfo.buildInfo(MF_BUILD_TIMESTAMP);
109+
public static Optional<String> getBuildJavaSpecificationVersion() {
110+
return PolarisVersionJarInfo.buildInfo(MF_BUILD_JAVA_SPECIFICATION_VERSION);
138111
}
139112

140113
public static String readNoticeFile() {
@@ -155,18 +128,15 @@ public static String readBinaryLicenseFile() {
155128
private static final String MF_IS_RELEASE = "Apache-Polaris-Is-Release";
156129
private static final String MF_BUILD_GIT_HEAD = "Apache-Polaris-Build-Git-Head";
157130
private static final String MF_BUILD_GIT_DESCRIBE = "Apache-Polaris-Build-Git-Describe";
158-
private static final String MF_BUILD_TIMESTAMP = "Apache-Polaris-Build-Timestamp";
159-
private static final String MF_BUILD_SYSTEM = "Apache-Polaris-Build-System";
160-
private static final String MF_BUILD_JAVA_VERSION = "Apache-Polaris-Build-Java-Version";
131+
private static final String MF_BUILD_JAVA_SPECIFICATION_VERSION =
132+
"Apache-Polaris-Build-Java-Specification-Version";
161133
private static final List<String> MF_ALL =
162134
List.of(
163135
MF_VERSION,
164136
MF_IS_RELEASE,
165137
MF_BUILD_GIT_HEAD,
166138
MF_BUILD_GIT_DESCRIBE,
167-
MF_BUILD_TIMESTAMP,
168-
MF_BUILD_SYSTEM,
169-
MF_BUILD_JAVA_VERSION);
139+
MF_BUILD_JAVA_SPECIFICATION_VERSION);
170140

171141
static String readResource(String resource) {
172142
var fullResource = format("/META-INF/resources/apache-polaris/%s.txt", resource);

0 commit comments

Comments
 (0)