jenkins - 如何在 Jenkins 声明性管道脚本 block 内循环分配 env

标签 jenkins groovy jenkins-pipeline

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

for (elem in userInput)
  env["${elem.key}"] = "${elem.value}"

但是这失败了:

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)
    ...

分配这种方式有效:

env.KEY1 = userInput['KEY1']
env.KEY2 = userInput['KEY2']

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

最佳答案

批准putAt sandbox 中的方法.

替代品可以是

env.put(elem.key, elem.value)
env."${elem.key}" = elem.value

也不要在此语法中使用双引号 env["key"] .因为env["key"]env['key']是两个不同的键。在您的示例中,您最好只使用 env[elem.key]env[elem.key.toString()]如果elem.key可能不是字符串。参见 Why Map does not work for GString in Groovy?

关于jenkins - 如何在 Jenkins 声明性管道脚本 block 内循环分配 env,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49326439/

相关文章:

java - 如何在jenkins管道中获取{env.WORKSPACE}的父目录

shell - Jenkins 执行 shell 找不到 gradle 命令

Jenkins - Next Execution 插件 - 如何通过 REST API 获取详细信息

selenium - 使用 jenkins 运行 selenium 测试用例(测试用例在机器人框架中)

jdbc - DriverManager 在 gradle 自定义插件的任务中看不到依赖项

Groovy .each 闭包将元素包装在不需要的 Object[] 中

linux - 用于提取应用程序名称的 Shell 脚本

groovy - 在 Groovy 中跟踪文件

Jenkins 管道: agent vs node?

Jenkins-pipeline:没有这样的 DSL 方法