提交 16709852 编写于 作者: B brucechapman

[FIX HUDSON-2580] "Email Notification" action does not work as a Promotion plugin action

Cause: Mailer extends Publisher extends BuildStepCompatibilityLayer without
overriding BuildStepCompatibilityLayer's version of perform(AbstractBuild...)
therefore perform() does nothing except return true.

Fix: Override the new perform signature in Mailer.

Getting this to work involved removing a whole swag of pointless generics in
MailSender which doesn't actually care about the specific type of AbstractBuild
or AbstractProject so wildcards can be used, simplifying things quite a lot.


git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@14253 71c3de6d-444a-0410-be80-ed276b4c234a
上级 055b1ce3
...@@ -27,7 +27,7 @@ public class MavenMailer extends MavenReporter { ...@@ -27,7 +27,7 @@ public class MavenMailer extends MavenReporter {
public boolean sendToIndividuals; public boolean sendToIndividuals;
public boolean end(MavenBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { public boolean end(MavenBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException {
new MailSender<MavenModule,MavenBuild>(recipients,dontNotifyEveryUnstableBuild,sendToIndividuals).execute(build,listener); new MailSender(recipients,dontNotifyEveryUnstableBuild,sendToIndividuals).execute(build,listener);
return true; return true;
} }
......
...@@ -31,7 +31,7 @@ import java.util.regex.Pattern; ...@@ -31,7 +31,7 @@ import java.util.regex.Pattern;
* @author Jesse Glick * @author Jesse Glick
* @author Kohsuke Kawaguchi * @author Kohsuke Kawaguchi
*/ */
public class MailSender<P extends AbstractProject<P, B>, B extends AbstractBuild<P, B>> { public class MailSender {
/** /**
* Whitespace-separated list of e-mail addresses that represent recipients. * Whitespace-separated list of e-mail addresses that represent recipients.
*/ */
...@@ -54,13 +54,13 @@ public class MailSender<P extends AbstractProject<P, B>, B extends AbstractBuild ...@@ -54,13 +54,13 @@ public class MailSender<P extends AbstractProject<P, B>, B extends AbstractBuild
this.sendToIndividuals = sendToIndividuals; this.sendToIndividuals = sendToIndividuals;
} }
public boolean execute(B build, BuildListener listener) throws InterruptedException { public boolean execute(AbstractBuild<?, ?> build, BuildListener listener) throws InterruptedException {
try { try {
MimeMessage mail = getMail(build, listener); MimeMessage mail = getMail(build, listener);
if (mail != null) { if (mail != null) {
// if the previous e-mail was sent for a success, this new e-mail // if the previous e-mail was sent for a success, this new e-mail
// is not a follow up // is not a follow up
B pb = build.getPreviousBuild(); AbstractBuild<?, ?> pb = build.getPreviousBuild();
if(pb!=null && pb.getResult()==Result.SUCCESS) { if(pb!=null && pb.getResult()==Result.SUCCESS) {
mail.removeHeader("In-Reply-To"); mail.removeHeader("In-Reply-To");
mail.removeHeader("References"); mail.removeHeader("References");
...@@ -86,13 +86,13 @@ public class MailSender<P extends AbstractProject<P, B>, B extends AbstractBuild ...@@ -86,13 +86,13 @@ public class MailSender<P extends AbstractProject<P, B>, B extends AbstractBuild
return true; return true;
} }
protected MimeMessage getMail(B build, BuildListener listener) throws MessagingException, InterruptedException { protected MimeMessage getMail(AbstractBuild<?, ?> build, BuildListener listener) throws MessagingException, InterruptedException {
if (build.getResult() == Result.FAILURE) { if (build.getResult() == Result.FAILURE) {
return createFailureMail(build, listener); return createFailureMail(build, listener);
} }
if (build.getResult() == Result.UNSTABLE) { if (build.getResult() == Result.UNSTABLE) {
B prev = build.getPreviousBuild(); AbstractBuild<?, ?> prev = build.getPreviousBuild();
if (!dontNotifyEveryUnstableBuild) if (!dontNotifyEveryUnstableBuild)
return createUnstableMail(build, listener); return createUnstableMail(build, listener);
if (prev != null) { if (prev != null) {
...@@ -102,7 +102,7 @@ public class MailSender<P extends AbstractProject<P, B>, B extends AbstractBuild ...@@ -102,7 +102,7 @@ public class MailSender<P extends AbstractProject<P, B>, B extends AbstractBuild
} }
if (build.getResult() == Result.SUCCESS) { if (build.getResult() == Result.SUCCESS) {
B prev = build.getPreviousBuild(); AbstractBuild<?, ?> prev = build.getPreviousBuild();
if (prev != null) { if (prev != null) {
if (prev.getResult() == Result.FAILURE) if (prev.getResult() == Result.FAILURE)
return createBackToNormalMail(build, "normal", listener); return createBackToNormalMail(build, "normal", listener);
...@@ -114,7 +114,7 @@ public class MailSender<P extends AbstractProject<P, B>, B extends AbstractBuild ...@@ -114,7 +114,7 @@ public class MailSender<P extends AbstractProject<P, B>, B extends AbstractBuild
return null; return null;
} }
private MimeMessage createBackToNormalMail(B build, String subject, BuildListener listener) throws MessagingException { private MimeMessage createBackToNormalMail(AbstractBuild<?, ?> build, String subject, BuildListener listener) throws MessagingException {
MimeMessage msg = createEmptyMail(build, listener); MimeMessage msg = createEmptyMail(build, listener);
msg.setSubject(getSubject(build, "Hudson build is back to " + subject + ": "),"UTF-8"); msg.setSubject(getSubject(build, "Hudson build is back to " + subject + ": "),"UTF-8");
...@@ -125,12 +125,12 @@ public class MailSender<P extends AbstractProject<P, B>, B extends AbstractBuild ...@@ -125,12 +125,12 @@ public class MailSender<P extends AbstractProject<P, B>, B extends AbstractBuild
return msg; return msg;
} }
private MimeMessage createUnstableMail(B build, BuildListener listener) throws MessagingException { private MimeMessage createUnstableMail(AbstractBuild<?, ?> build, BuildListener listener) throws MessagingException {
MimeMessage msg = createEmptyMail(build, listener); MimeMessage msg = createEmptyMail(build, listener);
String subject = "Hudson build is unstable: "; String subject = "Hudson build is unstable: ";
B prev = build.getPreviousBuild(); AbstractBuild<?, ?> prev = build.getPreviousBuild();
if(prev!=null) { if(prev!=null) {
if(prev.getResult()==Result.SUCCESS) if(prev.getResult()==Result.SUCCESS)
subject = "Hudson build became unstable: "; subject = "Hudson build became unstable: ";
...@@ -146,14 +146,14 @@ public class MailSender<P extends AbstractProject<P, B>, B extends AbstractBuild ...@@ -146,14 +146,14 @@ public class MailSender<P extends AbstractProject<P, B>, B extends AbstractBuild
return msg; return msg;
} }
private void appendBuildUrl(B build, StringBuffer buf) { private void appendBuildUrl(AbstractBuild<?, ?> build, StringBuffer buf) {
String baseUrl = Mailer.DESCRIPTOR.getUrl(); String baseUrl = Mailer.DESCRIPTOR.getUrl();
if (baseUrl != null) { if (baseUrl != null) {
buf.append("See ").append(baseUrl).append(Util.encode(build.getUrl())).append("changes\n\n"); buf.append("See ").append(baseUrl).append(Util.encode(build.getUrl())).append("changes\n\n");
} }
} }
private MimeMessage createFailureMail(B build, BuildListener listener) throws MessagingException, InterruptedException { private MimeMessage createFailureMail(AbstractBuild<?, ?> build, BuildListener listener) throws MessagingException, InterruptedException {
MimeMessage msg = createEmptyMail(build, listener); MimeMessage msg = createEmptyMail(build, listener);
msg.setSubject(getSubject(build, "Build failed in Hudson: "),"UTF-8"); msg.setSubject(getSubject(build, "Build failed in Hudson: "),"UTF-8");
...@@ -236,7 +236,7 @@ public class MailSender<P extends AbstractProject<P, B>, B extends AbstractBuild ...@@ -236,7 +236,7 @@ public class MailSender<P extends AbstractProject<P, B>, B extends AbstractBuild
return msg; return msg;
} }
private MimeMessage createEmptyMail(B build, BuildListener listener) throws MessagingException { private MimeMessage createEmptyMail(AbstractBuild<?, ?> build, BuildListener listener) throws MessagingException {
MimeMessage msg = new MimeMessage(Mailer.DESCRIPTOR.createSession()); MimeMessage msg = new MimeMessage(Mailer.DESCRIPTOR.createSession());
// TODO: I'd like to put the URL to the page in here, // TODO: I'd like to put the URL to the page in here,
// but how do I obtain that? // but how do I obtain that?
...@@ -267,7 +267,7 @@ public class MailSender<P extends AbstractProject<P, B>, B extends AbstractBuild ...@@ -267,7 +267,7 @@ public class MailSender<P extends AbstractProject<P, B>, B extends AbstractBuild
} }
msg.setRecipients(Message.RecipientType.TO, rcp.toArray(new InternetAddress[rcp.size()])); msg.setRecipients(Message.RecipientType.TO, rcp.toArray(new InternetAddress[rcp.size()]));
B pb = build.getPreviousBuild(); AbstractBuild<?, ?> pb = build.getPreviousBuild();
if(pb!=null) { if(pb!=null) {
MailMessageIdAction b = pb.getAction(MailMessageIdAction.class); MailMessageIdAction b = pb.getAction(MailMessageIdAction.class);
if(b!=null) { if(b!=null) {
...@@ -279,14 +279,14 @@ public class MailSender<P extends AbstractProject<P, B>, B extends AbstractBuild ...@@ -279,14 +279,14 @@ public class MailSender<P extends AbstractProject<P, B>, B extends AbstractBuild
return msg; return msg;
} }
private String getSubject(B build, String caption) { private String getSubject(AbstractBuild<?, ?> build, String caption) {
return caption + build.getProject().getFullDisplayName() + " #" + build.getNumber(); return caption + build.getProject().getFullDisplayName() + " #" + build.getNumber();
} }
/** /**
* Check whether a path (/-separated) will be archived. * Check whether a path (/-separated) will be archived.
*/ */
protected boolean artifactMatches(String path, B build) { protected boolean artifactMatches(String path, AbstractBuild<?, ?> build) {
return false; return false;
} }
......
...@@ -3,11 +3,11 @@ package hudson.tasks; ...@@ -3,11 +3,11 @@ package hudson.tasks;
import hudson.Launcher; import hudson.Launcher;
import hudson.Functions; import hudson.Functions;
import hudson.maven.AbstractMavenProject; import hudson.maven.AbstractMavenProject;
import hudson.model.AbstractBuild;
import hudson.model.AbstractProject; import hudson.model.AbstractProject;
import hudson.model.Build; import hudson.model.Build;
import hudson.model.BuildListener; import hudson.model.BuildListener;
import hudson.model.Descriptor; import hudson.model.Descriptor;
import hudson.model.Project;
import hudson.model.User; import hudson.model.User;
import hudson.model.UserPropertyDescriptor; import hudson.model.UserPropertyDescriptor;
import hudson.util.FormFieldValidator; import hudson.util.FormFieldValidator;
...@@ -67,18 +67,14 @@ public class Mailer extends Publisher { ...@@ -67,18 +67,14 @@ public class Mailer extends Publisher {
private transient String subject; private transient String subject;
private transient boolean failureOnly; private transient boolean failureOnly;
public boolean perform(Build build, Launcher launcher, BuildListener listener) throws InterruptedException { public boolean perform(AbstractBuild<?,?> build, Launcher launcher, BuildListener listener) throws InterruptedException {
return _perform(build,launcher,listener);
}
public <P extends Project<P,B>,B extends Build<P,B>> boolean _perform(B build, Launcher launcher, BuildListener listener) throws InterruptedException {
if(debug) if(debug)
listener.getLogger().println("Running mailer"); listener.getLogger().println("Running mailer");
return new MailSender<P,B>(recipients,dontNotifyEveryUnstableBuild,sendToIndividuals) { return new MailSender(recipients,dontNotifyEveryUnstableBuild,sendToIndividuals) {
/** Check whether a path (/-separated) will be archived. */ /** Check whether a path (/-separated) will be archived. */
@Override @Override
public boolean artifactMatches(String path, B build) { public boolean artifactMatches(String path, AbstractBuild<?,?> build) {
ArtifactArchiver aa = (ArtifactArchiver) build.getProject().getPublishers().get(ArtifactArchiver.DESCRIPTOR); ArtifactArchiver aa = (ArtifactArchiver) build.getProject().getPublishersList().toMap().get(ArtifactArchiver.DESCRIPTOR);
if (aa == null) { if (aa == null) {
LOGGER.finer("No ArtifactArchiver found"); LOGGER.finer("No ArtifactArchiver found");
return false; return false;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册