Adding environment variables to node configuration

849 views
Skip to first unread message

Barry Laffoy

unread,
May 3, 2016, 11:02:15 AM5/3/16
to Jenkins Users
Hi

As in this SO question, http://stackoverflow.com/q/34186806/1506521, I am trying to set environment variables on my Jenkins nodes (master + slaves) automatically. i.e. via a script, without having to go through the web front end.

The code given in the answer only works if the Node Properties Environment Variables checkbox in the web interface has already been ticked.

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

jenkins
= Jenkins.instance
node
= jenkins.getNode('master')
props
= node.nodeProperties.getAll(hudson.slaves.EnvironmentVariablesNodeProperty.class)

for (prop in props) {
  prop
.envVars.put("MY_OTHER_NAME", "my_other_value")
}

jenkins
.save()


I can't seem to find a way to enable the Node Properties Environment Variables checkbox without doing so manually through the web interface.

I can create a new EnvironmentVariablesNodeProperty class and insert my env vars into this, but then I cannot apply this to the jenkins instance:

import jenkins.model.Jenkins
import hudson.slaves.EnvironmentVariablesNodeProperty
import hudson.slaves.NodeProperty

def instance = Jenkins.instance
def evnp = new EnvironmentVariablesNodeProperty();

for (prop in evnp) {
  prop
.envVars.put("MY_OTHER_NAME", "my_other_value")
}

instance
.nodeProperties = evnp

instance
.save()

This results in the error message 

groovy.lang.ReadOnlyPropertyException: Cannot set readonly property: nodeProperties for class: hudson.model.Hudson

In jenkins.model.Jenkins, nodeProperties is set to private, so I believe that's why I can't overwrite it. However, I don't see any interface to update it.

Is there some clever groovy metaprogramming trick that might allow me to force-write a private field?

Alternatively, it seems possible to create a new DumbSlave via groovy with this code

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

However, I don't see how this could be used to set an environment variable on the existing master node. It doesn't seem possible to overwrite that node with a new DumbSlave. Is there some way of specifying a list of environment variables for the master node when first deploying Jenkins?

Barry Laffoy

unread,
May 3, 2016, 11:08:55 AM5/3/16
to Jenkins Users
Okay, mere moments after I posted this, user @OltzU gave me a solution in IRC.

I needed to be using instance.nodeProperties.add(). So this code works

import jenkins.model.Jenkins
import hudson.slaves.EnvironmentVariablesNodeProperty
import hudson.slaves.NodeProperty


def instance = Jenkins.instance


def evnp = new EnvironmentVariablesNodeProperty();
for (prop in evnp) {
  prop
.envVars.put("MY_OTHER_NAME", "my_other_value")
}



instance
.nodeProperties.add(evnp)


instance
.save()

Perfect!
Reply all
Reply to author
Forward
0 new messages