我正在尝试动态构建并行阶段,如此处和此处所示。具体来说,我正在尝试在管道范围之外定义的函数中执行此操作,例如:
pipeline{
stages{
stage('CI'){
steps{
doDynamicParallelSteps()
}
}
}
}
def doDynamicParallelSteps(){
tests = [:]
for (f in findFiles(glob: '**/html/*.html')) {
tests["${f}"] = {
node {
stage("${f}") {
echo '${f}'
}
}
}
}
parallel tests
}
Run Code Online (Sandbox Code Playgroud)
问题是,这似乎只有在动态并行生成代码在管道的step {}块内的script {}块内时才起作用(如第一个参考资料所示)。
当运行类似于上面的代码片段的内容时,我在jenkins中看到此错误:
hudson.remoting.ProxyException: groovy.lang.MissingMethodException: No signature of method: java.lang.String.call() is applicable for argument types: (java.lang.String, org.jenkinsci.plugins.workflow.cps.CpsClosure2) values: [teststage, org.jenkinsci.plugins.workflow.cps.CpsClosure2@2e1b48b4]
Possible solutions: wait(), any(), trim(), size(), next(), size()
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onMethodCall(SandboxInterceptor.java:153)
at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:155)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:159)
at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.methodCall(SandboxInvoker.java:17)
at WorkflowScript.parallelHandler(WorkflowScript:1383) …Run Code Online (Sandbox Code Playgroud) 我正在构建一个共享库,我想要有类定义,例如:
class Kubernetes implements Serializable{
def script
Kubernetes(script){this.script = script}
def someMethod(){ ... }
}
Run Code Online (Sandbox Code Playgroud)
我已将此类定义放在共享库git repo中,并带有路径src/foo/bar/Kubernetes.groovy.我正在使用jenkins文件顶部的以下步骤导入共享库,在任何节点或管道指令之外:
library identifier: 'custom-lib@master', retriever: modernSCM(
[$class: 'GitSCMSource',
remote: '<my-git-remote>',
credentialsId: '<my-credentials-id>'])
import foo.bar.*
Run Code Online (Sandbox Code Playgroud)
我已经验证了这个库正在被拉,因为我可以引用在vars/目录中创建的自定义DSL步骤.但是,当我编辑我的管道文件以生成该类的实例时,管道启动时会立即引发错误:
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 1276: unable to resolve class Kubernetes
@ line 1276, column 16.
def kube = new Kubernetes(this)
^
1 error
at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310)
at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:958)
at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:605)
at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:554)
at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688)
at groovy.lang.GroovyShell.parse(GroovyShell.java:700)
at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.doParse(CpsGroovyShell.java:133)
at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:127)
at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:557) …Run Code Online (Sandbox Code Playgroud)