无法在Jenkins作业生成器

时间:2017-11-08 11:26:33

标签: jenkins groovy jenkins-job-dsl

我的DSL作业生成器出现问题:

Processing DSL script seed.groovy
org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'com.dabsquared.gitlabjenkins.connection.GitLabApiTokenImpl@4046fd60' 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)

我正在运行一个访问gitswarm API的DSL作业生成器,获取有关可用项目及其分支的信息,并创建Jenkins作业。

与gitswarm api的交互是通过Client类 - 我的gitswarm API客户端完成的。

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正在运行这个DSL种子作业:

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

请帮忙

1 个答案:

答案 0 :(得分:0)

Job DSL类加载器不支持访问其他插件提供的类。因此,您无法从其他插件导入类,也无法将对象强制转换为该类。

但Groovy是一种动态语言。您不需要将对象强制转换为特定类,以便能够访问其成员。 Groovy将在运行时解决这个问题。以下示例显示如何使用插件中的任何类来获取API令牌。

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