10

我有 4 个 groovy 脚本(2 个是 dsl.groovy 脚本):

JobConfig.groovy

class JobConfig {
    final name

    JobConfig(map) {
        name = map['name']
    }
}

顶级.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

,我在本地运行脚本没有问题。

但是在詹金斯上,即使我在这些脚本所在的同一位置提供 JobConfig.class,我也无法让它运行。我在这里读到,只要 JobConfig.groovy 在 CLASSPATH 上,我就不需要进行任何编译。我如何用詹金斯做到这一点?还是有其他解决方案?

4

2 回答 2

3

如果您不想编译 groovy 类,然后将编译后的类添加到类路径中,则可以使用 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()
于 2016-04-07T13:32:10.930 回答
0

我要做的是跟随,而不是试图让它全部手动工作,我会创建 maven 项目或 gradle 一个并在结果项目中组织你的 groovy 文件。当配置 maven 或 gradle 运行它时。一旦 maven 或 gradle 运行它没有任何问题,你可以把它交给 jenkins。

Jenkins 肯定会采用 maven 项目,而对于 gradle,你必须检查,但可以肯定的是,maven 在本地运行你的 groovy 项目,它在 Jenkins 下也将运行没有任何问题。

请尝试,让我知道。

于 2014-03-20T01:47:45.177 回答