Skip to content

Commit 21eb86c

Browse files
authored
Merge pull request #365 from jenkinsci/info-messages
Add a new detail view that shows info and error messages
2 parents d0dc4ec + b159481 commit 21eb86c

File tree

7 files changed

+42
-23
lines changed

7 files changed

+42
-23
lines changed

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@
3030
<plugin-util-api.version>2.5.1</plugin-util-api.version>
3131
<data-tables-api.version>1.11.3-4</data-tables-api.version>
3232
<jquery3-api.version>3.6.0-2</jquery3-api.version>
33-
<font-awesome-api.version> 5.15.4-1</font-awesome-api.version>
33+
<font-awesome-api.version>5.15.4-3</font-awesome-api.version>
34+
<bootstrap5-api.version>5.1.3-3</bootstrap5-api.version>
3435
<echarts-api.version>5.2.2-1</echarts-api.version>
35-
<bootstrap5-api.version>5.1.3-1</bootstrap5-api.version>
3636

3737
</properties>
3838

src/main/java/io/jenkins/plugins/forensics/reference/ReferenceBuild.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,11 @@
1010
import edu.hm.hafner.util.VisibleForTesting;
1111
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
1212

13+
import org.kohsuke.stapler.StaplerProxy;
1314
import hudson.model.Run;
1415
import jenkins.model.RunAction2;
1516

17+
import io.jenkins.plugins.bootstrap5.MessagesViewModel;
1618
import io.jenkins.plugins.util.JenkinsFacade;
1719

