Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit b6fda7c

Browse files
committed
Merge pull request jenkinsci#18 from quidryan/parentofparent
Clone of spark404's Parent of Parent fix
2 parents 78fd99e + f765542 commit b6fda7c

2 files changed

Lines changed: 58 additions & 4 deletions

File tree

src/main/java/hudson/plugins/copyartifact/TriggeredBuildSelector.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
*/
2424
package hudson.plugins.copyartifact;
2525

26+
import jenkins.model.Jenkins;
2627
import hudson.EnvVars;
2728
import hudson.Extension;
2829
import hudson.matrix.MatrixConfiguration;
@@ -59,10 +60,24 @@ public Run<?,?> getBuild(Job<?,?> job, EnvVars env, BuildFilter filter, Run<?,?>
5960
// Matrix run is triggered by its parent project, so check causes of parent build:
6061
for (Cause cause : parent instanceof MatrixRun
6162
? ((MatrixRun)parent).getParentBuild().getCauses() : parent.getCauses()) {
62-
if (cause instanceof UpstreamCause
63-
&& jobName.equals(((UpstreamCause)cause).getUpstreamProject())) {
64-
Run<?,?> run = job.getBuildByNumber(((UpstreamCause)cause).getUpstreamBuild());
65-
return (run != null && filter.isSelectable(run, env)) ? run : null;
63+
if (cause instanceof UpstreamCause) {
64+
UpstreamCause upstream = (UpstreamCause) cause;
65+
if (jobName.equals(upstream.getUpstreamProject())) {
66+
Run<?,?> run = job.getBuildByNumber(upstream.getUpstreamBuild());
67+
return (run != null && filter.isSelectable(run, env)) ? run : null;
68+
} else {
69+
// Figure out the parent job and do a recursive call to getBuild
70+
String parentJobName = upstream.getUpstreamProject();
71+
Job <?,?> parentJob = Jenkins.getInstance().getItemByFullName(parentJobName, Job.class);
72+
Run<?,?> run = getBuild(
73+
job,
74+
env,
75+
filter,
76+
parentJob.getBuildByNumber(upstream.getUpstreamBuild()));
77+
if (run != null && filter.isSelectable(run, env)) {
78+
return run;
79+
}
80+
}
6681
}
6782
}
6883
if (isFallbackToLastSuccessful()) {

src/test/java/hudson/plugins/copyartifact/CopyArtifactTest.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,45 @@ public void testTriggeredBuildSelector() throws Exception {
527527
assertBuildStatus(Result.SUCCESS, p.scheduleBuild2(0, new UserCause()).get());
528528
}
529529

530+
public void testTriggeredBuildSelectorWithParentOfParent() throws Exception {
531+
FreeStyleProject grandparent = createArtifactProject(),
532+
parent = createFreeStyleProject(),
533+
p = createFreeStyleProject();
534+
p.getBuildersList().add(new CopyArtifact(grandparent.getName(), null,
535+
new TriggeredBuildSelector(false), "*.txt", "", false, false));
536+
parent.getPublishersList().add(new BuildTrigger(p.getFullName(), false));
537+
grandparent.getPublishersList().add(new BuildTrigger(parent.getFullName(), false));
538+
hudson.rebuildDependencyGraph();
539+
assertBuildStatusSuccess(grandparent.scheduleBuild2(0, new UserCause()));
540+
// parent#1 was triggered
541+
FreeStyleBuild b = parent.getBuildByNumber(1);
542+
for (int i = 0; b == null && i < 2000; i++) { Thread.sleep(10); b = p.getBuildByNumber(1); }
543+
assertNotNull(b);
544+
while (b.isBuilding()) Thread.sleep(10);
545+
assertBuildStatusSuccess(b);
546+
// p#1 was triggered, now building.
547+
b = p.getBuildByNumber(1);
548+
for (int i = 0; b == null && i < 2000; i++) { Thread.sleep(10); b = p.getBuildByNumber(1); }
549+
assertNotNull(b);
550+
while (b.isBuilding()) Thread.sleep(10);
551+
assertBuildStatusSuccess(b);
552+
assertFile(true, "foo.txt", b);
553+
assertFile(false, "subdir/subfoo.txt", b);
554+
// Verify error if build not triggered by upstream job:
555+
assertBuildStatus(Result.FAILURE, p.scheduleBuild2(0, new UserCause()).get());
556+
// test fallback
557+
558+
//run a failing build to make sure the fallback selects the last successful build
559+
grandparent.getPublishersList().clear();
560+
grandparent.getBuildersList().add(new FailureBuilder());
561+
assertBuildStatus(Result.FAILURE, grandparent.scheduleBuild2(0, new UserCause()).get());
562+
563+
p.getBuildersList().remove(CopyArtifact.class);
564+
p.getBuildersList().add(new CopyArtifact(grandparent.getName(), null,
565+
new TriggeredBuildSelector(true), "*.txt", "", false, false));
566+
assertBuildStatus(Result.SUCCESS, p.scheduleBuild2(0, new UserCause()).get());
567+
}
568+
530569
/**
531570
* When copying from a particular matrix configuration, the upstream project
532571
* is the matrix parent.

0 commit comments

Comments
 (0)