jenkins 中的参数化构建:未将参数作为 shell env 变量获取

Parameterised build in jenkins: Not getting parameters as shell env variables

詹金斯版本:2.6,Linux

问题:参数化构建变量在执行步骤中不可见(作为 env 变量)"shell script",它们曾经在旧的 1.x jenkins 版本中可见。

步骤:

  1. 使用多配置项目创建参数化构建。
  2. 为构建添加一个参数(使用 This project is parameterized-> string parameter, {if that matters} )。
  3. 向作业添加构建步骤 "Execute shell"。
  4. 在此 shell 脚本中将这些参数作为环境变量访问。

    echo "++++++++++++ 建筑 $lib_name ($lib_version) ++++++++++++++" =14=]

为了解决这个问题,我尝试在 "Prepare an environment for the run" 部分创建一个 groovy 脚本。我使用硬编码值创建了环境变量,这些值作为环境变量传递给 shell 脚本。

def map = ['lib_name':'lib1']
map['lib_version'] = 'master'
return map

但是,如果没有硬编码,即使使用来自的解决方案,我也无法访问这些变量值 How to retrieve Jenkins build parameters using the Groovy API?

我不知道还有什么要做的。有人可以推荐一下吗?

---> 根据对这个问题的评论进行更新: 当我 运行 在 jenkins 中执行以下行时,出现异常:

def buildVariablesMap = Thread.currentThread().executable.buildVariables 
buildVariablesMap.each{ k, v -> println "${k}:${v}" }




FATAL: No such property: executable for class: hudson.model.OneOffExecutor
groovy.lang.MissingPropertyException: No such property: executable for class: hudson.model.OneOffExecutor
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:53)
    at org.codehaus.groovy.runtime.callsite.GetEffectivePojoPropertySite.getProperty(GetEffectivePojoPropertySite.java:66)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGetProperty(AbstractCallSite.java:296)

要访问 shell 脚本中的参数:

在回声中评估它们:例如echo "${myParam}"

在代码中使用它们:def myNewvalueParam = ${myOtherParam}

要从 groovy 脚本中检索构建变量作为构建步骤:

def buildVariablesMap = Thread.currentThread().executable.buildVariables 
println buildVariablesMap['BUILD_NUMBER']

但请注意,要让您的 custom/altered 环境变量在接下来的步骤中可见,您应该使用 EnvInject plugin,您可以使用它定义一个步骤,将新的环境变量导出为关键 -值对就像属性文件一样。

这是 jenkins 中的一个错误,可能在凭据插件中: https://issues.jenkins-ci.org/browse/JENKINS-35921

感谢您的帮助!

我也遇到过类似的问题。这是一个对我有用的解决方案。我创建了一种方法,它始终只接受并传递我需要的一个构建参数。

方法:

String readingBuildParameters(VariableResolver varRes, String paramName){
    return varRes.resolve(paramName)
}

我如何在代码中使用它的行:

Build currentBuild        = Executor.currentExecutor().currentExecutable
VariableResolver varResolver    = currentBuild.getBuildVariableResolver()

df_parameter    = readingBuildParameters(varResolver, "parameter_name")

BR, 佐尔坦