具有动态矩阵轴值的声明性管道 [英] Declarative Pipeline with dynamic matrix axis values

查看:105
本文介绍了具有动态矩阵轴值的声明性管道的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试获得Jenknis-Declarative-Pipeline-Job作品.

Hi I am trying to get a Jenknis-Declarative-Pipeline-Job work.

用例应该非常简单:
我想用相同的Jenkins管道构建多个插件.为此,我编写了一个"JenkinsLibrary",其接口可将插件用于参数.该参数之一是轴值.

The Use-Case should be pretty simple:
I want to build multiple Plugins with the same Jenkins-pipeline. To do so I wrote a "JenkinsLibrary" with an interface the Plugins can use for parameters. One of this parameters is the axis-values.

我遇到的问题与此reddist帖子.

我想通过变量设置矩阵构建轴"的值". 我没了主意,这有可能吗?

I want to set the "values" of the "axis" of the matrix-build from a variable. I am out of Ideas, is this even possible?

这是我的示例:
一个带有文件my_library.groovy

So here is my example:
a "JenkinsLibrary" with a file my_library.groovy

def call(Map i_options)
{
// later I will parse the options to set the values, but currently the step before already crashes ...

    def axis_1_values = "axis_1_value_A"
// already tried the following alternatives ...
//    def axis_1_values = 'axis_1_value_A'
//    def axis_1_values = '''axis_1_value_A'''
//    def axis_1_values = ["axis_1_value_A", "axis_2_value_A"]
    pipeline
    {
        agent any
        stages { stage("stage A") { matrix {
            axes {
                axis {
                    name "axis_1"
                    // values "axis_1_value_A" // <- of course this works ...
                    // but I want to read it from a variable
                    values "${axis_1_values}" 
                    // I already tried more variants
                    // values ${axis_1_values}
                    // values axis_1_values
                }
                axis {
                    name "axis_2"
                    values "axis_2_value_A", "axis_2_value_B"
                }
            }
            stages {
                stage("another stage") { steps {
                    echo "hello world from ${axis_1} && ${axis_2}"
                } }
            }
        } } }
    }
}

带有文件"Jenkinsfile"的插件:

A Plugin with a file "Jenkinsfile":

@Library("JenkinsLibrary") _

def options = [
    axis_values: "a_axis_value"
]

my_library(options)

我遇到以下错误:

[...] Expected string literal but got "${axis_1_values}"

完整日志:

    19: Expected string literal but got "${axis_1_values}" @ line 19, column 28.
                       values "${axis_1_values}" 
                              ^

1 error

    at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310)
    at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1085)
    at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:603)
    at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:581)
    at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:558)
    at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
    at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
    at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:254)
    at groovy.lang.GroovyClassLoader.recompile(GroovyClassLoader.java:761)
    at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:718)
    at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:787)
    at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:775)
    at org.jenkinsci.plugins.workflow.cps.global.UserDefinedGlobalVariable.getValue(UserDefinedGlobalVariable.java:57)
    at org.jenkinsci.plugins.workflow.cps.CpsScript.invokeMethod(CpsScript.java:113)
    at sun.reflect.GeneratedMethodAccessor729.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    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:160)
    at org.kohsuke.groovy.sandbox.GroovyInterceptor.onMethodCall(GroovyInterceptor.java:23)
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onMethodCall(SandboxInterceptor.java:157)
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onMethodCall(SandboxInterceptor.java:142)
    at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:158)
    at org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:162)
    at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.methodCall(SandboxInvoker.java:17)
    at WorkflowScript.run(WorkflowScript:21)
    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 sun.reflect.GeneratedMethodAccessor500.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
    at com.cloudbees.groovy.cps.impl.LocalVariableBlock$LocalVariable.get(LocalVariableBlock.java:39)
    at com.cloudbees.groovy.cps.LValueBlock$GetAdapter.receive(LValueBlock.java:30)
    at com.cloudbees.groovy.cps.impl.LocalVariableBlock.evalLValue(LocalVariableBlock.java:28)
    at com.cloudbees.groovy.cps.LValueBlock$BlockImpl.eval(LValueBlock.java:55)
    at com.cloudbees.groovy.cps.LValueBlock.eval(LValueBlock.java:16)
    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)
    at org.codehaus.groovy.runtime.GroovyCategorySupport$ThreadCategoryInfo.use(GroovyCategorySupport.java:129)
    at org.codehaus.groovy.runtime.GroovyCategorySupport.use(GroovyCategorySupport.java:268)
    at com.cloudbees.groovy.cps.Continuable.run0(Continuable.java:163)
    at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.access$001(SandboxContinuable.java:18)
    at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.run0(SandboxContinuable.java:51)
    at org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.java:185)
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:405)
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$400(CpsThreadGroup.java:96)
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:317)
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:281)
    at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:67)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:131)
    at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28)
    at jenkins.security.ImpersonatingExecutorService$1.run(ImpersonatingExecutorService.java:59)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Finished: FAILURE

