Warnings Plugin and Mail-ext Integration

已查看 195 次
跳至第一个未读帖子

Darren Syzling

未读,
2012年4月11日 05:25:552012/4/11
收件人 jenkins...@googlegroups.com
Regarding the Warnings plugin - is there anyway I can access warning
information for the current build from a mail-ext groovy template by
using the hudson/jenkins model API? Or would I use the token macro
expansion plugin in some way? I was wondering if there was a
documented way of gaining access to the WarningsResult and
WarningsResultAction so I could access the getSummary method from
within the mail template (or iterate over other information if
necessary) in a similar way to accessing JUnit test results? I
wondered if there was a standard way for plugins to publish their
action results into the Hudson model so that post build actions could
retrieve and process them,


--
Regards
Darren

Ullrich Hafner

未读,
2012年4月11日 05:53:562012/4/11
收件人 jenkins...@googlegroups.com
I haven't yet done that but it should be possible to access the objects
using this method from your script:

WarningsResultAction action =
getAction("hudson.plugins.warnings.WarningsResultAction")
From this object you get the result using action.getResult()

Maybe we can work together on making an example for the warnings plug-in
so that I can include it on the wiki page?

Ulli

Darren Syzling

未读,
2012年4月11日 08:57:082012/4/11
收件人 jenkins...@googlegroups.com
Ulli,

I'd be happy to work on something together. I did however try a few
variants but the hudson.plugins.warnings.WarningsResultAction class
could not be found, I tried variants of this:

warningsResultAction =
build.getAction(Class.forName("hudson.plugins.warnings.WarningsResultAction"))
warningsResultAction =
build.getAction(hudson.plugins.warnings.WarningsResultAction.class)

and using the class loader:
ClassLoader cl = it.class.getClassLoader()
def warningsClass =
cl.loadClass("hudson.plugins.warnings.WarningsResultAction", true)

Is there something different about the groovy parser engine loaded by
email-ext which would mean other plugin classes were not available.

Unfortunately I then decided to upgrade to Jenkins 1.459 along with:
Static analysis utilities 1.38
Warnings 3.28
Static analysis collector 1.24
Email-ext 2.18

This has broken my ability to build and configure the project, when I build:
11-Apr-2012 13:55:43 hudson.model.Executor run
SEVERE: Executor threw an exception
java.lang.AssertionError: class
hudson.plugins.warnings.WarningsPublisher is missing its descriptor
at jenkins.model.Jenkins.getDescriptorOrDie(Jenkins.java:1076)
at hudson.tasks.Publisher.getDescriptor(Publisher.java:123)
at hudson.tasks.Recorder.getDescriptor(Recorder.java:51)
at hudson.plugins.warnings.WarningsPublisher.getDescriptor(WarningsPublisher.java:323)
at hudson.plugins.warnings.WarningsPublisher.getDescriptor(WarningsPublisher.java:41)
at hudson.model.Descriptor.toMap(Descriptor.java:873)
at hudson.util.DescribableList.toMap(DescribableList.java:128)
at hudson.model.Project.getPublishers(Project.java:109)
at hudson.model.Build$RunnerImpl.cleanUp(Build.java:171)
at hudson.model.Run.run(Run.java:1457)
at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:46)
at hudson.model.ResourceController.execute(ResourceController.java:88)
at hudson.model.Executor.run(Executor.java:238)


and when I try and configure the project I can't access email-ext or
warnings configuration information:
11-Apr-2012 13:46:50 hudson.ExpressionFactory2$JexlExpression evaluate
WARNING: Caught exception evaluating: i.descriptor. Reason:
java.lang.reflect.InvocationTargetExcept
ion
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.commons.jexl.util.PropertyExecutor.execute(PropertyExecutor.java:125)
at org.apache.commons.jexl.util.introspection.UberspectImpl$VelGetterImpl.invoke(UberspectIm
pl.java:314)
at org.apache.commons.jexl.parser.ASTArrayAccess.evaluateExpr(ASTArrayAccess.java:185)
at org.apache.commons.jexl.parser.ASTIdentifier.execute(ASTIdentifier.java:75)
at org.apache.commons.jexl.parser.ASTReference.execute(ASTReference.java:83)
at org.apache.commons.jexl.parser.ASTReference.value(ASTReference.java:57)
at org.apache.commons.jexl.parser.ASTReferenceExpression.value(ASTReferenceExpression.java:5
1)
at org.apache.commons.jexl.ExpressionImpl.evaluate(ExpressionImpl.java:80)
at hudson.ExpressionFactory2$JexlExpression.evaluate(ExpressionFactory2.java:72)
at org.apache.commons.jelly.tags.core.CoreTagLibrary$3.run(CoreTagLibrary.java:134)

--
Regards
Darren

Slide

