diff --git a/pom.xml b/pom.xml index 340049c..dc25aeb 100644 --- a/pom.xml +++ b/pom.xml @@ -197,6 +197,18 @@ 4.13.1 test + + com.github.stefanbirkner + system-rules + 1.19.0 + test + + + com.github.stefanbirkner + system-lambda + 1.1.0 + test + org.slf4j slf4j-api diff --git a/src/main/java/org/redline_rpm/Builder.java b/src/main/java/org/redline_rpm/Builder.java index 0639157..fc89cb8 100644 --- a/src/main/java/org/redline_rpm/Builder.java +++ b/src/main/java/org/redline_rpm/Builder.java @@ -102,7 +102,17 @@ public class Builder { */ public Builder() { format.getHeader().createEntry( HEADERI18NTABLE, "C"); - format.getHeader().createEntry( BUILDTIME, ( int) ( System.currentTimeMillis() / 1000)); + long sourceDateEpoch=0; + long buildTime = System.currentTimeMillis()/1000; + try { + sourceDateEpoch = Long.parseLong(System.getenv("SOURCE_DATE_EPOCH")); + }catch(NumberFormatException e) { + // do nothing + } + if(sourceDateEpoch!=0){ + buildTime = sourceDateEpoch; + } + format.getHeader().createEntry( BUILDTIME, ( int)buildTime); format.getHeader().createEntry( RPMVERSION, "4.4.2"); format.getHeader().createEntry( PAYLOADFORMAT, "cpio"); format.getHeader().createEntry( PAYLOADCOMPRESSOR, "gzip"); diff --git a/src/test/java/org/redline_rpm/BuilderTest.java b/src/test/java/org/redline_rpm/BuilderTest.java index 22536e6..9ef4a91 100644 --- a/src/test/java/org/redline_rpm/BuilderTest.java +++ b/src/test/java/org/redline_rpm/BuilderTest.java @@ -1,7 +1,8 @@ package org.redline_rpm; +import org.junit.Rule; import org.junit.Test; -import org.redline_rpm.Scanner; +import org.junit.contrib.java.lang.system.EnvironmentVariables; import org.redline_rpm.header.Format; import org.redline_rpm.header.Header.HeaderTag; import org.redline_rpm.header.Header; @@ -23,6 +24,9 @@ public class BuilderTest extends TestBase { + @Rule + public final EnvironmentVariables environmentVariables = new EnvironmentVariables(); + @Test public void testLongNameTruncation() throws Exception { Builder builder = new Builder(); @@ -205,6 +209,27 @@ public void testProvideOverride() throws Exception { } + /** + * Allows the Build Date of the RPM to be overridden by the environment variable SOURCE_DATE_EPOCH + * See https://reproducible-builds.org/docs/source-date-epoch/ + * @throws Exception + */ + @Test + public void testReproducibleBuilds() throws Exception { + final String EXPECTED_BUILD_TIME="1644516016"; + environmentVariables.set("SOURCE_DATE_EPOCH", EXPECTED_BUILD_TIME); + + Builder builder = new Builder(); + builder.setPackage("testReproducibleBuilds", "1.0", "1"); + builder.build( new File( getTargetDir())); + + Format format = new Scanner().run(channelWrapper("target" + File.separator + "testReproducibleBuilds-1.0-1.noarch.rpm")); + System.out.println(EXPECTED_BUILD_TIME+" hhhhhh ==" + format.getHeader().getEntry(HeaderTag.BUILDTIME).toString()); + + assertEquals("buildtime[tag=1006,type=4,count=1,size=4,offset=36]\n\t"+EXPECTED_BUILD_TIME+", ", format.getHeader().getEntry(HeaderTag.BUILDTIME).toString()); + + } + @Test public void testAddHeaderEntry() { Builder builder = new Builder();