1820
import static j2html.TagCreator.*;
@@ -24,7 +26,7 @@
2426
* @author Ullrich Hafner
2527
* @see ReferenceRecorder
2628
*/
27-
public class ReferenceBuild implements RunAction2, Serializable {
29+
public class ReferenceBuild implements RunAction2, Serializable, StaplerProxy {
2830
private static final long serialVersionUID = -4549516129641755356L;
2931

3032
/**
@@ -33,6 +35,8 @@ public class ReferenceBuild implements RunAction2, Serializable {
3335
*/
3436
public static final String NO_REFERENCE_BUILD = "-";
3537

38+
static final String REFERENCE_DETAILS_URL = "reference";
39+
3640
/**
3741
* Returns a link that can be used in Jelly views to navigate to the reference build.
3842
*
@@ -182,6 +186,16 @@ public String getIconFileName() {
182186

183187
@Override
184188
public String getUrlName() {
185-
return null;
189+
return REFERENCE_DETAILS_URL;
190+
}
191+
192+
/**
193+
* Returns the detail view for the messages captured during the computation of the reference build.
194+
*
195+
* @return the detail view for the messages
196+
*/
197+
@Override
198+
public Object getTarget() {
199+
return new MessagesViewModel(getOwner(), Messages.Messages_DisplayName(), messages);
186200
}
187201
}

src/main/java/io/jenkins/plugins/forensics/reference/ReferenceRecorder.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ public String getDefaultBranch() {
108108
* @param targetBranch
109109
* the name of the default branch
110110
*/
111+
@DataBoundSetter
111112
public void setTargetBranch(final String targetBranch) {
112113
this.defaultBranch = StringUtils.stripToEmpty(targetBranch);
113114
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
Recorder.DisplayName=Discover reference build
2+
Messages.DisplayName=Reference build
23
FieldValidator.Error.ReferenceJobDoesNotExist=There is no such job - maybe the job has been renamed?

src/main/resources/io/jenkins/plugins/forensics/reference/ReferenceBuild/summary.jelly

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,19 @@
11
<?jelly escape-by-default='true'?>
2-
<j:jelly xmlns:j="jelly:core" xmlns:t="/lib/hudson">
2+
<j:jelly xmlns:j="jelly:core" xmlns:t="/lib/hudson" xmlns:fa="/font-awesome">
33

44
<t:summary icon="/plugin/forensics-api/icons/crosshair.svg">
55

66
<j:choose>
77
<j:when test="${it.hasReferenceBuild()}">
8-
${%Reference.Build.Found}
8+
${%reference.found}
9+
<fa:image-button label="${%Open log messages}" name="info-circle" tooltip="${%icon.info.tooltip}" url="reference" />
910
<ul>
1011
<li><j:out value="${it.referenceLink}"/></li>
11-
<j:forEach var="message" items="${it.messages}">
12-
<li>${message}</li>
13-
</j:forEach>
1412
</ul>
1513
</j:when>
1614
<j:otherwise>
17-
${%No.Reference.Build}
18-
<ul>
19-
<j:forEach var="message" items="${it.messages}">
20-
<li>${message}</li>
21-
</j:forEach>
22-
</ul>
15+
${%reference.notFound}
16+
<fa:image-button label="${%Open error messages}" name="exclamation-triangle" tooltip="${%icon.error.tooltip}" url="reference" class="fa-image-button-warning"/>
2317
</j:otherwise>
2418

2519
</j:choose>
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
1-
Reference.Build.Found=Reference build for delta reports
2-
No.Reference.Build=No reference build found
1+
reference.found=Reference build for delta reports
2+
reference.notFound=No reference build found
3+
icon.error.tooltip=Some errors have been logged while searching for the reference build, click to see these errors in a details view.
4+
icon.info.tooltip=Click to see all logging messages while searching for the reference build.

src/test/java/io/jenkins/plugins/forensics/reference/ReferenceBuildTest.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import hudson.model.Run;
1010

11+
import io.jenkins.plugins.bootstrap5.MessagesViewModel;
1112
import io.jenkins.plugins.util.JenkinsFacade;
1213

1314
import static io.jenkins.plugins.forensics.assertions.Assertions.*;
@@ -32,7 +33,6 @@ void shouldAttachBuild() {
3233
Run<?, ?> newBuild = mock(Run.class);
3334
referenceBuild.onAttached(newBuild);
3435
assertThat(referenceBuild).hasOwner(newBuild);
35-
3636
referenceBuild.onLoad(currentBuild);
3737
assertThat(referenceBuild).hasOwner(currentBuild);
3838
}
@@ -47,12 +47,20 @@ void shouldHandleMissingReferenceBuild() {
4747
assertThat(referenceBuild).hasOnlyMessages(MESSAGES);
4848
assertThat(referenceBuild).hasOwner(currentBuild);
4949
assertThat(referenceBuild).hasReferenceBuildId(ReferenceBuild.NO_REFERENCE_BUILD);
50-
assertThat(referenceBuild).hasReferenceLink("Reference build '-' not found anymore - maybe the build has been renamed or deleted?");
50+
assertThat(referenceBuild).hasReferenceLink(
51+
"Reference build '-' not found anymore - maybe the build has been renamed or deleted?");
5152
assertThat(referenceBuild.getReferenceBuild()).isEmpty();
5253

5354
assertThat(referenceBuild.getIconFileName()).isNull();
5455
assertThat(referenceBuild.getDisplayName()).isNull();
55-
assertThat(referenceBuild.getUrlName()).isNull();
56+
assertThat(referenceBuild.getUrlName()).isEqualTo(ReferenceBuild.REFERENCE_DETAILS_URL);
57+
58+
assertThat(referenceBuild.getTarget()).isInstanceOfSatisfying(MessagesViewModel.class,
59+
model -> {
60+
assertThat(model.getDisplayName()).isEqualTo("Reference build - Messages");
61+
assertThat(model.getErrorMessages()).isEmpty();
62+
assertThat(model.getInfoMessages()).containsAll(MESSAGES);
63+
});
5664
}
5765

5866
@Test
@@ -70,7 +78,7 @@ void shouldHandleValidReferenceBuild() {
7078

7179
assertThat(referenceBuild.getIconFileName()).isNull();
7280
assertThat(referenceBuild.getDisplayName()).isNull();
73-
assertThat(referenceBuild.getUrlName()).isNull();
81+
assertThat(referenceBuild.getUrlName()).isEqualTo(ReferenceBuild.REFERENCE_DETAILS_URL);
7482
}
7583

7684
@Test
@@ -94,7 +102,6 @@ void shouldHandleValidReferenceBuildId() {
94102

95103
assertThat(referenceBuild.getIconFileName()).isNull();
96104
assertThat(referenceBuild.getDisplayName()).isNull();
97-
assertThat(referenceBuild.getUrlName()).isNull();
105+
assertThat(referenceBuild.getUrlName()).isEqualTo(ReferenceBuild.REFERENCE_DETAILS_URL);
98106
}
99-
100107
}

0 commit comments

Comments
 (0)