diff --git a/pom.xml b/pom.xml index 78e1ec7..d042c1c 100644 --- a/pom.xml +++ b/pom.xml @@ -99,6 +99,11 @@ org.jenkins-ci.plugins.workflow workflow-multibranch + + org.jenkins-ci.plugins + cloudbees-bitbucket-branch-source + true + org.jenkins-ci.plugins diff --git a/src/main/java/com/cloudbees/jenkins/plugins/BitbucketHookReceiver.java b/src/main/java/com/cloudbees/jenkins/plugins/BitbucketHookReceiver.java index 19db1a0..5d862da 100644 --- a/src/main/java/com/cloudbees/jenkins/plugins/BitbucketHookReceiver.java +++ b/src/main/java/com/cloudbees/jenkins/plugins/BitbucketHookReceiver.java @@ -17,7 +17,7 @@ * @author Nicolas De Loof */ @Extension -public class BitbucketHookReceiver implements UnprotectedRootAction { +public class BitbucketHookReceiver extends BitbucketCrumbExclusion implements UnprotectedRootAction { private final BitbucketPayloadProcessor payloadProcessor = new BitbucketPayloadProcessor(); public static final String BITBUCKET_HOOK_URL = "bitbucket-hook"; diff --git a/src/main/java/com/cloudbees/jenkins/plugins/BitbucketJobProbe.java b/src/main/java/com/cloudbees/jenkins/plugins/BitbucketJobProbe.java index cc0b9ea..100466a 100644 --- a/src/main/java/com/cloudbees/jenkins/plugins/BitbucketJobProbe.java +++ b/src/main/java/com/cloudbees/jenkins/plugins/BitbucketJobProbe.java @@ -33,9 +33,19 @@ import org.eclipse.jgit.transport.URIish; import com.google.common.base.Objects; import org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject; +import com.cloudbees.jenkins.plugins.bitbucket.BitbucketSCMSource; public class BitbucketJobProbe { + private boolean isBranchPluginAvailable = false; + + public BitbucketJobProbe() { + if (Jenkins.get().getPlugin("cloudbees-bitbucket-branch-source") != null) { + LOGGER.log(Level.FINEST, "Bitbucket branch source available"); + isBranchPluginAvailable = true; + } + } + public void triggerMatchingJobs(String user, String url, String scm, String payload) { triggerMatchingJobs(user, url, scm, payload, null); } @@ -56,7 +66,7 @@ public void triggerMatchingJobs(String user, String url, String scm, String payl bTrigger = (BitBucketTrigger) trigger; LOGGER.log(Level.FINE, "Job [{0}] has BitBucketTrigger", job.getName()); break; - } else if ( trigger instanceof BitBucketMultibranchTrigger){ + } else if (trigger instanceof BitBucketMultibranchTrigger) { LOGGER.fine("Trigger is BitBucketMultibranchTrigger"); } } @@ -98,7 +108,7 @@ public void triggerMatchingJobs(String user, String url, String scm, String payl LOGGER.finest("scmSourceOwner [" + scmSourceOwner.getName() + "] is of type WorkflowMultiBranchProject"); WorkflowMultiBranchProject workflowMultiBranchProject = (WorkflowMultiBranchProject) scmSourceOwner; AtomicReference bitBucketMultibranchTrigger = new AtomicReference<>(null); - if ( workflowMultiBranchProject.getTriggers().isEmpty()) { + if (workflowMultiBranchProject.getTriggers().isEmpty()) { LOGGER.finest("No triggers found"); } else { workflowMultiBranchProject.getTriggers().forEach(((triggerDescriptor, trigger) -> { @@ -108,10 +118,10 @@ public void triggerMatchingJobs(String user, String url, String scm, String payl } })); } - if ( bitBucketMultibranchTrigger.get() == null){ + if (bitBucketMultibranchTrigger.get() == null) { scmSourceOwner.onSCMSourceUpdated(scmSource); } else { - if (workflowMultiBranchProject.isBuildable()){ + if (workflowMultiBranchProject.isBuildable()) { bitBucketMultibranchTrigger.get().setPayload(payload); BitBucketPushCause bitBucketPushCause = new BitBucketPushCause(user); workflowMultiBranchProject.scheduleBuild2(0, new CauseAction(bitBucketPushCause)); @@ -125,19 +135,19 @@ public void triggerMatchingJobs(String user, String url, String scm, String payl } else if (scmSourceOwner instanceof WorkflowMultiBranchProject) { LOGGER.finest("scmSourceOwner [" + scmSourceOwner.getName() + "] is of type WorkflowMultiBranchProject"); WorkflowMultiBranchProject workflowMultiBranchProject = (WorkflowMultiBranchProject) scmSourceOwner; - if ( workflowMultiBranchProject.getTriggers().isEmpty()){ + if (workflowMultiBranchProject.getTriggers().isEmpty()) { LOGGER.finest("No triggers found"); } else { workflowMultiBranchProject.getTriggers().forEach(((triggerDescriptor, trigger) -> { - if ( trigger instanceof BitBucketMultibranchTrigger){ + if (trigger instanceof BitBucketMultibranchTrigger) { LOGGER.finest("Found BitBucketMultibranchTrigger type"); BitBucketMultibranchTrigger bitBucketMultibranchTrigger = (BitBucketMultibranchTrigger) trigger; - if ( bitBucketMultibranchTrigger.getOverrideUrl() == null || bitBucketMultibranchTrigger.getOverrideUrl().isEmpty()){ + if (bitBucketMultibranchTrigger.getOverrideUrl() == null || bitBucketMultibranchTrigger.getOverrideUrl().isEmpty()) { LOGGER.finest("Ignoring empty overrideUrl"); } else { LOGGER.fine("Found override URL [" + bitBucketMultibranchTrigger.getOverrideUrl() + "]"); LOGGER.log(Level.FINE, "Trying to match {0} ", remote + "<-->" + bitBucketMultibranchTrigger.getOverrideUrl()); - if ( bitBucketMultibranchTrigger.getOverrideUrl().equalsIgnoreCase(remote.toString())) { + if (bitBucketMultibranchTrigger.getOverrideUrl().equalsIgnoreCase(remote.toString())) { LOGGER.info(String.format("Triggering BitBucket scmSourceOwner [%s] by overrideUrl [%s]",scmSourceOwner.getName(), bitBucketMultibranchTrigger.getOverrideUrl())); scmSourceOwner.onSCMSourceUpdated(scmSource); } @@ -216,10 +226,21 @@ private boolean match(SCM scm, URIish url, String overrideUrl) { } private boolean match(SCMSource scm, URIish url) { - if (scm instanceof GitSCMSource) { - LOGGER.log(Level.FINEST, "SCMSource is GitSCMSource"); - String gitRemote = ((GitSCMSource) scm).getRemote(); + if (scm instanceof GitSCMSource || (isBranchPluginAvailable && scm instanceof BitbucketSCMSource)) { + String gitRemote; + if (scm instanceof GitSCMSource) { + LOGGER.log(Level.FINEST, "SCMSource is GitSCMSource"); + gitRemote = ((GitSCMSource) scm).getRemote(); + } else if (isBranchPluginAvailable) { + LOGGER.log(Level.FINEST, "SCMSource is BitbucketSCMSource"); + gitRemote = ((BitbucketSCMSource) scm).getServerUrl() + "/" + + ((BitbucketSCMSource) scm).getRepoOwner() + "/" + + ((BitbucketSCMSource) scm).getRepository(); + } else { + return false; + } URIish urIish; + LOGGER.log(Level.FINEST, "SCMSource remote is " + gitRemote); try { urIish = new URIish(gitRemote); } catch (URISyntaxException e) {