Jenkins脚本管道:必须使用类Jenkins.scm.api.SCMSource的实现指定$class



我有一个jenkins多分支管道。显然,它成功地签出了主repo(文件在工作区中可见(。

但后来我称之为这种方法。目标是签出(在专用子文件夹中(以下存储库和我从主回购中签出的同一分支(例如,如果主repo是在"我的目标分支名称"处签出的,那么"bar"repo也应该尝试签出分支"我的目的分支名称"或"master"作为后备。事实上,整个用例与resolveScm步骤文档中描述的用例(页面可能加载缓慢,请耐心等待(相似

checkout resolveScm(source: git(url: 'git@example.com:foo/bar.git', credentialsId: 'xxx'), targets: [env.BRANCH_NAME, 'master'])

然而,我得到了一个错误:

16:40:38  java.lang.UnsupportedOperationException: must specify $class with an implementation of class jenkins.scm.api.SCMSource
16:40:38    at org.jenkinsci.plugins.structs.describable.DescribableModel.resolveClass(DescribableModel.java:574)
16:40:38    at org.jenkinsci.plugins.structs.describable.DescribableModel.coerce(DescribableModel.java:473)
16:40:38    at org.jenkinsci.plugins.structs.describable.DescribableModel.buildArguments(DescribableModel.java:409)
16:40:38    at org.jenkinsci.plugins.structs.describable.DescribableModel.instantiate(DescribableModel.java:329)
16:40:38    at org.jenkinsci.plugins.workflow.cps.DSL.invokeStep(DSL.java:302)
16:40:38    at org.jenkinsci.plugins.workflow.cps.DSL.invokeMethod(DSL.java:193)
16:40:38    at org.jenkinsci.plugins.workflow.cps.CpsScript.invokeMethod(CpsScript.java:122)
16:40:38    at groovy.lang.MetaClassImpl.invokeMethodOnGroovyObject(MetaClassImpl.java:1278)
16:40:38    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1172)
16:40:38    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022)
16:40:38    at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:42)
16:40:38    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
16:40:38    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
16:40:38    at com.cloudbees.groovy.cps.sandbox.DefaultInvoker.methodCall(DefaultInvoker.java:20)
16:40:38  Caused: java.lang.IllegalArgumentException: Could not instantiate {source={GIT_AUTHOR_EMAIL=jenkins.donotreply@example.com, GIT_AUTHOR_NAME=Jenkins, GIT_BRANCH=origin/master, GIT_COMMIT=xxx, GIT_COMMITTER_EMAIL=jenkins.donotreply@example.com, GIT_COMMITTER_NAME=Jenkins, GIT_LOCAL_BRANCH=master, GIT_PREVIOUS_COMMIT=yyy, GIT_PREVIOUS_SUCCESSFUL_COMMIT=yyy, GIT_URL=git@example.com:foo/bar.git}, targets=[my-target-branch-name, master]} for org.jenkinsci.plugins.workflow.multibranch.ResolveScmStep
16:40:38    at org.jenkinsci.plugins.structs.describable.DescribableModel.instantiate(DescribableModel.java:334)
16:40:38    at org.jenkinsci.plugins.workflow.cps.DSL.invokeStep(DSL.java:302)
16:40:38    at org.jenkinsci.plugins.workflow.cps.DSL.invokeMethod(DSL.java:193)
16:40:38    at org.jenkinsci.plugins.workflow.cps.CpsScript.invokeMethod(CpsScript.java:122)
16:40:38    at groovy.lang.MetaClassImpl.invokeMethodOnGroovyObject(MetaClassImpl.java:1278)
16:40:38    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1172)
16:40:38    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022)
16:40:38    at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:42)
16:40:38    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
16:40:38    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
16:40:38    at com.cloudbees.groovy.cps.sandbox.DefaultInvoker.methodCall(DefaultInvoker.java:20)
16:40:38    at fooBar.call(fooBar.groovy:14)
16:40:38    at fooBar.call(fooBar.groovy:258)
16:40:38    at ___cps.transform___(Native Method)
...

我哪里错了?

以下是Jenkinsfile的完整定义:

pipeline {
agent { label 'small || big' }
stages {
stage('Build') {
steps {
sh "ls -la"
sh "rm -rf secondrepo && mkdir secondrepo"
dir('secondrepo') {
checkout resolveScm(source: git(url: 'git@example.com:foo/bar.git', credentialsId: 'xxx'), targets: [env.BRANCH_NAME, 'master'])
}
}
}
}
}

问题似乎是在脚本中调用git(...)时发生冲突。resolveScmsource参数期望jenkins.scm.api.SCMSource的实例。然而,如果像在文档中那样调用git(),那么它似乎更符合GitStep中的functionName,并创建一个GitSCM实例,该实例是而不是SCMSource的子类,这是错误的。相反,通过调用git,它应该与GitSCMSource 中的git符号匹配

因此,为了解决这个问题,我通过将参数指定为映射来强制实例化GitSCMSource

checkout resolveScm(source: [$class: 'GitSCMSource', remote: 'git@example.com:foo/bar.git', credentialsId: 'xxx', traits: [gitBranchDiscovery()]], targets: [env.BRANCH_NAME, 'master'])

最新更新