2017-11-08 2 views
0

werfen Kann ich ein Problem mit meinem DSL-Job-Generator haben:nicht Objekt in Jenkins Job Generator

Processing DSL script seed.groovy 
org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object '[email protected]d60' with class 'com.dabsquared.gitlabjenkins.connection.GitLabApiTokenImpl' to class 'com.dabsquared.gitlabjenkins.connection.GitLabApiTokenImpl' 
at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnSAM(DefaultTypeTransformation.java:405) 
at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnNumber(DefaultTypeTransformation.java:319) 
at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.castToType(DefaultTypeTransformation.java:232) 
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.castToType(ScriptBytecodeAdapter.java:603) 
at com.blue.devops.generator.Generator$_closure1.doCall(Generator.groovy:28) 
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:498) 

ich einen DSL-Job-Generator leite die gitswarm API zugreifen, erhält die Informationen über die verfügbaren Projekte und deren Niederlassungen und schafft Jenkins Jobs.

Interaktion mit gitswarm api erfolgt über Client-Klasse - meine gitswarm API-Client.

Generator.groovy:

class Generator { 

SystemCredentialsProvider systemCredentialsProvider = (SystemCredentialsProvider) Jenkins.instance.getExtensionList('com.cloudbees.plugins.credentials.SystemCredentialsProvider')[0] 
CredentialsStore credentialsStore = (CredentialsStore) systemCredentialsProvider.getStore() 
Domain domain = Domain.global() 
List<Credentials> credentials = credentialsStore.getCredentials(domain) 

Client client 

Generator(String tokenId="gitswarm_token") { 
    credentials.each { Credentials credentials -> 
     if(credentials.getId() == tokenId) { 
      GitLabApiTokenImpl token = (GitLabApiTokenImpl) credentials //line 28 
      client = new Client(apiToken: token.getApiToken().getPlainText()) 
     } 
    } 
} 

boolean generateJobs(DslFactory factory) { 
    ArrayList<Project> supportedProjects = client.getSupportedProjects() 
    supportedProjects.each { supportedProject -> 
     handleProject(supportedProject, factory) 
    } 
    return true 
} 
} 

Jenkins läuft dieses DSL Samen Job:

import com.blue.devops.generator.Generator 
new Generator().generateJobs(this) 

Bitte helfen

Antwort

0

Der Job DSL Classloader nicht den Zugriff auf Klassen von anderen Plugins bereitgestellt unterstützen . Sie können also keine Klasse aus einem anderen Plugin importieren und können kein Objekt in diese Klasse umwandeln.

Aber Groovy ist eine dynamische Sprache. Sie müssen ein Objekt nicht in eine bestimmte Klasse umwandeln, um auf seine Mitglieder zugreifen zu können. Groovy wird das zur Laufzeit herausfinden. Das folgende Beispiel zeigt, wie das API-Token mit beliebigen Klassen aus Plugins abgerufen wird.

def systemCredentialsProvider = Jenkins.instance.getExtensionList('com.cloudbees.plugins.credentials.SystemCredentialsProvider')[0] 
def credentials = systemCredentialsProvider.credentials 
def gitlabCredentials = credentials.find { it.id == 'test' } 
def apiToken = gitlabCredentials.apiToken.plainText 
+0

danke :) Wir fanden heraus, dass das Problem der Classloader ist. Ich habe es so gelöst, dass ich nicht auf Klassen anderer Plugins zugreifen muss. –