【问题标题】:Parallel runs in declarative pipeline声明式管道中的并行运行
【发布时间】:2021-11-04 05:30:17
【问题描述】:

想要并行触发几个下游作业是使用 groovy 的声明式管道。 尝试如下,但遇到了问题。它正在检查条件,但似乎在并行块上遇到了问题。

stage("CHeck for downstraem jobs"){
            agent {
                node {
                  label "${AGENT}"
                  customWorkspace "${SRC}"
                }
            }       
            environment {
                UPSTREAM_PARAMS = "${SRC},${AGV}"
                ADM_FILES = sh (script: 'cd ${SRC}/repo; git diff-tree --no-commit-id --name-only -r $(git log --format="%H" -n 1) | grep "src/util"',
                    returnStatus: true
                )
                FUNC_FILES = sh (script: 'cd ${SRC}/repo; git diff-tree --no-commit-id --name-only -r $(git log --format="%H" -n 1) | grep "include"',
                    returnStatus: true
                )
                CONT_FILES = sh (script: 'cd ${SRC}/repo; git diff-tree --no-commit-id --name-only -r $(git log --format="%H" -n 1) | grep "src/test"',
                    returnStatus: true
                )
                TOOL_FILES = sh (script: 'cd ${SRC}/repo; git diff-tree --no-commit-id --name-only -r $(git log --format="%H" -n 1) | grep "tools"',
                    returnStatus: true
                )              
                
            }
            steps{
                
                echo "Build dir is ${SRC}"
                echo "CHANGED FILES ARE ${ADMIN_FILES}"
                echo "CHANGED FILES ARE ${FUNC_FILES}"
                echo "CHANGED FILES ARE ${CONT_FILES}"
                echo "CHANGED FILES ARE ${TOOL_FILES}"             
                script {
                    if (ADM_FILES == '0' && FUNC_FILES == '0' && CONT_FILES == '0') {
                        echo "trigger parallel both jobs"
                        parallel {
                            stage('Launch JOB admin'){
                                agent any
                                environment {
                                    UPSTREAM_PARAMS = "${SRC},${AGV}"
                                }
                                steps {
                                    build job: 'Downstream_admin_job', parameters: [string(name: 'UPSTREAM_PARAMS', value:"${UPSTREAM_PARAMS}")]
                                } 
                            }
                            stage('Launch job sanity'){
                                agent any
                                environment {
                                    UPSTREAM_PARAMS = "${SRC},${AGV}"
                                }
                                steps {                      
                                    build job: 'Downstream_sanity_job', parameters: [string(name: 'UPSTREAM_PARAMS', value:"${UPSTREAM_PARAMS}")]
                                }
                            
                            }
                        }
                    
                    }
                    
                    if (TOOL_FILES == '0' ) {
                        build job: 'Test_verification_job', parameters: [string(name: 'UPSTREAM_PARAMS', value:"${UPSTREAM_PARAMS}")]
                    } 
                }
            }
        }

但我不确定这里有什么问题。是否不支持在“脚本”块内启动并行作业。出现以下错误。

java.lang.IllegalArgumentException: Expected named arguments but got org.jenkinsci.plugins.workflow.cps.CpsClosure2@6e72e37a
at org.jenkinsci.plugins.workflow.cps.DSL.singleParam(DSL.java:718)
at org.jenkinsci.plugins.workflow.cps.DSL.parseArgs(DSL.java:706)
at org.jenkinsci.plugins.workflow.cps.DSL.parseArgs(DSL.java:640)
at org.jenkinsci.plugins.workflow.cps.DSL.invokeStep(DSL.java:234)
at org.jenkinsci.plugins.workflow.cps.DSL.invokeMethod(DSL.java:193)
at org.jenkinsci.plugins.workflow.cps.CpsScript.invokeMethod(CpsScript.java:122)
at jdk.internal.reflect.GeneratedMethodAccessor26987.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1213)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:42)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:163)
at org.kohsuke.groovy.sandbox.GroovyInterceptor.onMethodCall(GroovyInterceptor.java:23)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onMethodCall(SandboxInterceptor.java:158)
at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:161)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:165)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:135)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:135)
at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.methodCall(SandboxInvoker.java:17)
at WorkflowScript.run(WorkflowScript:338)
at ___cps.transform___(Native Method)
at com.cloudbees.groovy.cps.impl.ContinuationGroup.methodCall(ContinuationGroup.java:86)
at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:113)
at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixArg(FunctionCallBlock.java:83)
at jdk.internal.reflect.GeneratedMethodAccessor303.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
at com.cloudbees.groovy.cps.impl.ClosureBlock.eval(ClosureBlock.java:46)
at com.cloudbees.groovy.cps.Next.step(Next.java:83)
at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:174)
at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:163)

几乎没有什么不清楚的。 我们能否再次在另一个阶段的“步骤”块中的“脚本”块中启动并行阶段。

【问题讨论】:

    标签: jenkins jenkins-pipeline jenkins-groovy jenkins-declarative-pipeline


    【解决方案1】:

    您用于并行命令的语法是 declarative syntax,但您在 script 块内使用它,这需要脚本语法,因此例外。
    在您的 script 块中,您应该使用并行命令的脚本语法:

    parallel:并行执行 采用从分支名称到闭包的映射和一个可选参数 failFast >,它将在任何其他分支发生故障时终止所有分支:

    parallel firstBranch: {
        // do something
    }, secondBranch: {
        // do something else
    },
    failFast: true|false
    

    因此,在您的情况下,您可以使用以下脚本语法:

     parallel(
        'Launch JOB admin' : {
            node {
                build job: 'Downstream_admin_job', parameters: [string(name: 'UPSTREAM_PARAMS', value: "${SRC},${AGV}")]
            }
        }, 
        'Launch job sanity': {
            node {
                build job: 'Downstream_sanity_job', parameters: [string(name: 'UPSTREAM_PARAMS', value: "${SRC},${AGV}")]
            }
        }
    )
    

    或者,您可以尝试避免使用 script 块,方法是将您的 if 语句替换为声明性 when 闭包,然后您可以使用当前的语法。

    【讨论】:

    • 非常感谢@Noam。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多