Skip to content

Commit

Permalink
Merge pull request #18 from fbelzunc/JENKINS-28882
Browse files Browse the repository at this point in the history
[FIXED JENKINS-28882] Workflow support for BitBucket trigger
  • Loading branch information
fbelzunc committed Aug 4, 2015
2 parents 97c9620 + 4641895 commit fcdb2d9
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 22 deletions.
6 changes: 3 additions & 3 deletions pom.xml
Expand Up @@ -4,7 +4,7 @@
<parent>
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>plugin</artifactId>
<version>1.554</version>
<version>1.580.1</version> <!-- minimun required version to work with Workflow 1.4 SCMTriggerItem was added in 1.568. 1.580.x is the next LTS after that-->
</parent>

<artifactId>bitbucket</artifactId>
Expand Down Expand Up @@ -58,10 +58,10 @@
</build>

<dependencies>
<dependency>
<dependency> <!-- minimun required version to work with Workflow 1.4 GitSCM step-->
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>git</artifactId>
<version>2.0.3</version>
<version>2.3.5</version>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
Expand Down
22 changes: 15 additions & 7 deletions src/main/java/com/cloudbees/jenkins/plugins/BitBucketTrigger.java
Expand Up @@ -3,14 +3,16 @@
import hudson.Extension;
import hudson.Util;
import hudson.console.AnnotatedLargeText;
import hudson.model.AbstractProject;
import hudson.model.Action;
import hudson.model.Hudson;
import hudson.model.Item;
import hudson.model.Job;
import hudson.triggers.Trigger;
import hudson.triggers.TriggerDescriptor;
import hudson.util.SequentialExecutionQueue;
import hudson.util.StreamTaskListener;
import jenkins.model.ParameterizedJobMixIn;
import jenkins.triggers.SCMTriggerItem;
import org.apache.commons.jelly.XMLOutput;
import org.kohsuke.stapler.DataBoundConstructor;

