web-dev-qa-db-fra.com

Jenkins Slave - Comment ajouter ou mettre à jour des variables ENVIRONMENT

Quelqu'un a-t-il déjà essayé d'ajouter ou de mettre à jour une variable ENVIRONMENT dans la configuration d'un esclave Jenkins à l'aide de Jenkins Rest/API ou d'une autre manière?.

En utilisant le plugin Jenkins Swarm, j'ai créé un esclave (il utilise JLNP pour se connecter au maître Jenkins) mais les variables ENVIRONMENT (la case à cocher n'est pas cochée) et aucune variable ENVIRONMENT n'a été créée par le fichier jar du client Swarm (par défaut). Un utilisateur peut ajouter manuellement si requis, mais je cherche s'il existe un moyen d'ajouter/de mettre à jour des variables ENV dans un esclave.

 enter image description here

Je souhaite créer plusieurs esclaves swarm (chaque esclave ayant des outils différents avec des valeurs différentes, par exemple slave01 Java_HOME =/chemin/jdk1.7.0.67 et un autre slave02 Java_HOME =/chemin/jdk1.8.0_45, etc.).

J'ai essayé de regarder dans http://javadoc.jenkins-ci.org/hudson/model/Node.html ou http://javadoc.jenkins-ci.org/hudson/model/Slave.html ou http://javadoc.jenkins-ci.org/hudson/slaves/DumbSlave.htmlmais il ne fournit aucune méthode/moyen pour définir les variables propriétés/ENV du nœud. Il n'y a pas de setNodeProperties ou quelque chose comme ça (si c'est la bonne méthode pour définir les variables/propriétés ENV).

Ce que je recherche, c’est un moyen d’ajouter les variables suivantes à l’esclave.

 enter image description here

Cet article (par Villiam) indique que quelqu'un a essayé de faire la même chose avec un morceau groovy, mais je ne vois pas comment il peut définir des variables ENV utilisant le même/ API pour créer/gérer des nœuds

Jenkins-CLI a une option pour exécuter des scripts groovy:

_ {Java -jar path/to/jenkins-cli.jar -s http://localhost:8080 groovy path/to/script

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

(voir docs pour d'autres options: http://javadoc.jenkins-ci.org/ )

Vous pouvez également exécuter un shell groovy interactif avec 

_ {Java -jar jenkins-cli.jar -s http://localhost:8080 groovysh

8
Arun Sangal

Une méthode qui fonctionnera si la case "Variables d'environnement" n'a pas été cochée consiste à utiliser nodeProperties.add(new EnvironmentVariablesNodeProperty)

Le script complet que j'utilise pour définir les variables d'environnement sur Jenkins lors du déploiement est présenté ci-dessous (destiné à être appelé avec 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
laffoyb

Lors de la création du nœud, vous pouvez passer les variables en dernier paramètre:

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

De DumbSlave ici et EnvironmentVariablesNodeProperty ici .

Pour ajouter des variables à un esclave existant, nous pouvons utiliser les éléments suivants:

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

Ma réponse est un peu un mélange de réponses, mais elle activera les "variables d'environnement" si elle est désactivée.

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