我是Jenkins插件开发的新手,我尝试从编辑现有插件开始,为我的需要添加更多功能。
我正在更改Audit2DB插件,我希望当此插件保存Build_Detail数据时,它将存储子作业,通过参数化插件或后期构建任务触发当前构建的作业。有两种类型的子项目:
1。 通过参数化插件在构建步骤中触发,我们可以通过以下方式获取这些项目(未阻止调用)或构建(阻塞调用):
`def infoActions = runBuild.getActions(hudson.plugins.parameterizedtrigger.BuildInfoExporterAction)
infoActions.each { action ->
def triggeredProjects = action.getTriggeredProjects()
if (triggeredProjects != null) {
triggeredProjects.each {
println it.getDisplayName()
}
}
def triggeredBuilds = action.getTriggeredBuilds()
if (triggeredBuilds != null) {
triggeredBuilds.each {
println it
}
}
}`
我可以在Jenkins中运行这些代码但是当我在插件中实现它时,我必须声明属于Parameterized插件的hudson.plugins.parameterizedtrigger.BuildInfoExporterAction类。我尝试在pom.xml中添加依赖于此插件,如下面的from:
<dependency>
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>parameterized-trigger</artifactId>
<version>2.31</version>
</dependency>'
但是,当我构建插件时,它会导致unitTest错误:
org.jenkins.plugins.audit2db.test.integration.WhenAccessingJobHistoryReport) Time elapsed: 0.011 sec <<< ERROR!java.lang.NoClassDefFoundError: jenkins/model/RunAction2
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.getDeclaredMethods(Class.java:1975)
at org.jvnet.hudson.annotation_indexer.Index$2$1.fetch(Index.java:101)
at org.jvnet.hudson.annotation_indexer.Index$2$1.hasNext(Index.java:71)
at org.jvnet.hudson.annotation_indexer.FilterIterator.fetch(FilterIterator.java:23)
at org.jvnet.hudson.annotation_indexer.FilterIterator.hasNext(FilterIterator.java:42)
at hudson.init.InitializerFinder.discoverTasks(InitializerFinder.java:70)
at hudson.init.InitializerFinder.discoverTasks(InitializerFinder.java:55)
at org.jvnet.hudson.reactor.TaskBuilder$2.discoverTasks(TaskBuilder.java:40)
at org.jvnet.hudson.reactor.Reactor.<init>(Reactor.java:128)
at org.jvnet.hudson.reactor.Reactor.<init>(Reactor.java:133)
at jenkins.model.Jenkins$6.<init>(Jenkins.java:821)
at jenkins.model.Jenkins.executeReactor(Jenkins.java:821)
at jenkins.model.Jenkins.<init>(Jenkins.java:761)
at hudson.model.Hudson.<init>(Hudson.java:81)
at org.jvnet.hudson.test.HudsonTestCase.newHudson(HudsonTestCase.java:441)
at org.jvnet.hudson.test.HudsonTestCase.setUp(HudsonTestCase.java:300)
at org.jenkins.plugins.audit2db.test.integration.WhenAccessingReportPages.setUp(WhenAccessingReportPages.java:49)
at junit.framework.TestCase.runBare(TestCase.java:132)
at org.jvnet.hudson.test.HudsonTestCase.runBare(HudsonTestCase.java:285)
at junit.framework.TestResult$1.protect(TestResult.java:110)
at junit.framework.TestResult.runProtected(TestResult.java:128)
at junit.framework.TestResult.run(TestResult.java:113)
at junit.framework.TestCase.run(TestCase.java:124)
at junit.framework.TestSuite.runTest(TestSuite.java:232)
at junit.framework.TestSuite.run(TestSuite.java:227)
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:81)
at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:53)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:123)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:104)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164)
at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110)
at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:172)
at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:104)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:70)
Caused by: java.lang.ClassNotFoundException: jenkins.model.RunAction2
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 64 more
我尝试将parameterizedtrigger.jar复制到lib / WEB-INF文件夹中,但没有运气。似乎错误,但我不知道修复:
public abstract class WhenAccessingReportPages extends HudsonTestCase {
...
@Before
@Override
public void setUp() throws Exception {
super.setUp();
jenkins.setSecurityRealm(getSecurityRealm());
jenkins.setAuthorizationStrategy(getAuthStrategy());
}
2。 在构建后触发(下游项目)
def childs = project.getDownstreamProjects()
for (Iterator<AbstractProject> iterator = childs.iterator(); iterator.hasNext();) {
def childBuildsMap = iterator.next()._getRuns()
for (child in childBuildsMap) {
AbstractBuild childBuild = child
println childBuild.toString()
}
}
同样,当把这些代码放入插件时,我们必须兑换成显式类型,我在构建返回RunMap的AbstractProject._getRuns()时遇到了麻烦,但是我不能使用迭代器()扫描列表。我在java代码中太糟糕了,所以我很多时候都遇到了这些问题。
听到你的帮助,真的很棒。
谢谢,