Skip to content
This repository was archived by the owner on Mar 27, 2025. It is now read-only.

Commit e77d3ce

Browse files
authored
Merge pull request #343 from mathworks/issue_338
Fixed issue 338
2 parents 0589685 + 9c41c81 commit e77d3ce

File tree

7 files changed

+88
-35
lines changed

7 files changed

+88
-35
lines changed

src/main/java/com/mathworks/ci/BuildArtifactAction.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,13 @@ public class BuildArtifactAction implements Action {
2424
private int totalCount;
2525
private int skipCount;
2626
private int failCount;
27+
private String actionID;
2728
private static final String ROOT_ELEMENT = "taskDetails";
28-
private static final String BUILD_ARTIFACT_FILE = "buildArtifact.json";
29+
private static final String BUILD_ARTIFACT_FILE = "buildArtifact";
2930

30-
public BuildArtifactAction(Run<?, ?> build) {
31+
public BuildArtifactAction(Run<?, ?> build, String actionID) {
3132
this.build = build;
33+
this.actionID = actionID;
3234

3335
// Setting the counts of task when Action is created.
3436
try{
@@ -40,6 +42,10 @@ public BuildArtifactAction(Run<?, ?> build) {
4042
}
4143
}
4244

45+
public String getActionID(){
46+
return this.actionID;
47+
}
48+
4349
@CheckForNull
4450
@Override
4551
public String getIconFileName() {
@@ -55,12 +61,14 @@ public String getDisplayName() {
5561
@CheckForNull
5662
@Override
5763
public String getUrlName() {
58-
return "buildresults";
64+
return "buildresults" + this.actionID ;
5965
}
6066

6167
public List<BuildArtifactData> getBuildArtifact() throws ParseException, InterruptedException, IOException {
6268
List<BuildArtifactData> artifactData = new ArrayList<BuildArtifactData>();
63-
FilePath fl = new FilePath(new File(build.getRootDir().getAbsolutePath(), BUILD_ARTIFACT_FILE));
69+
70+
FilePath fl = new FilePath(new File(build.getRootDir().getAbsolutePath() + "/" +
71+
BUILD_ARTIFACT_FILE + this.actionID + ".json"));
6472
try (InputStreamReader reader = new InputStreamReader(new FileInputStream(new File(fl.toURI())), "UTF-8")) {
6573
Object obj = new JSONParser().parse(reader);
6674
JSONObject jo = (JSONObject) obj;
@@ -131,7 +139,7 @@ public void setOwner(Run owner) {
131139

132140
private void setCounts() throws InterruptedException, ParseException {
133141
List<BuildArtifactData> artifactData = new ArrayList<BuildArtifactData>();
134-
FilePath fl = new FilePath(new File(build.getRootDir(), BUILD_ARTIFACT_FILE));
142+
FilePath fl = new FilePath(new File(build.getRootDir(), BUILD_ARTIFACT_FILE + this.actionID + ".json"));
135143
try (InputStreamReader reader = new InputStreamReader(new FileInputStream(new File(fl.toURI())), "UTF-8")) {
136144
Object obj = new JSONParser().parse(reader);
137145
JSONObject jo = (JSONObject) obj;

src/main/java/com/mathworks/ci/actions/RunMatlabBuildAction.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@
1010

1111
import hudson.FilePath;
1212
import hudson.model.Run;
13-
import hudson.console.LineTransformationOutputStream;
1413

1514
import com.mathworks.ci.BuildArtifactAction;
1615
import com.mathworks.ci.BuildConsoleAnnotator;
1716
import com.mathworks.ci.MatlabExecutionException;
1817
import com.mathworks.ci.parameters.BuildActionParameters;
1918
import com.mathworks.ci.utilities.MatlabCommandRunner;
19+
import org.apache.commons.lang.RandomStringUtils;
2020

2121
public class RunMatlabBuildAction {
2222
private BuildActionParameters params;
@@ -29,9 +29,15 @@ public class RunMatlabBuildAction {
2929
"+ciplugins/+jenkins/BuildReportPlugin.m";
3030
private static String TASK_RUN_PROGRESS_PLUGIN =
3131
"+ciplugins/+jenkins/TaskRunProgressPlugin.m";
32+
private String actionID;
33+
34+
public String getActionID(){
35+
return this.actionID;
36+
}
3237

3338
public RunMatlabBuildAction(MatlabCommandRunner runner, BuildConsoleAnnotator annotator, BuildActionParameters params) {
3439
this.runner = runner;
40+
this.actionID = RandomStringUtils.randomAlphanumeric(8);
3541
this.annotator = annotator;
3642
this.params = params;
3743
}
@@ -49,11 +55,13 @@ public void run() throws IOException, InterruptedException, MatlabExecutionExcep
4955
runner.copyFileToTempFolder(DEFAULT_PLUGIN, DEFAULT_PLUGIN);
5056
runner.copyFileToTempFolder(BUILD_REPORT_PLUGIN, BUILD_REPORT_PLUGIN);
5157
runner.copyFileToTempFolder(TASK_RUN_PROGRESS_PLUGIN, TASK_RUN_PROGRESS_PLUGIN);
58+
5259

5360
// Set environment variable
5461
runner.addEnvironmentVariable(
5562
"MW_MATLAB_BUILDTOOL_DEFAULT_PLUGINS_FCN_OVERRIDE",
5663
"ciplugins.jenkins.getDefaultPlugins");
64+
runner.addEnvironmentVariable("MW_BUILD_PLUGIN_ACTION_ID",this.getActionID());
5765
runner.addEnvironmentVariable(
5866
"MW_MATLAB_TEMP_FOLDER",
5967
runner.getTempFolder().toString());
@@ -93,11 +101,11 @@ public void run() throws IOException, InterruptedException, MatlabExecutionExcep
93101
FilePath rootLocation = new FilePath(
94102
new File(
95103
build.getRootDir().getAbsolutePath(),
96-
"buildArtifact.json")
104+
"buildArtifact" + this.getActionID() + ".json")
97105
);
98106
jsonFile.copyTo(rootLocation);
99107
jsonFile.delete();
100-
build.addAction(new BuildArtifactAction(build));
108+
build.addAction(new BuildArtifactAction(build, this.getActionID()));
101109
}
102110
} catch (Exception e) {
103111
// Don't want to override more important error
@@ -111,5 +119,6 @@ public void run() throws IOException, InterruptedException, MatlabExecutionExcep
111119
}
112120
}
113121
}
122+
114123
}
115-
}
124+
}

src/main/resources/+ciplugins/+jenkins/TaskRunProgressPlugin.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
methods (Access=protected)
77

88
function runTask(plugin, pluginData)
9-
disp("[MATLAB-Build-" + pluginData.TaskResults.Name + "]");
9+
disp("[MATLAB-Build-" + pluginData.TaskResults.Name + "-" + getenv('MW_BUILD_PLUGIN_ACTION_ID') +"]");
1010
[email protected](plugin, pluginData);
1111
end
1212
end

src/main/resources/com/mathworks/ci/BuildArtifactAction/index.jelly

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,12 @@
5959
<j:forEach var="p" items="${it.buildArtifact}" varStatus="status">
6060
<tr>
6161
<td class="pane" align="left">
62-
<a href="../console#matlab-${p.taskName}">${p.taskName}</a>
62+
<a href="../console#matlab-${p.taskName}-${it.actionID}">${p.taskName}</a>
6363
</td>
6464
<td class="pane" style="width:9em">
6565
<span class="${pst.cssClass}">
6666
<j:if test="${p.taskFailed != false}">
67-
<a href="../console#matlab-${p.taskName}"><font color="#EF2929"> FAILED </font> </a>
67+
<a href="../console#matlab-${p.taskName}-${it.actionID}"><font color="#EF2929"> FAILED </font> </a>
6868
</j:if>
6969
<j:if test="${p.taskFailed == false}">
7070
<j:if test="${p.taskSkipped == false}">

src/main/resources/com/mathworks/ci/BuildArtifactAction/summary.jelly

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
xmlns:f="/lib/form"
77
xmlns:i="jelly:fmt">
88
<t:summary icon="document.png">
9-
<p><a href="buildresults">MATLAB Build Results</a></p>
9+
<p><a href="buildresults${it.actionID}">MATLAB Build Results</a></p>
1010
<span class="${pst.cssClass}">
1111
<j:if test="${it.totalCount == 0}">
1212
<font color="#EF2929"><h5>Unable to generate a build artifact. </h5></font>

src/test/java/integ/com/mathworks/ci/BuildArtifactActionTest.java

Lines changed: 57 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,14 @@ private URL getResource(String resource) {
7171
@Test
7272
public void verifyBuildArtifactsReturned() throws ExecutionException, InterruptedException, URISyntaxException, IOException, ParseException {
7373
FreeStyleBuild build = getFreestyleBuild();
74-
BuildArtifactAction ac = new BuildArtifactAction(build);
74+
final String actionID = "abc123";
75+
final String targetFile = "buildArtifact"+ actionID + ".json";
76+
BuildArtifactAction ac = new BuildArtifactAction(build, actionID);
7577
FilePath artifactRoot = new FilePath(build.getRootDir());
76-
copyFileInWorkspace("buildArtifacts/t1/buildArtifact.json","buildArtifact.json",artifactRoot);
78+
copyFileInWorkspace("buildArtifacts/t1/buildArtifact.json",targetFile,artifactRoot);
7779
List<BuildArtifactData> ba = ac.getBuildArtifact();
7880
int expectedSize = ba.size();
79-
Assert.assertEquals("The build names are not matching",3,expectedSize);
81+
Assert.assertEquals("Incorrect build artifact",3,expectedSize);
8082
}
8183

8284
/**
@@ -87,9 +89,11 @@ public void verifyBuildArtifactsReturned() throws ExecutionException, Interrupte
8789
@Test
8890
public void verifyFailedCount() throws ExecutionException, InterruptedException, URISyntaxException, IOException, ParseException {
8991
FreeStyleBuild build = getFreestyleBuild();
90-
BuildArtifactAction ac = new BuildArtifactAction(build);
92+
final String actionID = "abc123";
93+
final String targetFile = "buildArtifact"+ actionID + ".json";
94+
BuildArtifactAction ac = new BuildArtifactAction(build, actionID);
9195
FilePath artifactRoot = new FilePath(build.getRootDir());
92-
copyFileInWorkspace("buildArtifacts/t1/buildArtifact.json","buildArtifact.json",artifactRoot);
96+
copyFileInWorkspace("buildArtifacts/t1/buildArtifact.json",targetFile,artifactRoot);
9397
List<BuildArtifactData> ba = ac.getBuildArtifact();
9498
boolean expectedStatus = ba.get(0).getTaskFailed();
9599
Assert.assertEquals("The task is passed",false,expectedStatus);
@@ -103,9 +107,11 @@ public void verifyFailedCount() throws ExecutionException, InterruptedException,
103107
@Test
104108
public void verifySkipCount() throws ExecutionException, InterruptedException, URISyntaxException, IOException, ParseException {
105109
FreeStyleBuild build = getFreestyleBuild();
106-
BuildArtifactAction ac = new BuildArtifactAction(build);
110+
final String actionID = "abc123";
111+
final String targetFile = "buildArtifact"+ actionID + ".json";
112+
BuildArtifactAction ac = new BuildArtifactAction(build, actionID);
107113
FilePath artifactRoot = new FilePath(build.getRootDir());
108-
copyFileInWorkspace("buildArtifacts.t2/buildArtifact.json","buildArtifact.json",artifactRoot);
114+
copyFileInWorkspace("buildArtifacts.t2/buildArtifact.json",targetFile,artifactRoot);
109115
List<BuildArtifactData> ba = ac.getBuildArtifact();
110116
Assert.assertEquals("The task is not skipped",true,ba.get(0).getTaskSkipped());
111117
}
@@ -118,9 +124,11 @@ public void verifySkipCount() throws ExecutionException, InterruptedException, U
118124
@Test
119125
public void verifyDurationIsAccurate() throws ExecutionException, InterruptedException, URISyntaxException, IOException, ParseException {
120126
FreeStyleBuild build = getFreestyleBuild();
121-
BuildArtifactAction ac = new BuildArtifactAction(build);
127+
final String actionID = "abc123";
128+
final String targetFile = "buildArtifact"+ actionID + ".json";
129+
BuildArtifactAction ac = new BuildArtifactAction(build, actionID);
122130
FilePath artifactRoot = new FilePath(build.getRootDir());
123-
copyFileInWorkspace("buildArtifacts.t2/buildArtifact.json","buildArtifact.json",artifactRoot);
131+
copyFileInWorkspace("buildArtifacts.t2/buildArtifact.json",targetFile,artifactRoot);
124132
List<BuildArtifactData> ba = ac.getBuildArtifact();
125133
Assert.assertEquals("The task duration is not matching","00:02:53",ba.get(0).getTaskDuration());
126134
}
@@ -133,9 +141,11 @@ public void verifyDurationIsAccurate() throws ExecutionException, InterruptedExc
133141
@Test
134142
public void verifyTaskDescriptionIsAccurate() throws ExecutionException, InterruptedException, URISyntaxException, IOException, ParseException {
135143
FreeStyleBuild build = getFreestyleBuild();
136-
BuildArtifactAction ac = new BuildArtifactAction(build);
144+
final String actionID = "abc123";
145+
final String targetFile = "buildArtifact"+ actionID + ".json";
146+
BuildArtifactAction ac = new BuildArtifactAction(build, actionID);
137147
FilePath artifactRoot = new FilePath(build.getRootDir());
138-
copyFileInWorkspace("buildArtifacts.t2/buildArtifact.json","buildArtifact.json",artifactRoot);
148+
copyFileInWorkspace("buildArtifacts.t2/buildArtifact.json",targetFile,artifactRoot);
139149
List<BuildArtifactData> ba = ac.getBuildArtifact();
140150
Assert.assertEquals("The task description is not matching","Test show",ba.get(0).getTaskDescription());
141151
}
@@ -148,9 +158,11 @@ public void verifyTaskDescriptionIsAccurate() throws ExecutionException, Interru
148158
@Test
149159
public void verifyTaskNameIsAccurate() throws ExecutionException, InterruptedException, URISyntaxException, IOException, ParseException {
150160
FreeStyleBuild build = getFreestyleBuild();
151-
BuildArtifactAction ac = new BuildArtifactAction(build);
161+
final String actionID = "abc123";
162+
final String targetFile = "buildArtifact"+ actionID + ".json";
163+
BuildArtifactAction ac = new BuildArtifactAction(build, actionID);
152164
FilePath artifactRoot = new FilePath(build.getRootDir());
153-
copyFileInWorkspace("buildArtifacts.t2/buildArtifact.json","buildArtifact.json",artifactRoot);
165+
copyFileInWorkspace("buildArtifacts.t2/buildArtifact.json",targetFile,artifactRoot);
154166
List<BuildArtifactData> ba = ac.getBuildArtifact();
155167
Assert.assertEquals("The task name is not matching","show",ba.get(0).getTaskName());
156168
}
@@ -164,8 +176,10 @@ public void verifyTaskNameIsAccurate() throws ExecutionException, InterruptedExc
164176
public void verifyTotalTaskCountIsAccurate() throws ExecutionException, InterruptedException, URISyntaxException, IOException, ParseException {
165177
FreeStyleBuild build = getFreestyleBuild();
166178
FilePath artifactRoot = new FilePath(build.getRootDir());
167-
copyFileInWorkspace("buildArtifacts.t2/buildArtifact.json","buildArtifact.json",artifactRoot);
168-
BuildArtifactAction ac = new BuildArtifactAction(build);
179+
final String actionID = "abc123";
180+
final String targetFile = "buildArtifact"+ actionID + ".json";
181+
copyFileInWorkspace("buildArtifacts.t2/buildArtifact.json",targetFile,artifactRoot);
182+
BuildArtifactAction ac = new BuildArtifactAction(build, actionID);
169183
Assert.assertEquals("Total task count is not correct",1,ac.getTotalCount());
170184
}
171185

@@ -178,8 +192,10 @@ public void verifyTotalTaskCountIsAccurate() throws ExecutionException, Interrup
178192
public void verifyTotalTaskCountIsAccurate2() throws ExecutionException, InterruptedException, URISyntaxException, IOException, ParseException {
179193
FreeStyleBuild build = getFreestyleBuild();
180194
FilePath artifactRoot = new FilePath(build.getRootDir());
181-
copyFileInWorkspace("buildArtifacts/t1/buildArtifact.json","buildArtifact.json",artifactRoot);
182-
BuildArtifactAction ac = new BuildArtifactAction(build);
195+
final String actionID = "abc123";
196+
final String targetFile = "buildArtifact"+ actionID + ".json";
197+
copyFileInWorkspace("buildArtifacts/t1/buildArtifact.json",targetFile,artifactRoot);
198+
BuildArtifactAction ac = new BuildArtifactAction(build, actionID);
183199
Assert.assertEquals("Total task count is not correct",3,ac.getTotalCount());
184200
}
185201

@@ -192,8 +208,10 @@ public void verifyTotalTaskCountIsAccurate2() throws ExecutionException, Interru
192208
public void verifyTotalFailedTaskCountIsAccurate() throws ExecutionException, InterruptedException, URISyntaxException, IOException, ParseException {
193209
FreeStyleBuild build = getFreestyleBuild();
194210
FilePath artifactRoot = new FilePath(build.getRootDir());
195-
copyFileInWorkspace("buildArtifacts/t1/buildArtifact.json","buildArtifact.json",artifactRoot);
196-
BuildArtifactAction ac = new BuildArtifactAction(build);
211+
final String actionID = "abc123";
212+
final String targetFile = "buildArtifact"+ actionID + ".json";
213+
copyFileInWorkspace("buildArtifacts/t1/buildArtifact.json",targetFile,artifactRoot);
214+
BuildArtifactAction ac = new BuildArtifactAction(build, actionID);
197215
Assert.assertEquals("Total task count is not correct",3,ac.getTotalCount());
198216
Assert.assertEquals("Total task failed count is not correct",1,ac.getFailCount());
199217
}
@@ -206,12 +224,30 @@ public void verifyTotalFailedTaskCountIsAccurate() throws ExecutionException, In
206224
public void verifyTotalSkipTaskCountIsAccurate() throws ExecutionException, InterruptedException, URISyntaxException, IOException, ParseException {
207225
FreeStyleBuild build = getFreestyleBuild();
208226
FilePath artifactRoot = new FilePath(build.getRootDir());
209-
copyFileInWorkspace("buildArtifacts/t1/buildArtifact.json","buildArtifact.json",artifactRoot);
210-
BuildArtifactAction ac = new BuildArtifactAction(build);
227+
final String actionID = "abc123";
228+
final String targetFile = "buildArtifact"+ actionID + ".json";
229+
copyFileInWorkspace("buildArtifacts/t1/buildArtifact.json",targetFile,artifactRoot);
230+
BuildArtifactAction ac = new BuildArtifactAction(build, actionID);
211231
Assert.assertEquals("Total task count is not correct",3,ac.getTotalCount());
212232
Assert.assertEquals("Total task skip count is not correct",1,ac.getSkipCount());
213233
}
214234

235+
/**
236+
* Verify if ActionID is set correctly.
237+
*
238+
*/
239+
240+
@Test
241+
public void verifyActionIDisAppropriate() throws ExecutionException, InterruptedException, URISyntaxException, IOException, ParseException {
242+
FreeStyleBuild build = getFreestyleBuild();
243+
FilePath artifactRoot = new FilePath(build.getRootDir());
244+
final String actionID = "abc123";
245+
final String targetFile = "buildArtifact"+ actionID + ".json";
246+
copyFileInWorkspace("buildArtifacts/t1/buildArtifact.json",targetFile,artifactRoot);
247+
BuildArtifactAction ac = new BuildArtifactAction(build, actionID);
248+
Assert.assertEquals("Incorrect ActionID",actionID,ac.getActionID());
249+
}
250+
215251

216252

217253
private void copyFileInWorkspace(String sourceFile, String targetFile, FilePath targetWorkspace)

src/test/java/unit/com/mathworks/ci/actions/RunMatlabBuildActionTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ public void shouldCopyBuildResultsToRootAndAddAction() throws IOException, Inter
157157
// Should have deleted original file
158158
assertFalse(json.exists());
159159
// Should have copied file to root dir
160-
assertTrue(new File(dest, "buildArtifact.json").exists());
160+
assertTrue(new File(dest, "buildArtifact"+ action.getActionID() + ".json").exists());
161161
}
162162

163163
@Test

0 commit comments

Comments
 (0)