如何在 Jenkins 声明性管道脚本块内的循环中分配给 env

axa*_*lis 3 groovy jenkins jenkins-pipeline

我在循环中分配变量时遇到问题env。我基本上想将所有内容从用户输入表单复制到环境:

for (elem in userInput)
  env["${elem.key}"] = "${elem.value}"
Run Code Online (Sandbox Code Playgroud)

然而这失败了:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use staticMethod
org.codehaus.groovy.runtime.DefaultGroovyMethods putAt java.lang.Object java.lang.String java.lang.Object
    at org.jenkinsci.plugins.scriptsecurity.sandbox.whitelists.StaticWhitelist.rejectStaticMethod(StaticWhitelist.java:189)
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onSetArray(SandboxInterceptor.java:474)
    at org.kohsuke.groovy.sandbox.impl.Checker$11.call(Checker.java:438)
    at org.kohsuke.groovy.sandbox.impl.Checker.checkedSetArray(Checker.java:445)
    at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.setArray(SandboxInvoker.java:49)
    at com.cloudbees.groovy.cps.impl.ArrayAccessBlock.rawSet(ArrayAccessBlock.java:26)
    at WorkflowScript.run(WorkflowScript:120)
    at ___cps.transform___(Native Method)
    ...
Run Code Online (Sandbox Code Playgroud)

这种分配方式有效:

env.KEY1 = userInput['KEY1']
env.KEY2 = userInput['KEY2']
Run Code Online (Sandbox Code Playgroud)

然而,我仍然更喜欢在循环中更新env以避免重复和拼写错误的可能性,有什么办法可以做到这一点/以某种方式与输入数据合并?(是的,管道是声明性的,在沙箱中运行,并且应该保持原样)

Vit*_*nko 6

批准沙箱putAt中的方法。

替代方案可以是

env.put(elem.key, elem.value)
env."${elem.key}" = elem.value
Run Code Online (Sandbox Code Playgroud)

也不要在此语法中使用双引号env["key"]。因为env["key"]env['key']是两个不同的键。在您的示例中,您最好选择 justenv[elem.key]env[elem.key.toString()]ifelem.key可能不是字符串。请参阅为什么 Map 不适用于 Groovy 中的 GString?