未读,
2012年4月11日 09:05:532012/4/11
收件人 jenkins...@googlegroups.com

I hope you mean email-ext 2.19. There is nothing different about the groovy implementation in email-ext, it uses the same one as the rest of Jenkins.

Darren Syzling

未读,
2012年4月11日 09:10:082012/4/11
收件人 jenkins...@googlegroups.com
Yes sorry email-ext 2.19 installed.

--
Regards
Darren

Darren Syzling

未读,
2012年4月11日 09:33:552012/4/11
收件人 jenkins...@googlegroups.com
In the meantime I've reverted back to Analysis Collector 1.19.


--
Regards
Darren

Ullrich Hafner

未读,
2012年4月11日 10:27:502012/4/11
收件人 jenkins...@googlegroups.com
Hmm, that is strange. Classloading should be straight forward. Seems
that the installation is corrupt. Is the warnings plug-in showing up in
Jenkins?

Ulli

Ullrich Hafner

未读,
2012年4月11日 10:34:252012/4/11
收件人 jenkins...@googlegroups.com
When I execute the following in Jenkins script console I correctly find
the action of a build:

println(hudson.model.Hudson.instance.getItem("Your Job
Name").getLastBuild().getAction(hudson.plugins.warnings.WarningsResultAction.class))

BTW: Maybe we can discuss this topic in our IRC channel then we will
have faster feedback than via mail?
https://wiki.jenkins-ci.org/display/JENKINS/IRC+Channel

Ulli

On 04/11/2012 02:57 PM, Darren Syzling wrote:

Darren Syzling

未读,
2012年4月11日 11:02:382012/4/11
收件人 jenkins...@googlegroups.com
Ulli,

Thanks - at the moment this is a background task and I have a few
other pressing things to attend to so can't hookup via IRC today. But
yes the warnings are appearing on the build info. And the following
works from the script console:

cl = getClass().getClassLoader()


def warningsClass =
cl.loadClass("hudson.plugins.warnings.WarningsResultAction", true)

But doesn't from within the mail template.

Regards
Darren

--
Regards
Darren

Slide

未读,
2012年4月11日 11:04:172012/4/11
收件人 jenkins...@googlegroups.com
Do you get an exception when you do that in the email template? Also,
are you importing the necessary items? I'm thinking that the script
console may add some imports by default that the email-ext plugin does
not.

--
Website: http://earl-of-code.com

Slide

未读,
2012年4月11日 11:51:132012/4/11
收件人 jenkins...@googlegroups.com
I also can't seem to get the groovy template to load the
WarningsResultAction class. I tried similar things to what you did
below. I will see if I can figure out what this is the case.

Thanks,

slide

--
Website: http://earl-of-code.com

Slide

未读,
2012年4月11日 16:06:212012/4/11
收件人 jenkins...@googlegroups.com
Ok, it looks like the groovy script console sets the classloader for
the context to Jenkins.getInstance().getPluginManager().uberClassLoader,
which the email-ext plugin does NOT do. I will look at updating this
and trying it out and if it works, I'll release a new version of
email-ext.

slide

--
Website: http://earl-of-code.com

Darren Syzling

未读,
2012年4月11日 18:05:172012/4/11
收件人 jenkins...@googlegroups.com
Thanks for looking into this - replying late but yes I tried explicit
imports to no avail. Makes sense that a different class loader was
being used.

Look forward to testing an updated version when available.


Darren

Slide

未读,
2012年4月12日 09:43:482012/4/12
收件人 jenkins...@googlegroups.com
I'm having a few difficulties on this. The GroovyShell is initialized
with a ClassLoader like this:

private static final class Script implements
DelegatingCallable<String,RuntimeException> {
private final String script;
private transient ClassLoader cl;

private Script(String script) {
this.script = script;
cl = getClassLoader();
}

public ClassLoader getClassLoader() {
return Jenkins.getInstance().getPluginManager().uberClassLoader;
}

public String call() throws RuntimeException {
// if we run locally, cl!=null. Otherwise the delegating
classloader will be available as context classloader.
if (cl==null) cl =
Thread.currentThread().getContextClassLoader();
GroovyShell shell = new GroovyShell(cl);

StringWriter out = new StringWriter();
PrintWriter pw = new PrintWriter(out);
shell.setVariable("out", pw);
try {
Object output = shell.evaluate(script);
if(output!=null)
pw.println("Result: "+output);
} catch (Throwable t) {
t.printStackTrace(pw);
}
return out.toString();
}
}

The part I am interested in is when it uses the uberClassLoader vs
using the getContextClassLoader. How is cl set to null for executing
remotely? I am trying to replicate this setup for the groovy
templating in the email-ext plugin so it can load other plugins and
such.

Thanks,

slide

--
Website: http://earl-of-code.com

回复全部
回复作者
转发
0 个新帖子