Expand All @@ -29,7 +31,7 @@
/**
* @author <a href="mailto:nicolas.deloof@gmail.com">Nicolas De Loof</a>
*/
public class BitBucketTrigger extends Trigger<AbstractProject> {
public class BitBucketTrigger extends Trigger<Job<?, ?>> {

@DataBoundConstructor
public BitBucketTrigger() {
Expand All @@ -48,7 +50,7 @@ private boolean runPolling() {
PrintStream logger = listener.getLogger();
long start = System.currentTimeMillis();
logger.println("Started on "+ DateFormat.getDateTimeInstance().format(new Date()));
boolean result = job.poll(listener).hasChanges();
boolean result = SCMTriggerItem.SCMTriggerItems.asSCMTriggerItem(job).poll(listener).hasChanges();
logger.println("Done. Took "+ Util.getTimeSpanString(System.currentTimeMillis()-start));
if(result)
logger.println("Changes found");
Expand Down Expand Up @@ -82,8 +84,13 @@ public void run() {
LOGGER.log(Level.WARNING, "Failed to parse the polling log",e);
cause = new BitBucketPushCause(pushBy);
}
if (job.scheduleBuild(cause)) {
LOGGER.info("SCM changes detected in "+ job.getName()+". Triggering "+name);
ParameterizedJobMixIn pJob = new ParameterizedJobMixIn() {
@Override protected Job asJob() {
return job;
}
};
if (pJob.scheduleBuild(cause)) {
LOGGER.info("SCM changes detected in "+ job.getName()+". Triggering "+ name);
} else {
LOGGER.info("SCM changes detected in "+ job.getName()+". Job is already in the queue");
}
Expand Down Expand Up @@ -122,7 +129,7 @@ public DescriptorImpl getDescriptor() {
* Action object for {@link Project}. Used to display the polling log.
*/
public final class BitBucketWebHookPollingAction implements Action {
public AbstractProject<?,?> getOwner() {
public Job<?,?> getOwner() {
return job;
}

Expand Down Expand Up @@ -156,7 +163,8 @@ public static class DescriptorImpl extends TriggerDescriptor {

@Override
public boolean isApplicable(Item item) {
return item instanceof AbstractProject;
return item instanceof Job && SCMTriggerItem.SCMTriggerItems.asSCMTriggerItem(item) != null
&& item instanceof ParameterizedJobMixIn.ParameterizedJob;
}

@Override
Expand Down
44 changes: 32 additions & 12 deletions src/main/java/com/cloudbees/jenkins/plugins/BitbucketJobProbe.java
@@ -1,17 +1,20 @@
package com.cloudbees.jenkins.plugins;

import hudson.model.AbstractProject;
import hudson.model.Hudson;
import hudson.model.Job;
import hudson.plugins.git.GitSCM;
import hudson.plugins.git.GitStatus;
import hudson.scm.SCM;
import hudson.security.ACL;

import java.net.URISyntaxException;
import java.util.logging.Level;
import java.util.logging.Logger;

import hudson.triggers.Trigger;
import jenkins.model.Jenkins;

import jenkins.model.ParameterizedJobMixIn;
import jenkins.triggers.SCMTriggerItem;
import org.acegisecurity.context.SecurityContext;
import org.acegisecurity.context.SecurityContextHolder;
import org.eclipse.jgit.transport.RemoteConfig;
Expand All @@ -24,24 +27,41 @@ public void triggerMatchingJobs(String user, String url, String scm) {
SecurityContext old = Jenkins.getInstance().getACL().impersonate(ACL.SYSTEM);
try {
URIish remote = new URIish(url);
for (AbstractProject<?,?> job : Hudson.getInstance().getAllItems(AbstractProject.class)) {
LOGGER.info("considering candidate job " + job.getName());
BitBucketTrigger trigger = job.getTrigger(BitBucketTrigger.class);
if (trigger!=null) {
if (match(job.getScm(), remote)) {
trigger.onPost(user);
} else LOGGER.info("job SCM doesn't match remote repo");
} else LOGGER.info("job hasn't BitBucketTrigger set");
for (Job<?,?> job : Jenkins.getInstance().getAllItems(Job.class)) {
BitBucketTrigger bTrigger = null;
LOGGER.log(Level.FINE, "Considering candidate job {0}", job.getName());

if (job instanceof ParameterizedJobMixIn.ParameterizedJob) {
ParameterizedJobMixIn.ParameterizedJob pJob = (ParameterizedJobMixIn.ParameterizedJob) job;
for (Trigger trigger : pJob.getTriggers().values()) {
if (trigger instanceof BitBucketTrigger) {
bTrigger = (BitBucketTrigger) trigger;
break;
}
}
}
if (bTrigger != null) {
LOGGER.log(Level.FINE, "Considering to poke {0}", job.getFullDisplayName());
SCMTriggerItem item = SCMTriggerItem.SCMTriggerItems.asSCMTriggerItem(job);

for (SCM scmTrigger : item.getSCMs()) {
if (match(scmTrigger, remote)) {
LOGGER.log(Level.INFO, "Triggering BitBucket job {0}", job.getName());
bTrigger.onPost(user);
} else LOGGER.log(Level.FINE, "{0} SCM doesn't match remote repo {1}", new Object[]{job.getName(), remote});
}
} else
LOGGER.log(Level.FINE, "{0} hasn't BitBucketTrigger set", job.getName());
}
} catch (URISyntaxException e) {
LOGGER.warning("invalid repository URL " + url);
LOGGER.log(Level.WARNING, "Invalid repository URL {0}", url);
} finally {
SecurityContextHolder.setContext(old);
}

} else {
// TODO hg
throw new UnsupportedOperationException("unsupported SCM type " + scm);
throw new UnsupportedOperationException("Unsupported SCM type " + scm);
}
}

Expand Down

0 comments on commit fcdb2d9

Please sign in to comment.