【问题标题】:Jenkins Slave - How to add or update ENVIRONMENT variablesJenkins Slave - 如何添加或更新环境变量
【发布时间】:2024-04-14 07:45:01
【问题描述】:

有没有人尝试过使用 Jenkins Rest/API 或任何其他方式在 Jenkins 从站配置中添加或更新 ENVIRONMENT 变量的方法。

使用 Jenkins Swarm 插件,我创建了一个从站(它使用 JLNP 连接到 Jenkins 主站),但环境变量(未勾选复选框)并且没有由 Swarm 客户端 jar 创建的环境变量(默认情况下)。用户可以手动添加 if reqd 但我正在寻找是否有办法在从属设备中添加/更新 ENV 变量。

我想创建多个 swarm slave(其中每个 slave 有不同的工具,具有不同的值,即 slave01 JAVA_HOME=/path/jdk1.7.0.67 和其他 slave02 JAVA_HOME=/path/jdk1.8.0_45 等)。

我尝试查看http://javadoc.jenkins-ci.org/hudson/model/Node.htmlhttp://javadoc.jenkins-ci.org/hudson/model/Slave.htmlhttp://javadoc.jenkins-ci.org/hudson/slaves/DumbSlave.html 它没有提供任何方法/方式来设置节点的属性/ENV 变量。没有 setNodeProperties 或类似的东西(如果这是设置 ENV 变量/属性的正确方法)。

我正在寻找的是一种将以下变量添加到从站的方法。

这篇文章(由 Villiam 撰写)反映有人尝试了 groovy 作品来做同样的事情,但我不明白他如何使用相同的 API to Create/Manage Nodes 设置 ENV 变量

Jenkins-CLI 有一个运行 groovy 脚本的选项:

java -jar path/to/jenkins-cli.jar -s http://localhost:8080 groovy path/to/script

脚本:

import jenkins.model.*
import hudson.model.*
import hudson.slaves.*
Jenkins.instance.addNode(new DumbSlave("test-script","test slave description","C:\\Jenkins","1",Node.Mode.NORMAL,"test-slave-label",new JNLPLauncher(),new RetentionStrategy.Always(),new LinkedList())) 

(有关其他选项,请参阅文档:http://javadoc.jenkins-ci.org/

您还可以使用

运行交互式 groovy shell

java -jar jenkins-cli.jar -s http://localhost:8080 groovysh

【问题讨论】:

    标签: jenkins environment-variables jenkins-plugins master-slave


    【解决方案1】:

    我的答案是其他答案的混搭,但如果“环境变量”关闭,它会打开它。

    public class KeyValuePair {
        String key
        String value
    }
    
    ...
    
    KeyValuePair[] environmentVariables = [...]
    
    ...
    
    import hudson.slaves.EnvironmentVariablesNodeProperty
    
    Jenkins jenkins = Jenkins.instance
    
    List<EnvironmentVariablesNodeProperty> nodeProperties = jenkins.globalNodeProperties.getAll(EnvironmentVariablesNodeProperty.class)
    
    if (nodeProperties.empty) { // Enable 'Environment variables' under 'Global properties'
        jenkins.globalNodeProperties.add(new EnvironmentVariablesNodeProperty())
        nodeProperties = jenkins.globalNodeProperties.getAll(EnvironmentVariablesNodeProperty.class)
    }
    
    for (int nodePropertyIndex = 0; nodePropertyIndex < nodeProperties.size(); nodePropertyIndex++) {
        EnvironmentVariablesNodeProperty nodeProperty = nodeProperties[nodePropertyIndex]
        for (int environmentVariableIndex = 0; environmentVariableIndex < environmentVariables.size(); environmentVariableIndex++) {
            KeyValuePair environmentVariable = environmentVariables[environmentVariableIndex]
            nodeProperty.envVars.put(environmentVariable.key, environmentVariable.value)
        }
    }
    
    jenkins.save()
    

    【讨论】:

      【解决方案2】:

      如果“环境变量”复选框没有被选中,一个可行的方法是使用nodeProperties.add(new EnvironmentVariablesNodeProperty)

      我在部署时用于在 Jenkins 上设置环境变量的完整脚本如下(打算使用 jenkins-cli.jar 调用):

      import jenkins.model.*
      import hudson.model.*
      import hudson.slaves.*
      
      String node_name = args[0]
      String env_key = args[1]
      String env_value = args[2]
      
      instance = Jenkins.getInstance()
      if (node_name == "master") {
        node = instance
      } else {
        instance.getNode(node_name)
      }
      props = node.nodeProperties.getAll(hudson.slaves.EnvironmentVariablesNodeProperty.class)
      
      if(props.empty) {
        def entry = new EnvironmentVariablesNodeProperty.Entry(env_key, env_value)
        def evnp = new EnvironmentVariablesNodeProperty(entry)
        node.nodeProperties.add(evnp)
      } else {
        for (prop in props) {
          prop.envVars.put(env_key, env_value)
        }
      }
      
      instance.save()
      

      【讨论】:

        【解决方案3】:

        创建节点时,可以将变量作为最后一个参数传递:

        import jenkins.model.*
        import hudson.model.*
        import hudson.slaves.*
        
        entry = new EnvironmentVariablesNodeProperty(new EnvironmentVariablesNodeProperty.Entry("MY_NAME", "my_value"))
        
        list = new LinkedList()
        list.add(entry)
        
        Jenkins.instance.addNode(new DumbSlave("test-slave", "test slave description", "C:\\Jenkins", "1", Node.Mode.NORMAL, "test-slave-label", new JNLPLauncher(), new RetentionStrategy.Always(), list))
        

        来自 DumbSlave here 和 EnvironmentVariablesNodeProperty here

        要将变量添加到现有从站,我们可以使用以下内容:

        import jenkins.model.*
        import hudson.model.*
        import hudson.slaves.*
        
        jenkins = Jenkins.instance
        node = jenkins.getNode('test-slave')
        
        props = node.nodeProperties.getAll(hudson.slaves.EnvironmentVariablesNodeProperty.class)
        for (prop in props) {
          prop.envVars.put("MY_OTHER_NAME", "my_other_value")
        }
        jenkins.save()
        

        【讨论】:

        • 太棒了!你能指出如果节点已经创建(以某种方式)并且我想使用上面的代码(但不是使用 addNode 和新的 DumbSlave 函数,我可以使用 updateNode 之类的东西,只需更改/添加/更新一个 ENV变量?我用我的意思更新了你的答案(我们可以稍后添加 if-then-else 并使这个 groovy 脚本参数驱动)。此外,如果我们可以将此脚本增强为通用脚本(即它可以用于任何 Jenkins主实例)
        • 您的解决方案只有在首先手动选中/勾选“环境变量”复选框时才有效。当使用 Swarm 插件 jar 创建从站时,“环境变量”复选框未选中。仅当我首先手动选中此框时,才能将添加环境变量运行到现有从属设备(解决方案)。保存从站,然后运行上面的脚本。我上周确实实现了同样的目标,但目前在运行上述宝贵部分之前,我对从配置中的“如何自动设置环境变量的复选框”感到困惑。
        • 嗨@ArunSangal,你有没有解决过自动启用环境变量复选框的问题?我面临着完全相同的问题,但似乎无法解决。