diff --git a/core/src/main/java/hudson/model/Job.java b/core/src/main/java/hudson/model/Job.java index 07684f9e9d516485d6f993d0d16621b9fa5b4cbf..d60f144d554b66ffd75614a08c62af731ead43d2 100644 --- a/core/src/main/java/hudson/model/Job.java +++ b/core/src/main/java/hudson/model/Job.java @@ -430,7 +430,7 @@ public abstract class Job, RunT extends Run, RunT extends Run> getProperties() { - return Descriptor.toMap((Iterable) properties); + Map result = Descriptor.toMap((Iterable) properties); + if (logRotator != null) { + result.put(Jenkins.getActiveInstance().getDescriptorByType(BuildDiscarderProperty.DescriptorImpl.class), new BuildDiscarderProperty(logRotator)); + } + return result; } /** @@ -572,6 +576,13 @@ public abstract class Job, RunT extends Run T getProperty(Class clazz) { + if (clazz == BuildDiscarderProperty.class && logRotator != null) { + return clazz.cast(new BuildDiscarderProperty(logRotator)); + } + return _getProperty(clazz); + } + + private T _getProperty(Class clazz) { for (JobProperty p : properties) { if (clazz.isInstance(p)) return clazz.cast(p); @@ -1196,6 +1207,8 @@ public abstract class Job, RunT extends Run, JobPropertyDescriptor> t = new DescribableList, JobPropertyDescriptor>(NOOP,getAllProperties()); JSONObject jsonProperties = json.optJSONObject("properties"); if (jsonProperties != null) { diff --git a/test/src/test/java/jenkins/model/BuildDiscarderPropertyTest.java b/test/src/test/java/jenkins/model/BuildDiscarderPropertyTest.java index 90c8bf71bdf97a223e582e5bba50be261104e633..c137c8bc200c8504320b7af6ee81a75a6041bea9 100644 --- a/test/src/test/java/jenkins/model/BuildDiscarderPropertyTest.java +++ b/test/src/test/java/jenkins/model/BuildDiscarderPropertyTest.java @@ -25,6 +25,7 @@ package jenkins.model; import hudson.model.AbstractProject; +import hudson.model.FreeStyleProject; import hudson.tasks.LogRotator; import java.io.StringReader; import javax.xml.transform.Source; @@ -41,6 +42,29 @@ public class BuildDiscarderPropertyTest { @Rule public JenkinsRule r = new JenkinsRule(); + @Issue("JENKINS-31518") + @LocalData + @Test + public void buildDiscarderField() throws Exception { + FreeStyleProject p = r.jenkins.getItemByFullName("p", FreeStyleProject.class); + verifyBuildDiscarder(p); + r.configRoundtrip(p); + verifyBuildDiscarder(p); + String xml = p.getConfigFile().asString(); + assertFalse(xml, xml.contains("")); + } + + private void verifyBuildDiscarder(FreeStyleProject p) { + BuildDiscarder bd = p.getBuildDiscarder(); + assertNotNull(bd); + LogRotator lr = (LogRotator) bd; + assertEquals(7, lr.getDaysToKeep()); + assertEquals(10, lr.getNumToKeep()); + assertNotNull(p.getProperty(BuildDiscarderProperty.class)); + assertEquals(1, p.getProperties().size()); + } + @Issue("JENKINS-16979") @LocalData @Test diff --git a/test/src/test/resources/jenkins/model/BuildDiscarderPropertyTest/buildDiscarderField.zip b/test/src/test/resources/jenkins/model/BuildDiscarderPropertyTest/buildDiscarderField.zip new file mode 100644 index 0000000000000000000000000000000000000000..fd32a7328236234990664ab48f6f64f5b34f6b54 Binary files /dev/null and b/test/src/test/resources/jenkins/model/BuildDiscarderPropertyTest/buildDiscarderField.zip differ