7

Czy ktoś próbował sposób dodać lub zaktualizować zmienną ŚRODOWISKO w konfiguracji Jenkins niewolników za pomocą Jenkins Rest/API lub w jakikolwiek inny sposób.Jenkins Slave - jak dodać lub zaktualizować zmienne ŚRODOWISKA

Używając wtyczki Jenkins Swarm, stworzyłem slave (używa JLNP do połączenia z mistrzem Jenkinsa), ale zmienne ŚRODOWISKO (pole wyboru nie jest zaznaczone) i nie istnieją zmienne ŚRODOWISKO utworzone przez jar klienta Swarm (domyślnie). Użytkownik może ręcznie dodać, jeśli jest to wymagane, ale szukam sposobu na dodanie/aktualizację zmiennych ENV w slave.

enter image description here

Chcę utworzyć wiele niewolników Swarm (gdzie każdy niewolnik ma różne narzędzia o różnych wartościach tj slave01 JAVA_HOME =/ścieżka/jdk1.7.0.67 i innych slave02 JAVA_HOME =/ścieżka/jdk1.8.0_45 itd itd).

Próbowałem patrząc http://javadoc.jenkins-ci.org/hudson/model/Node.html lub http://javadoc.jenkins-ci.org/hudson/model/Slave.html lub http://javadoc.jenkins-ci.org/hudson/slaves/DumbSlave.htmlale nie przewiduje żadnych Metoda/sposób ustawiania właściwości/zmienne ENV węzła. Nie ma właściwości setNodeProperties lub czegoś podobnego (jeśli jest to właściwa metoda ustawiania zmiennych/właściwości ENV).

To, czego szukam, to sposób na dodanie następujących zmiennych do urządzenia podrzędnego.

enter image description here

Ten post (przez Villiam) odzwierciedla fakt, że ktoś próbował groovy kawałek zrobić to samo, ale nie widzę w jaki sposób może on ustawić zmienne ENV przy użyciu tego samego API to Create/Manage Nodes

Jenkins- CLI ma możliwość uruchamiania skryptów odjechane:

java -jar path/to/jenkins-cli.jar -s http://localhost:8080 groovy path/to/script

scenariusz:

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

(patrz Dokumentacja dla innych opcji: http://javadoc.jenkins-ci.org/)

Można również uruchomić interaktywną groovy powłokę z

java -jar jenkins-cli.jar -s http://localhost:8080 groovysh

Odpowiedz

1

metodę, która będzie działać, jeśli „Zmienne środowiskowe” pole nie zostało zaznaczone jest użycie nodeProperties.add(new EnvironmentVariablesNodeProperty)

pełny skrypt używam ustawienie zmiennych środowiskowych na Jenkins podczas wdrażania jest poniżej (ma być wywoływana z 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

Tworząc węzeł , możesz przekazać zmienne jako ostatni parametr:

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

Od DumbSlave here i EnvironmentVariablesNodeProperty here.

Aby dodać zmienne do istniejącego niewolnika, możemy użyć następujących:

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

Świetnie! Czy możesz wskazać, jeśli węzeł jest już utworzony (w pewien sposób) i chcę użyć powyższego kodu (ale zamiast używać funkcji addNode i nowych DumbSlave, mogę użyć czegoś takiego jak updateNode i po prostu zmienić/dodać/zaktualizować ENV Zmienna? Uaktualniłem twoją odpowiedź z tym, co miałem na myśli (możemy dodać if-then-else później i sprawić, by ten parametr był dobrze napisany) .Jeśli możemy ulepszyć ten skrypt jako ogólny skrypt (tzn. można go użyć dla dowolnego Jenkinsa master instance) –

+1

Twoje rozwiązanie działało TYLKO, jeśli pole wyboru "Zmienne środowiskowe" jest ręcznie zaznaczone/zaznaczone jako pierwsze.Jeśli słoik wtyczki Swarm jest używany do utworzenia urządzenia podrzędnego, pole wyboru "Zmienna środowiskowa" NIE jest zaznaczone. Zmienna do istniejącego slave (rozwiązanie) działa tylko wtedy, gdy ręcznie zaznaczyłem to pole jako pierwsze Zapisz plik slave, a następnie uruchom powyższy skrypt. Rzeczywiście osiągnąłem ten sam ostatni tydzień, ale obecnie jestem zaskoczony pytaniem "Jak automatycznie ustawić to pole wyboru" dla Env Zmienne żelazne "w konfiguracji niewolniczej przed uruchomieniem powyższego cennego elementu. –

+0

Hi @ArunSangal, czy kiedykolwiek rozwiązałeś automatycznie problem z włączaniem zmiennych środowiskowych? Mam dokładnie ten sam problem i nie mogę go rozwiązać. – laffoyb

1

Moja nswer jest trochę mash-mash innych odpowiedzi, ale włącza "zmiennych środowiskowych", jeśli jest wyłączony.

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