2013-07-23 15 views
6

ho 4 script Groovy (2 sono gli script dsl.groovy):Utilizzando una classe Groovy in altri Jenkins script 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); 
} 

Ora, se a livello locale che faccio:

groovyc JobConfig.groovy 

, ottengo nessun problema con l'esecuzione degli script a livello locale.

Ma su jenkins anche se fornisco JobConfig.class nello stesso posto in cui si trovano questi script, non riesco a farlo funzionare. Ho letto here che non è necessario eseguire alcuna compilazione finché JobConfig.groovy si trova su CLASSPATH. Come faccio a farlo con Jenkins? O c'è un'altra soluzione?

+0

come si esegue su Jenkins? –

risposta

0

Quello che vorrei fare è seguire, invece di provare a far funzionare tutto manualmente, creerei il progetto Maven o gradle one e organizzerò i file groovy all'interno del progetto risultante. Quando configura Maven o Gradle per eseguirlo. Una volta che il maven o gradle lo esegue senza problemi, puoi darlo a Jenkins.

Jenkins prende progetti di sicuro e per il gradle dovrete controllare, tuttavia una cosa è certa, è che maven esegue il vostro groovy project localmente, senza problemi nemmeno sotto Jenkins.

Per favore, fammi sapere.

2

Se non si desidera compilare la classe Groovy (i) e poi aggiungere le classi compilate al classpath, si può fare uso di classi all'interno di script Groovy in questo modo:

Data una classe Groovy

class GroovyClass { 
    def GroovyClass(someParameter) {} 

    def aMethod() {} 
} 

è possibile utilizzare la classe nello script Groovy come questo

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() 
+0

Può essere utilizzato anche in uno script groovy di Jenkins Pipeline? Ottengo 'un'eccezione che si è verificato: \t in locali di campo \t nella cattura campo \t nel campo DEF \t nelle chiusure campo \t in oggetto [email protected] Causato: java. io.NotSerializableException: org.jenkinsci.plugins.workflow.cps.CpsGroovyShell $ CleanGroovyClassLoader' sulla riga che ottiene il programma di caricamento della classe 'def parent = getClass().getClassLoader() ' – raluru

+0

@Il progetto TheEllis in esecuzione su slave fornisce un errore file non trovato eccezione anche se il file è in area di lavoro su master funziona correttamente, quale può essere il problema? –

+0

ho usato def Job = loader.parseClass (new hudson.FilePath (Jenkins.getInstance(). GetComputer (build.getEnvVars() ['NODE_NAME']). GetChannel(), build.getEnvVars() ["WORKSPACE"] + "/groovy_modules/GroovyHelper.groovy")). newInstance() ma errore è venuto che hudson.FilePath non può essere utilizzato in hudson.FilePath –