我有4个groovy脚本(2个是dsl.groovy脚本):
JobConfig.groovy :
class JobConfig {
final name
JobConfig(map) {
name = map['name']
}
}
topLevel.groovy :
import JobConfig.*
def doSmthWithJobConfig(final JobConfig config) {
println(config.name);
}
sublevel1.dsl.groovy :
GroovyShell shell = new GroovyShell()
def topLevelScript = shell.parse(new File("topLevel.groovy"))
def jobConfigs = [
new JobConfig(name: 'JenkinsTestDSLs'),
new JobConfig(name: 'JenkinsTestDSLs2')
]
jobConfigs.each {
topLevelScript.doSmthWithJobConfig(it);
}
sublevel2.dsl.groovy :
GroovyShell shell = new GroovyShell()
def topLevelScript = shell.parse(new File("topLevel.groovy"))
def jobConfigs = [
new JobConfig(name: 'JenkinsTestDSLs3'),
new JobConfig(name: 'JenkinsTestDSLs4')
]
jobConfigs.each {
topLevelScript.doSmthWithJobConfig(it);
}
现在,如果我在当地做:
groovyc JobConfig.groovy
,我在本地运行脚本时没有任何问题。
但是在jenkins上,即使我在这些脚本所在的同一个地方提供JobConfig.class,我也无法运行它。我读了here,只要JobConfig.groovy在CLASSPATH上,我就不需要进行任何编译。我如何用詹金斯做到这一点?还是有其他解决方案吗?
答案 0 :(得分:2)
如果您不想编译groovy类,然后将编译后的类添加到类路径中,您可以使用groovy脚本中的类,如下所示:
给定一个常规课程
class GroovyClass {
def GroovyClass(someParameter) {}
def aMethod() {}
}
你可以像这样使用groovy脚本中的类
import hudson.model.*
import java.io.File;
import jenkins.model.Jenkins;
def jenkinsRootDir = build.getEnvVars()["JENKINS_HOME"];
def parent = getClass().getClassLoader()
def loader = new GroovyClassLoader(parent)
def someParameterValue = "abc"
def groovyClass = loader.parseClass(new File(jenkinsRootDir + "/userContent/GroovyScripts/GroovyClass.groovy")).newInstance(someParameterValue)
groovyClass.aMethod()
答案 1 :(得分:0)
我要做的就是关注,而不是试图让它全部手动工作,我会创建maven项目或gradle one并在结果项目中组织你的groovy文件。配置maven或gradle运行它时。一旦maven或gradle运行它没有任何问题,你可以把它交给詹金斯。
Jenkins肯定会选择maven项目而且你需要检查,但是有一点可以肯定的是,maven在本地运行你的groovy项目它也会在Jenkins下运行而没有任何问题。
请尝试,让我知道。