Skip to content

Commit

Permalink
JENKINS-35365 EMail-Ext Extended Pipeline Support - Recipient Providers
Browse files Browse the repository at this point in the history
  • Loading branch information
davidvanlaatum committed Jun 6, 2016
1 parent 0ad6339 commit e6ed1ee
Show file tree
Hide file tree
Showing 16 changed files with 427 additions and 68 deletions.
12 changes: 9 additions & 3 deletions pom.xml
Expand Up @@ -187,6 +187,12 @@
<version>${jenkins.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>credentials</artifactId>
<version>2.0.7</version>
<scope>test</scope>
</dependency>


<!-- static analysys -->
Expand Down Expand Up @@ -232,7 +238,7 @@
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>clirr-maven-plugin</artifactId>
<version>2.6.1</version>
<version>2.7</version>
<executions>
<execution>
<goals>
Expand All @@ -249,7 +255,7 @@
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId>
<version>3.0.1</version>
<version>3.0.3</version>
<configuration>
<xmlOutput>true</xmlOutput>
<findbugsXmlWithMessages>true</findbugsXmlWithMessages>
Expand All @@ -272,7 +278,7 @@
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>clirr-maven-plugin</artifactId>
<version>2.6.1</version>
<version>2.7</version>
<configuration>
<logResults>true</logResults>
<xmlOutputFile>${project.build.directory}/clirr-report.xml</xmlOutputFile>
Expand Down
93 changes: 93 additions & 0 deletions src/main/java/hudson/plugins/emailext/EmailExtRecipientStep.java
@@ -0,0 +1,93 @@
package hudson.plugins.emailext;

import hudson.EnvVars;
import hudson.Extension;
import hudson.model.Run;
import hudson.model.TaskListener;
import hudson.plugins.emailext.plugins.RecipientProvider;
import hudson.plugins.emailext.plugins.RecipientProviderDescriptor;
import org.jenkinsci.plugins.workflow.steps.AbstractStepDescriptorImpl;
import org.jenkinsci.plugins.workflow.steps.AbstractStepImpl;
import org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution;
import org.jenkinsci.plugins.workflow.steps.StepContextParameter;
import org.kohsuke.stapler.DataBoundConstructor;

import javax.inject.Inject;
import javax.mail.internet.InternetAddress;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

public class EmailExtRecipientStep extends AbstractStepImpl {
private List<RecipientProvider> recipientProviders;

@DataBoundConstructor
public EmailExtRecipientStep(List<RecipientProvider> recipientProviders) {
this.recipientProviders = recipientProviders;
}

public List<RecipientProvider> getRecipientProviders() {
return recipientProviders;
}

public static class Executor extends AbstractSynchronousNonBlockingStepExecution<String> {
private static final long serialVersionUID = 1L;

@Inject
private transient EmailExtRecipientStep step;

@StepContextParameter
private transient Run<?, ?> run;

@StepContextParameter
private transient TaskListener listener;

@StepContextParameter
private transient EnvVars env;

@Override
protected String run() throws Exception {
ExtendedEmailPublisher publisher = new ExtendedEmailPublisher();
ExtendedEmailPublisherContext context = new ExtendedEmailPublisherContext(publisher, run, null, null, listener);
Set<InternetAddress> to = new HashSet<>();
for (RecipientProvider provider : step.recipientProviders) {
provider.addRecipients(context, env, to, to, to);
}

StringBuilder rt = new StringBuilder();

Iterator<InternetAddress> iterator = to.iterator();
while (iterator.hasNext()) {
rt.append(iterator.next().toString());
if (iterator.hasNext()) {
rt.append(" ");
}
}

return rt.toString();
}
}

@Extension(optional = true)
public static final class DescriptorImpl extends AbstractStepDescriptorImpl {
public DescriptorImpl() {
super(Executor.class);
}

@Override
public String getFunctionName() {
return "emailextrecipients";
}

@Override
public String getDisplayName() {
return "Extended Email Recipients";
}

@SuppressWarnings("unused")
public List<RecipientProviderDescriptor> getRecipientProvidersDescriptors() {
return RecipientProvider.allSupporting("org.jenkinsci.plugins.workflow.job.WorkflowJob");
}
}
}
28 changes: 25 additions & 3 deletions src/main/java/hudson/plugins/emailext/EmailExtStep.java
Expand Up @@ -6,12 +6,14 @@
import hudson.Extension;
import hudson.FilePath;
import hudson.Launcher;
import hudson.Util;
import hudson.model.Run;
import hudson.model.TaskListener;
import hudson.plugins.emailext.plugins.EmailTrigger;
import hudson.plugins.emailext.plugins.RecipientProvider;
import hudson.plugins.emailext.plugins.RecipientProviderDescriptor;
import hudson.plugins.emailext.plugins.trigger.AlwaysTrigger;
import jenkins.model.Jenkins;
import hudson.Util;
import org.apache.commons.lang.StringUtils;
import org.jenkinsci.plugins.workflow.steps.AbstractStepDescriptorImpl;
import org.jenkinsci.plugins.workflow.steps.AbstractStepImpl;
Expand All @@ -21,7 +23,7 @@
import org.kohsuke.stapler.DataBoundSetter;

import javax.annotation.CheckForNull;
import javax.management.Descriptor;
import java.util.List;

/**
* Created by acearl on 9/14/2015.
Expand Down Expand Up @@ -49,6 +51,8 @@ public class EmailExtStep extends AbstractStepImpl {

private boolean compressLog;

private List<RecipientProvider> recipientProviders;

@DataBoundConstructor
public EmailExtStep(String subject, String body) {
this.subject = subject;
Expand Down Expand Up @@ -111,6 +115,15 @@ public void setCompressLog(boolean compressLog) {
this.compressLog = compressLog;
}

@DataBoundSetter
public void setRecipientProviders(List<RecipientProvider> recipientProviders) {
this.recipientProviders = recipientProviders;
}

public List<? extends RecipientProvider> getRecipientProviders() {
return recipientProviders;
}

public static class EmailExtStepExecution extends AbstractSynchronousNonBlockingStepExecution<Void> {

private static final long serialVersionUID = 1L;
Expand All @@ -136,7 +149,11 @@ protected Void run() throws Exception {
publisher.configuredTriggers.clear();

AlwaysTrigger.DescriptorImpl descriptor = Jenkins.getActiveInstance().getDescriptorByType(AlwaysTrigger.DescriptorImpl.class);
publisher.configuredTriggers.add(descriptor.createDefault());
EmailTrigger trigger = descriptor.createDefault();
if (step.recipientProviders != null) {
trigger.getEmail().addRecipientProviders(step.recipientProviders);
}
publisher.configuredTriggers.add(trigger);

publisher.defaultSubject = step.subject;
publisher.defaultContent = step.body;
Expand Down Expand Up @@ -188,5 +205,10 @@ public String getFunctionName() {
public String getDisplayName() {
return "Extended Email";
}

@SuppressWarnings("unused")
public List<RecipientProviderDescriptor> getRecipientProvidersDescriptors() {
return RecipientProvider.allSupporting("org.jenkinsci.plugins.workflow.job.WorkflowJob");
}
}
}
Expand Up @@ -2,8 +2,12 @@

import hudson.EnvVars;
import hudson.ExtensionPoint;
import hudson.model.Job;
import hudson.plugins.emailext.ExtendedEmailPublisherContext;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import javax.mail.internet.InternetAddress;

Expand All @@ -20,6 +24,25 @@ public static DescriptorExtensionList<RecipientProvider, RecipientProviderDescri
return Jenkins.getActiveInstance().getDescriptorList(RecipientProvider.class);
}

public static List<RecipientProviderDescriptor> allSupporting(Class<? extends Job> clazz) {
List<RecipientProviderDescriptor> rt = new ArrayList<>();
for (RecipientProviderDescriptor recipientProviderDescriptor : all()) {
if (recipientProviderDescriptor.isApplicable(clazz)) {
rt.add(recipientProviderDescriptor);
}
}
return rt;
}

@SuppressWarnings("unchecked")
public static List<RecipientProviderDescriptor> allSupporting(String clazz) {
try {
return allSupporting((Class<? extends Job>) Class.forName(clazz));
} catch (ClassNotFoundException e) {
return Collections.emptyList();
}
}

@Override
public RecipientProviderDescriptor getDescriptor() {
return (RecipientProviderDescriptor) super.getDescriptor();
Expand Down
@@ -1,6 +1,7 @@
package hudson.plugins.emailext.plugins;

import hudson.model.Descriptor;
import hudson.model.Job;

/**
* @author acearl
Expand All @@ -9,4 +10,8 @@ public abstract class RecipientProviderDescriptor extends Descriptor<RecipientPr

protected RecipientProviderDescriptor() {
}

public boolean isApplicable(Class<? extends Job> jobType) {
return true;
}
}
Expand Up @@ -7,15 +7,19 @@
package hudson.plugins.emailext.plugins.recipients;

import hudson.model.AbstractBuild;
import hudson.model.Result;
import hudson.model.Run;
import hudson.plugins.emailext.EmailRecipientUtils;
import hudson.model.User;
import hudson.plugins.emailext.plugins.RecipientProviderDescriptor;
import hudson.plugins.emailext.plugins.RecipientProvider;
import hudson.EnvVars;
import hudson.Extension;
import hudson.model.User;
import hudson.plugins.emailext.ExtendedEmailPublisherContext;
import hudson.plugins.emailext.ExtendedEmailPublisherDescriptor;

import java.io.PrintStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import javax.mail.internet.InternetAddress;
import jenkins.model.Jenkins;
Expand All @@ -34,25 +38,40 @@ public CulpritsRecipientProvider() {
}

@Override
public void addRecipients(ExtendedEmailPublisherContext context, EnvVars env, Set<InternetAddress> to, Set<InternetAddress> cc, Set<InternetAddress> bcc) {
ExtendedEmailPublisherDescriptor descriptor = Jenkins.getActiveInstance().getDescriptorByType(ExtendedEmailPublisherDescriptor.class);
public void addRecipients(final ExtendedEmailPublisherContext context, EnvVars env, Set<InternetAddress> to, Set<InternetAddress> cc, Set<InternetAddress> bcc) {
final class Debug implements RecipientProviderUtilities.IDebug {
private final ExtendedEmailPublisherDescriptor descriptor
= Jenkins.getActiveInstance().getDescriptorByType(ExtendedEmailPublisherDescriptor.class);

private final PrintStream logger = context.getListener().getLogger();

public void send(final String format, final Object... args) {
descriptor.debug(logger, format, args);
}
}
final Debug debug = new Debug();
Run<?,?> run = context.getRun();
if (run instanceof AbstractBuild) {
Set<User> users = ((AbstractBuild<?,?>)run).getCulprits();
for (User user : users) {
if (!EmailRecipientUtils.isExcludedRecipient(user, context.getListener())) {
String userAddress = EmailRecipientUtils.getUserConfiguredEmail(user);
if (userAddress != null) {
descriptor.debug(context.getListener().getLogger(), "Adding user address %s, they were not considered an excluded committer", userAddress);
EmailRecipientUtils.addAddressesFromRecipientList(to, cc, bcc, userAddress, env, context.getListener());
RecipientProviderUtilities.addUsers(users, context.getListener(), env, to, cc, bcc, debug);
} else if (run.getResult() != null && run.getResult().isWorseThan(Result.SUCCESS)) {
List<Run<?, ?>> builds = new ArrayList<>();
Run<?, ?> build = run;
while (build != null) {
if (build.getResult() != null) {
if (build.getResult().isWorseThan(Result.SUCCESS)) {
builds.add(build);
} else {
context.getListener().getLogger().println("Failed to send e-mail to " + user.getFullName() + " because no e-mail address is known, and no default e-mail domain is configured");
break;
}
}
build = build.getPreviousCompletedBuild();
}
Set<User> users = RecipientProviderUtilities.getChangeSetAuthors(builds, debug);
RecipientProviderUtilities.addUsers(users, context.getListener(), env, to, cc, bcc, debug);
}
}

@Extension
public static final class DescriptorImpl extends RecipientProviderDescriptor {

Expand Down

0 comments on commit e6ed1ee

Please sign in to comment.