jenkins Slave API setLabelString добавляет в список пользователей

У меня есть следующий скрипт под JOB, который при запуске добавляет идентификатор пользователя к метке подчиненного устройства.

import jenkins.model.Jenkins
import hudson.model.User
import hudson.security.Permission
import hudson.EnvVars

EnvVars envVars = build.getEnvironment(listener);

def userId= envVars .get('BUILD_USER_ID')
def nodeName= envVars .get('NODE_NAME')
def nodeOffpool= envVars .get('NODE_GOING_OFFPOOL')

allUsers = User.getAll()
println allUsers
println ""

// add userid as a label if doesnot exist
for (slave in hudson.model.Hudson.instance.slaves) {
  if( slave.nodeName.equals(nodeOffpool)) {

  def labelList = (slave.getLabelString()).split()
  println labelList
  // check for user access to machine
  for(label in labelList) {
       println (User.get(label))
       println (User.get(label) in allUsers)
       if (User.get(label) in allUsers) {
            if (label == userId) {
                 println ("This Node has already been assigned to you ($userId)")
            } else {
                 println ("This Node($nodeOffpool) has already been assigned to someone($label) else, you cannot use it now")
                 println ("Please ask the user $label  to release the Node($nodeOffpool)  for you($label) to run")
            }
            return
       }
  };
  println ("before: " + slave.getLabelString())
  // setting the slave with new label
  String newLabel = slave.getLabelString() + " " + userId 
  slave.setLabelString(newLabel)
  println ("after: " + slave.getLabelString())
  }
}

Когда я запускаю в первый раз, вывод выглядит нормально

[user1, user2, SYSTEM, unknown]
[TESTLAB3, TESTLAB4]
TESTLAB3
false
TESTLAB4
false
before: TESTLAB3 TESTLAB4
after: TESTLAB3 TESTLAB4 user1

Когда я бегу во второй раз

[user1, user2, SYSTEM, unknown, TESTLAB3, TESTLAB4]
[TESTLAB3, TESTLAB4, user1]
TESTLAB3
true
This Node(node1) has already been assigned to someone(TESTLAB3) else, you cannot use it now
Please ask the user TESTLAB3  to release the Node(node1)  for you(TESTLAB3) to run
Finished: SUCCESS

Это проблема с Jenkins API. Я использую Дженкинс 1.573.

сопутствующие вопросы:

  1. Как идентифицировать администраторов в Jenkins с помощью groovy скрипты
  2. jenkins меняет метку по запросу

Обновлено:

Я нашел ответ по следам и ошибкам.

User.get(label)

добавляет метку от имени пользователя, если она не существует по умолчанию. Чтобы предотвратить это добавление, мы должны использовать

User.get(label, false)

person bicepjai    schedule 10.03.2015    source источник


Ответы (1)


Вы добавляете имя пользователя в метку подчиненного устройства. Печать User.getAll() просто печатает список пользователей для вашего Jenkins, а не метки подчиненного устройства, которые вы изменили с помощью имени пользователя.

Вот скрипт, который вы можете использовать, чтобы проверить, добавлены ли к вашим подчиненным машинам новые метки:

for (slave in jenkins.model.Jenkins.instance.slaves) {
  print "Slave: " + slave.getNodeName() + "\n";  
  print "Label: " + slave.getLabelString() + "\n\n";
}

Кроме того, вы можете изменить сценарий так, чтобы он устанавливал новую метку для ведомого устройства только в том случае, если он еще не содержит пользователя, потому что вы будете добавлять его несколько раз каждый раз, когда сценарий запускается так, как он написан сейчас.

person LeoLiu    schedule 10.03.2015