Skip to content

Commit 9d8ec33

Browse files
authored
Merge pull request #103 from tzachs/JENKINS-65697
Jenkins-65697 - feat - added BITBUCKET_PAYLOAD to multi-branch
2 parents 58422be + 9b733c4 commit 9d8ec33

File tree

5 files changed

+202
-2
lines changed

5 files changed

+202
-2
lines changed

pom.xml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,19 @@
9999
<artifactId>workflow-multibranch</artifactId>
100100
</dependency>
101101

102+
<dependency>
103+
<groupId>org.jenkins-ci.plugins</groupId>
104+
<artifactId>git</artifactId>
105+
<classifier>tests</classifier>
106+
<scope>test</scope>
107+
</dependency>
108+
<dependency>
109+
<groupId>org.jenkins-ci.plugins</groupId>
110+
<artifactId>scm-api</artifactId>
111+
<classifier>tests</classifier>
112+
<scope>test</scope>
113+
</dependency>
114+
102115
</dependencies>
103116

104117
</project>

src/main/java/com/cloudbees/jenkins/plugins/BitBucketMultibranchTrigger.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public class BitBucketMultibranchTrigger extends Trigger<WorkflowMultiBranchProj
2020
private static final Logger LOGGER = Logger.getLogger(BitBucketMultibranchTrigger.class.getName());
2121

2222
private String overrideUrl;
23+
private String payload;
2324

2425
@DataBoundConstructor
2526
public BitBucketMultibranchTrigger() { }
@@ -34,6 +35,14 @@ public void setOverrideUrl(String overrideUrl){
3435
this.overrideUrl = overrideUrl;
3536
}
3637

