有没有人尝试过使用Jenkins Rest / API或任何其他方式在Jenkins slave配置中添加或更新ENVIRONMENT变量的方法。
使用Jenkins Swarm插件,我创建了一个slave(它使用JLNP连接到Jenkins master)但环境变量(复选框没有勾选)并且没有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.html或http://javadoc.jenkins-ci.org/hudson/model/Slave.html或http://javadoc.jenkins-ci.org/hudson/slaves/DumbSlave.html ,但它没有提供设置Node的属性/ ENV变量的任何方法/方法。没有setNodeProperties或类似的东西(如果这是设置ENV变量/属性的正确方法)。
我正在寻找的是一种将以下变量添加到从属设备的方法。
这篇文章(由 Villiam )反映有人尝试了groovy piece来做同样的事情,但我看不出他如何使用相同的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
答案 0 :(得分: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()
答案 1 :(得分: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()
答案 2 :(得分: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()