想要并行觸發幾個下游作業是使用 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)
有幾件事不清楚。我們可以在另一個階段的“步驟”塊內再次啟動“腳本”塊中的并行階段嗎?
uj5u.com熱心網友回復:
您用于并行命令的語法是宣告性語法,但您在script需要腳本化語法的塊中使用它,因此是例外。
在您的script塊中,您應該使用并行命令的腳本化語法:
并行:并行執行從分支名稱到閉包的映射和一個可選引數 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閉包來避免使用該塊,然后您可以使用當前的語法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/348752.html