38+
public void setPayload(String payload) {
39+
this.payload = payload;
40+
}
41+
42+
public String getPayload() {
43+
return payload;
44+
}
45+
3746
@Extension
3847
public static class MultibranchDescriptor extends TriggerDescriptor {
3948

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.cloudbees.jenkins.plugins;
2+
3+
import edu.umd.cs.findbugs.annotations.NonNull;
4+
import hudson.EnvVars;
5+
import hudson.Extension;
6+
import hudson.model.*;
7+
import jenkins.branch.MultiBranchProject;
8+
9+
import java.io.IOException;
10+
import java.util.concurrent.atomic.AtomicReference;
11+
import java.util.logging.Logger;
12+
13+
@Extension
14+
public class BitbucketEnvironmentContributor extends EnvironmentContributor {
15+
private static final Logger LOGGER = Logger.getLogger(BitbucketEnvironmentContributor.class.getName());
16+
17+
@Override
18+
public void buildEnvironmentFor(@NonNull Run r, @NonNull EnvVars envs, @NonNull TaskListener listener) throws IOException, InterruptedException {
19+
super.buildEnvironmentFor(r, envs, listener);
20+
}
21+
22+
@SuppressWarnings("rawtypes")
23+
@Override
24+
public void buildEnvironmentFor(@NonNull Job j, @NonNull EnvVars envs, @NonNull TaskListener listener) throws IOException, InterruptedException {
25+
super.buildEnvironmentFor(j, envs, listener);
26+
ItemGroup parent = j.getParent();
27+
AtomicReference<BitBucketMultibranchTrigger> bitBucketMultibranchTrigger = new AtomicReference<>(null);
28+
if ( parent instanceof MultiBranchProject){
29+
((MultiBranchProject<?, ?>) parent).getTriggers().forEach((triggerDescriptor, trigger) -> {
30+
if ( trigger instanceof BitBucketMultibranchTrigger){
31+
bitBucketMultibranchTrigger.set((BitBucketMultibranchTrigger) trigger);
32+
}
33+
});
34+
}
35+
36+
if ( bitBucketMultibranchTrigger.get() != null){
37+
if ( bitBucketMultibranchTrigger.get().getPayload() == null){
38+
LOGGER.finest("BITBUCKET_PAYLOAD is null, ignoring");
39+
} else {
40+
envs.put("BITBUCKET_PAYLOAD", bitBucketMultibranchTrigger.get().getPayload());
41+
}
42+
}
43+
}
44+
}

src/main/java/com/cloudbees/jenkins/plugins/BitbucketJobProbe.java

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.cloudbees.jenkins.plugins;
22

3+
import hudson.model.CauseAction;
34
import hudson.model.Job;
45
import hudson.plugins.git.GitSCM;
56
import hudson.plugins.git.GitStatus;
@@ -12,6 +13,7 @@
1213
import java.net.URI;
1314
import java.util.ArrayList;
1415
import java.util.List;
16+
import java.util.concurrent.atomic.AtomicReference;
1517
import java.util.logging.Level;
1618
import java.util.logging.Logger;
1719

@@ -92,8 +94,34 @@ public void triggerMatchingJobs(String user, String url, String scm, String payl
9294
for (SCMSource scmSource : scmSources) {
9395
LOGGER.log(Level.FINER, "Considering candidate scmSource {0}", scmSource);
9496
if (match(scmSource, remote)) {
95-
LOGGER.log(Level.FINER, "Triggering BitBucket scmSourceOwner [{0}]", scmSourceOwner);
96-
scmSourceOwner.onSCMSourceUpdated(scmSource);
97+
if (scmSourceOwner instanceof WorkflowMultiBranchProject) {
98+
LOGGER.finest("scmSourceOwner [" + scmSourceOwner.getName() + "] is of type WorkflowMultiBranchProject");
99+
WorkflowMultiBranchProject workflowMultiBranchProject = (WorkflowMultiBranchProject) scmSourceOwner;
100+
AtomicReference<BitBucketMultibranchTrigger> bitBucketMultibranchTrigger = new AtomicReference<>(null);
101+
if ( workflowMultiBranchProject.getTriggers().isEmpty()) {
102+
LOGGER.finest("No triggers found");
103+
} else {
104+
workflowMultiBranchProject.getTriggers().forEach(((triggerDescriptor, trigger) -> {
105+
if (trigger instanceof BitBucketMultibranchTrigger) {
106+
LOGGER.finest("Found BitBucketMultibranchTrigger type");
107+
bitBucketMultibranchTrigger.set((BitBucketMultibranchTrigger) trigger);
108+
}
109+
}));
110+
}
111+
if ( bitBucketMultibranchTrigger.get() == null){
112+
scmSourceOwner.onSCMSourceUpdated(scmSource);
113+
} else {
114+
if (workflowMultiBranchProject.isBuildable()){
115+
bitBucketMultibranchTrigger.get().setPayload(payload);
116+
BitBucketPushCause bitBucketPushCause = new BitBucketPushCause(user);
117+
workflowMultiBranchProject.scheduleBuild2(0, new CauseAction(bitBucketPushCause));
118+
} else {
119+
LOGGER.finest("workflowMultiBranchProject is not builtable");
120+
}
121+
}
122+
} else {
123+
scmSourceOwner.onSCMSourceUpdated(scmSource);
124+
}
97125
} else if (scmSourceOwner instanceof WorkflowMultiBranchProject) {
98126
LOGGER.finest("scmSourceOwner [" + scmSourceOwner.getName() + "] is of type WorkflowMultiBranchProject");
99127
WorkflowMultiBranchProject workflowMultiBranchProject = (WorkflowMultiBranchProject) scmSourceOwner;
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package com.cloudbees.jenkins.plugins;
2+
3+
import edu.umd.cs.findbugs.annotations.NonNull;
4+
import hudson.EnvVars;
5+
import hudson.console.AnnotatedLargeText;
6+
import hudson.model.*;
7+
import jenkins.branch.BranchSource;
8+
import jenkins.branch.MultiBranchProject;
9+
import jenkins.plugins.git.GitSCMSource;
10+
import jenkins.plugins.git.GitSampleRepoRule;
11+
import jenkins.plugins.git.traits.BranchDiscoveryTrait;
12+
import org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject;
13+
import org.jenkinsci.plugins.workflow.job.WorkflowJob;
14+
import org.jenkinsci.plugins.workflow.job.WorkflowRun;
15+
import org.jvnet.hudson.test.JenkinsRule;
16+
import org.junit.Rule;
17+
import org.junit.Test;
18+
19+
import java.io.ByteArrayOutputStream;
20+
import java.io.IOException;
21+
import java.nio.charset.StandardCharsets;
22+
import java.util.Objects;
23+
24+
import static org.junit.Assert.*;
25+
26+
27+
@SuppressWarnings({"rawtypes", "ResultOfMethodCallIgnored"})
28+
public class BitbucketMultibranchTest {
29+
30+
@Rule
31+
public JenkinsRule jenkinsRule = new JenkinsRule();
32+
33+
@Rule
34+
public GitSampleRepoRule sampleRepo = new GitSampleRepoRule();
35+
36+
37+
@Test
38+
public void testWorkflowMultiBranchProject() throws Exception{
39+
BitbucketEnvironmentContributor instance =
40+
jenkinsRule.jenkins.getExtensionList(EnvironmentContributor.class).get(BitbucketEnvironmentContributor.class);
41+
assertNotNull(instance);
42+
43+
44+
// Initialize a Git repository
45+
sampleRepo.init();
46+
sampleRepo.write("Jenkinsfile", "pipeline { agent any; triggers { bitbucketPush } stages { stage('Build') { steps { echo 'Building...' } } } }");
47+
sampleRepo.git("add", "Jenkinsfile");
48+
sampleRepo.git("commit", "--message=Initial commit");
49+
50+
// Create a new WorkflowMultiBranchProject
51+
WorkflowMultiBranchProject workflowMultiBranchProject = jenkinsRule.jenkins.createProject(WorkflowMultiBranchProject.class, "my-project");
52+
53+
// Add a GitSCMSource to the project
54+
GitSCMSource gitSource = new GitSCMSource(sampleRepo.toString());
55+
gitSource.getTraits().add(new BranchDiscoveryTrait());
56+
57+
workflowMultiBranchProject.getSourcesList().add(new BranchSource(gitSource));
58+
59+
// Schedule and find a branch project
60+
WorkflowJob job = scheduleAndFindBranchProject(workflowMultiBranchProject);
61+
62+
63+
// Get the last build and perform assertions
64+
WorkflowRun build = job.getLastBuild();
65+
assertNotNull(build);
66+
assertEquals(1, build.getNumber());
67+
jenkinsRule.assertBuildStatusSuccess(build);
68+
jenkinsRule.assertLogContains("Branch indexing", build);
69+
}
70+
71+
private static class Bla extends CauseAction implements EnvironmentContributingAction {
72+
73+
@Override
74+
public void buildEnvironment(@NonNull Run<?, ?> run, @NonNull EnvVars env) {
75+
EnvironmentContributingAction.super.buildEnvironment(run, env);
76+
env.put("BITBUCKET_PAYLOAD", "checking_payload");
77+
}
78+
}
79+
80+
private WorkflowJob scheduleAndFindBranchProject(WorkflowMultiBranchProject workflowMultiBranchProject) throws Exception {
81+
82+
// Schedule indexing and wait for completion
83+
Queue.Item queueItem = workflowMultiBranchProject.scheduleBuild2(0,
84+
new CauseAction(new BitBucketPushCause("tzachs")), new Bla());
85+
86+
Queue.Executable executable = Objects.requireNonNull(queueItem).getFuture().get();
87+
if ( executable instanceof MultiBranchProject.BranchIndexing){
88+
MultiBranchProject.BranchIndexing branchIndexing = (MultiBranchProject.BranchIndexing) executable;
89+
String multiBranchLog = getLog(branchIndexing.getLogText());
90+
jenkinsRule.assertStringContains(multiBranchLog, "Starting branch indexing");
91+
jenkinsRule.assertStringContains(multiBranchLog, "Started by BitBucket push by tzachs");
92+
}
93+
jenkinsRule.waitUntilNoActivity();
94+
95+
return workflowMultiBranchProject.getItem("master");
96+
97+
}
98+
99+
private String getLog(AnnotatedLargeText logText) throws IOException {
100+
ByteArrayOutputStream baos = new ByteArrayOutputStream();
101+
102+
logText.writeLogTo(0, baos);
103+
104+
return baos.toString(StandardCharsets.UTF_8);
105+
}
106+
}

0 commit comments

Comments
 (0)