0

我在 JOB 下有以下脚本,它在运行时将 userId 添加到从站的标签中。

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. 如何使用 groovy 脚本识别 Jenkins 上的管理员
  2. 詹金斯根据要求更改标签

更新:

我通过跟踪和错误找到了答案。

User.get(label)

如果默认情况下不存在,则将标签添加为用户。为了防止这种添加,我们必须使用

User.get(label, false)
4

1 回答 1

1

您正在将用户名添加到从站的标签中。打印 User.getAll() 只打印您的 Jenkins 的用户列表,而不是您使用用户名修改的从站标签。

这是一个脚本,您可以使用它来测试您的从机是否添加了新标签:

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

此外,您可能希望更改脚本,以便它仅在从属设备尚未包含用户的情况下为其设置新标签,因为每次以现在编写的方式运行脚本时,您将多次添加它。

于 2015-03-10T20:10:54.520 回答