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

Jenkins Slave - How to add or update ENVIRONMENT variables

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

使用 Jenkins Swarm 插件,我创建了一个从站(它使用 JLNP 连接到 Jenkins 主站)但是环境变量(未勾选复选框)并且没有由 Swarm 客户端 jar 创建的环境变量(默认情况下)。如果需要,用户可以手动添加,但我正在寻找是否有办法在从站中添加/更新 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.html or http://javadoc.jenkins-ci.org/hudson/model/Slave.html or http://javadoc.jenkins-ci.org/hudson/slaves/DumbSlave.html 但是 它没有提供任何方法/方式来设置 Node 的属性/ENV 变量。没有 setNodeProperties 或类似的东西(如果这是设置 ENV variables/properties 的正确方法)。

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

这个post(作者Villiam)反映有人试图groovy做同样的事情,但我不知道他如何设置ENV使用相同的变量 API to Create/Manage Nodes

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

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

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

如果未勾选 "Environment Variables" 复选框,则可以使用的方法是使用 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()

我的回答有点混杂了其他答案,但它会在关闭时 'Environment variables' 打开。

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

快速更新一组有限的节点(包括启用复选框):

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