Jenkins从机 - 如何添加或更新环境变量

11

有人尝试过使用Jenkins Rest/API或其他方式来添加或更新Jenkins从节点配置中的环境变量吗?

我使用Jenkins Swarm插件创建了一个从节点(它使用JLNP连接到Jenkins主服务器),但是没有勾选环境变量复选框,Swarm客户端jar也没有创建任何环境变量(默认情况下)。用户可以手动添加,但我想知道是否有一种方法可以在从节点中添加/更新环境变量。

enter image description here

我想创建多个Swarm从节点(每个从节点具有不同的工具和值,例如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,但它们没有提供设置节点属性/环境变量的任何方法/方式。没有setNodeProperties或类似的方法(如果那是设置ENV变量/属性的正确方法的话)。
我正在寻找一种将以下变量添加到从节点的方法。

enter image description here

这篇帖子(由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

4个回答

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 这里 和 EnvironmentVariablesNodeProperty 这里

要向现有的从属节点添加变量,我们可以使用以下方法:

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和new DumbSlave函数,而是使用updateNode并更改/添加/更新ENV变量)怎么办吗?我用我的意思更新了你的答案(我们稍后可以添加if-then-else并使此Groovy脚本参数驱动)。另外,如果我们可以将此脚本增强为通用脚本(即可用于任何Jenkins主实例),那就太好了。 - AKS
1
你的解决方案仅在手动选中“环境变量”复选框时才有效。当使用Swarm插件jar创建从节点时,“环境变量”复选框未被选中。只有在我手动选中此框后,对现有从节点添加环境变量(解决方案)才能正常工作。保存从节点,然后运行上述脚本。上周我确实做到了同样的事情,但目前困惑于“如何在运行上述宝贵的代码片段之前自动设置从节点配置中的环境变量复选框”。 - AKS
嗨@ArunSangal,你解决了自动启用环境变量复选框的问题吗?我遇到了完全相同的问题,但似乎无法解决。 - laffoyb

3
如果“环境变量”复选框未被选中,则可以使用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()

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

0

我写了这个程序来更新一组有限的节点(包括启用复选框):

import hudson.model.*
import hudson.slaves.*

hudson = hudson.model.Hudson.instance
hudson.slaves.findAll { it.nodeName.matches("nodename.*") }.each { slave -> 
    slave.nodeProperties.add(new EnvironmentVariablesNodeProperty())
    props = slave.nodeProperties.getAll(hudson.slaves.EnvironmentVariablesNodeProperty.class)
    for (prop in props) {
        prop.envVars.put("GIT_CEILING_DIRECTORIES", "/home")
    }
}
hudson.save()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接