我的系统: Jenkins版本:Jenkins版本. 2.190.1
声明性插件版本1.5.0
声明式代理程序API:1.1.1
声明性扩展点API:1.5.0
(很多其他插件,我认为这是重要的插件)

My System: Jenkins-Version: Jenkins ver. 2.190.1
Declarative-Plugin-Version 1.5.0
Declarative Agent API: 1.1.1
Declarative Extension Points API: 1.5.0
(many other plugins, I think this are the important ones)

更新
我仍然没有解决方案.但是,当我定义这样的变量时,我了解到我尝试在该变量中插入"GStringImpl".但是我无法将其转换为java-string.

UPDATE
I still do not have a solution. But when I define a variable like this, I understand that I try to insert a "GStringImpl" to that. But I am unable to cast it as java-string.

def _str_1 = "a string"
def _str_2 = "${_str_1}"
println _str_1.class             // -> class java.lang.String
println _str_2.class             // -> class org.codehaus.groovy.runtime.GStringImpl
def _str_3 = "${_str_1}" as java.lang.String  
println _str_3.class             // -> class java.lang.String

但是我仍然不知道如何添加一个值,因为如果这样做

But I still don't know how I can add a single value, because if I do

values "${axis_1_values}" as as java.lang.String     // error-msg: Expected string literal but got ${as}  
values ("${axis_1_values}" as java.lang.String)      // error-msg: Expected string literal but got ${"${axis_1_values}"  
values axis_1_values.toString()                      // error-msg: Method calls on objects not allowed outside "script" blocks.
values "${axis_1_values}".toString()                 // error-msg: Expected a symbol @ line 26, column 28.

这种强制转换的东西可能适用于单个值,但是我希望能够添加一个值列表,就像它在默认示例中可能适用的那样...
values "axis_2_value_A", "axis_2_value_B"

This casting stuff may work for a single value, but I want to be able to add a list of values, like its possible in the default example which works ...
values "axis_2_value_A", "axis_2_value_B"

我想知道,这是否可以在声明式管道的"docker-agent"部分中使用.

I am wondering, that this works in the "docker-agent"-part of the declarative pipeline.

agent { 
    docker {
        image "${_image}:latest"
        label "${_label}"
    }
}

但是在代码中,我意识到docker-label的解析是单独实现的...

But I in the code, I realized that the parsing of the docker-label is implemented separately ...

我仍然不知道如何在声明式管道的矩阵/轴特征内实现该目标.

I have still no Ideas how to reach that goal within the matrix / axis features of the declarative pipeline.

(事实:这样做的主要原因之一是,蓝色海洋视图中脚本管道的可视化仍然存在问题,并且这个问题似乎被忽略了...
https://issues.jenkins-ci.org/browse/JENKINS-53751)

(funfact: one of the main reasons why even doing this that the visualisation in the blue-ocean view for scripted-pipelines is still buggy and the issue seems to be ignored ...
https://issues.jenkins-ci.org/browse/JENKINS-53751 )

推荐答案

动态轴值.错误消息说它期望一个文字字符串"值.也许消息还应该说:不允许使用模板字符串,数组,变量或函数调用."

Dynamic axis values are not supported in Declarative Pipeline as of v1.6.0 of the plugin. The error message says it expects a "literal string" value. Perhaps the message should also say, "Template strings, arrays, variables, or function calls are not allowed."

这是设计使然,目的是防止管道作者被管道引擎的某些内部假设所困扰.可能有可能进行更改,但需要进行仔细的计划和测试.

This is by design, intended to keep pipeline authors from getting bitten by some internal assumptions of the pipeline engine. It might be possible to change but will require careful planning and testing.

请通过 https://issues.jenkins.io/提交JIRA和/或加入 Jenkins Pipeline Authoring SIG 并帮助实现此功能.

Please file a JIRA at https://issues.jenkins.io/ and/or join the Jenkins Pipeline Authoring SIG and help implement this feature.

这篇关于具有动态矩阵轴值的声明性管道的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