【问题标题】:Accessing Jenkins global property in Groovy在 Groovy 中访问 Jenkins 全局属性
【发布时间】:2015-03-24 20:17:24
【问题描述】:

此时我在 Manage Jenkins -> Configure System -> Global Properties 下定义了一个名为 GLOBAL_VAR 的环境变量,其值为“test”。构建项目时,我有一个 shell 脚本,其中包含

echo "The value of the global variable is ${GLOBAL_VAR}"

如果执行,结果就是我所期望的:

The value of the global variable is test

现在我的问题是我想在一个 Groovy 脚本中访问这个变量,该脚本用于在 Jenkins 的参数化构建属性中创建一个下拉菜单。此下拉菜单包含在执行构建时执行的 shell 脚本中也使用的值。因此,当有人在 Jenkins 本身中单击“使用参数构建”时,应该创建下拉项,例如在任何构建开始之前

我不想每次更改这些值时都更改 shell 脚本代码和下拉 Groovy 脚本。此外,我想在不同的构建作业中使用相同的值,这意味着我每次需要更改变量时都需要更改它们。

创建下拉菜单的动态选择参数仅包含以下用于生成选择的 Groovy 表达式:

 def list = ["Option 1", "Option 2", "Option 3", "Option 4"]

我想将我的 GLOBAL_VAR 的值添加到此列表中。

有人知道如何在 Groovy 中访问 Jenkins 环境变量吗?或者有没有人知道一种不同的方式来管理我想在动态选择参数(下拉菜单)和构建时执行的 shell 脚本中使用的变量?

【问题讨论】:

    标签: groovy jenkins global-variables


    【解决方案1】:

    这是一些工作代码的示例:

    import jenkins.model.*
    nodes = Jenkins.instance.globalNodeProperties
    nodes.getAll(hudson.slaves.EnvironmentVariablesNodeProperty.class)
    envVars = nodes[0].envVars
    envVars['MY_GLOBAL_PROPERTY']
    

    我的解决方案来源:

    https://gist.github.com/johnyzed/2af71090419af2b20c5a

    http://pghalliday.com/jenkins/groovy/sonar/chef/configuration/management/2014/09/21/some-useful-jenkins-groovy-scripts.html

    请注意删除我之前答案的“核心”版主:我在互联网上搜索了好几个小时才找到正确的解决方案,你不应该在不知道它真正在说什么的情况下删除帖子。我觉得这种行为相当令人沮丧:(

    【讨论】:

    • 完美运行。这应该是将来帮助像我这样的人的公认答案。
    • 对我来说也很完美。谢谢! +1 这是一个公认的答案。
    【解决方案2】:

    在“执行 Groovy 脚本”中,您可以通过以下方式访问全局(和构建)变量:

    def env = System.getenv()
    println(env['GLOBAL_VAR'])
    

    【讨论】:

    • 当我打开 Build with Parameters 页面时,帮助创建下拉列表的脚本在 Jenkins 本身中执行。我想这可能是问题所在,因为在执行您的建议时我得到了一个空变量。 tmplist << env['GLOBAL_STRING_BACKUP']
    【解决方案3】:

    你可以使用:

    import jenkins.model.*
    instance = Jenkins.getInstance()
    globalNodeProperties = instance.getGlobalNodeProperties()
    envVarsNodePropertyList = globalNodeProperties.getAll(hudson.slaves.EnvironmentVariablesNodeProperty.class)
    
    newEnvVarsNodeProperty = null
    envVars = null
    
    if ( envVarsNodePropertyList == null || envVarsNodePropertyList.size() == 0 ) {
      newEnvVarsNodeProperty = new hudson.slaves.EnvironmentVariablesNodeProperty();
      globalNodeProperties.add(newEnvVarsNodeProperty)
      envVars = newEnvVarsNodeProperty.getEnvVars()
    } else {
      envVars = envVarsNodePropertyList.get(0).getEnvVars()
    
    }
    
    envVars.put("FOO", "foo")
    instance.save()
    

    找到解决办法here

    【讨论】:

      【解决方案4】:

      有谁知道如何访问 Jenkins 环境变量 时髦吗?

      我可以提供一个我们使用的 Jenkins 工作的示例。该作业是参数化的,并为用户提供了设置许多值的能力,其中之一是“InstallVersion”(默认值为 -1)。此外,我们设置了一个名为“JENKINS_TRUNK_LABEL”的环境变量。我不会详细介绍这项工作,但是,这是我们在 Groovy 脚本中引用“JENKINS_TRUNK_LABEL”的方式。

      if (InstallVersion == "-1")
      {
        InstallVersion = "$JENKINS_TRUNK_LABEL"
      }
      

      【讨论】:

      • 我将 test = "$GLOBAL_VAR" 添加到我的 Groovy 脚本后,它就会停止工作。我在我的问题中添加了一些细节以获取更多信息。
      • 您是否有关于如何设置 JENKINS_TRUNK_LABEL 变量、Groovy 脚本中可能的导入和/或您使用的可能插件的其他信息?
      • 能够以这种方式使用环境变量是由于 Groovy 插件的类型。我们目前安装了三个,但是,我相信正在使用的是 Groovy 标签分配插件。我的理解是环境变量访问机制取决于您想要访问它的上下文。例如,预构建、构建后等。这就是我们使用三个不同插件的原因。
      • 我同意这个问题确实与您想要访问变量的时刻有关。在您的情况下,您可以在预构建时访问它们,但是在该人单击构建按钮之后,还是我错了?我需要在用户单击“使用参数构建”之后但在页面出现之前运行脚本;届时必须加载参数的选项。
      猜你喜欢
      • 2018-09-16
      • 1970-01-01
      • 1970-01-01
      • 2022-12-19
      • 2017-11-23
      • 2015-04-26
      • 1970-01-01
      • 2019-08-06
      • 1970-01-01
      相关资源
      最近更新 更多