【问题标题】:Groovy script for modifying Jenkins nodes labels用于修改 Jenkins 节点标签的 Groovy 脚本
【发布时间】:2020-06-02 08:54:24
【问题描述】:

全部!! 假设我有几个从节点(Slave1、Slave2 和 Slave3)的 Jenkins。 每个从站都有一些与之关联的标签,即 Slave1 (test build python)、Slave2 (develop update clean)...

我正在寻找可以从 Jenkins 脚本控制台运行的 groovy 脚本,通过为每个从站上的每个标签添加/删除“-offline”后缀来一次修改给定从站上的标签,即 Slave1 将具有 (test-offline build-offline python-offline) & Slave2 (develop-offline update-offline clean-offline)。

我需要这个功能来防止下一个作业开始在这些从属节点上运行(假设我想将它们设置为脱机以进行维护,一旦这些节点上的所有作业完成)。一旦我完成了对这些 slave 的维护,我需要运行另一个 groovy 脚本来设置之前配置的所有标签,即 Slave1(测试构建 python)、Slave2(开发更新清理)。

到目前为止,我已经找到了关于类似问题的旧 topic。下面的代码可以返回所选从站的所有标签,但它添加“离线”作为附加标签,而不是作为每个现有标签的后缀:

hudson = hudson.model.Hudson.instance
hudson.slaves.findAll { it.nodeName.equals("slave1") }.each { slave -> 
  print "Slave  $slave.nodeName : Labels: $slave.labelString"
  slave.labelString = slave.labelString + " " + "offline"
  println "   --> New labels: $slave.labelString"
}
hudson.save()

所以我有几个问题:

  1. 如何使用节点列表(slave1、slave2、slave3...)而不是单节点slave1
  2. 如何在标签中添加/删除“-offline”后缀?它可以是两个不同的脚本,用于添加和删除标签后缀。

非常感谢任何帮助和建议。

应届毕业生, 伊戈尔。

【问题讨论】:

    标签: jenkins groovy jenkins-slave


    【解决方案1】:

    我认为脚本中存在一些问题。

    hudson = hudson.model.Hudson.instance 
    hudson.slaves.findAll { it.nodeName.equals("slave1") }.each { slave ->    
        print "Slave  $slave.nodeName : Labels: $slave.labelString"
        labels = aSlave.getLabelString()
        labels = labels + "-offline"
        aSlave.setLabelString(labels)
        println "   --> New labels: $slave.labelString" 
    } 
    hudson.save()
    

    这里也假设只有一个标签。那么只有这样才能工作。

    如果有多个标签

    labels = aSlave.getLabelString()
    labelList = labels.split(' ') //This is a list
    labelList[0] = labelList[0]+"-offline"
    labels = labelList.join(' ')
    

    您必须将 labelString 按空格分割,然后对其进行处理。

    要获取所有从站,您可以按如下方式创建循环

    for (aSlave in hudson.model.Hudson.instance.slaves) {
        if(aSlave.name == "")//here you can pass a list or a single node for which changes needs to be done
        println "${aSlave.name}"
    }
    

    我会为多个节点做这样的事情

    hudson = hudson.model.Hudson.instance 
    for (aSlave in hudson.slaves) {
       labels = aSlave.getLabelString()
       labelList = labels.split(' ') //This is a list
       i = 0
       for (individualLabel in labelList) {
           if(individualLabel == "python") {
                labelList[i] = labelList[i]+"-offline"
           }
           i++
       }
       labels = labelList.join(' ')
       aSlave.setLabelString(labels)
     }
     hudson.save()
    

    如果必须为特定从站完成此操作,您还可以在从站名称上添加条件。

    让我知道这是否有效

    【讨论】:

    • 谢谢你的回答!!但是只使用一个标签也不起作用......它仍然添加额外的标签“-offline”而不是将“-offline”作为后缀附加到现有标签(test-offline“)。你能举个例子我如何“分裂labelString 按空格然后对它们进行处理”?另外,我不需要对所有从站进行处理,我的目标是仅提供我需要的这些从站
    • 我已经更新了答案。我已经试过了。看看这是否有帮助
    • 现在您的第一个脚本返回以下错误:“没有这样的属性:aSlave for class:Script1”。我已经通过添加这一行来纠正它: for (aSlave in hudson.model.Hudson.instance.slaves)" 现在它适用于单个标签!谢谢!现在我将尝试使其适用于多个标签。
    • 某处一定有循环。你能把你的代码贴在这里吗?
    • 我已经在我原来的问题帖子中加入了工作和不工作的代码,请看一下
    【解决方案2】:

    到目前为止,感谢@pratikvasa,对于具有单个标签的单节点工作代码是:

    hudson = hudson.model.Hudson.instance
    hudson.slaves.findAll { it.nodeName.equals("slave1") }.each { slave -> 
      println "   --> Slave  $slave.nodeName : Labels: $slave.labelString"
      slave.labelString = slave.labelString + "-offline"
      println "   --> New labels: $slave.labelString"
    }
    hudson.save()
    

    对于单个节点和多个标签的工作代码是:

    hudson = hudson.model.Hudson.instance
    hudson.slaves.findAll { it.nodeName.equals("slave1") }.each { slave -> 
      println "   --> Slave  $slave.nodeName : Current Labels: $slave.labelString"
      labels = slave.labelString
    
    def list = ["$labels"]
      labelList = labels.split(' ')
      i = 0
      for (item in labelList) {
      print "   --> $i Label In The List: "
      println item
      labelList[i] = labelList[i] + "-offline"
      i++
      }
    
      labels = labelList.join(' ')
    
      slave.labelString = labels
    
      print "   --> New Labels Are: $slave.labelString"
    }
    

    使用+ "-offline" 将为每个标签附加后缀,使用- "-offline" 将删除每个标签的后缀。

    【讨论】:

    • 我不知道如何回答问题 #1:如何使用节点列表(slave1、slave2、slave3...)而不是单节点 slave1?
    • 你能详细解释一下吗?在您的代码中 **it.nodeName.equals("slave1") ** 这将只选择一个节点。删除它以获取所有奴隶的列表
    • 这是一个重点,我不需要所有的奴隶......我想提供我需要处理的奴隶列表
    • ya..这很简单..您可以将节点的名称存储在要执行活动的列表中。然后在上面的代码中添加一个条件 yourList.contains(it.nodeName) 然后执行活动
    【解决方案3】:

    这对我来说很简单,您必须第一次提供脚本批准

    Jenkins.instance.getNode("${env.NODE_NAME}").setLabelString("mylabel") Jenkins.instance.save()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-23
      • 2016-11-02
      • 2018-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多