Jenkins Pipeline:共享库无法访问实例类

问题描述 投票:0回答:1

我正在实施更加复杂的规则来处理内置节点处理的节点……嗯,无法处理。 我需要在动态生成将并行化的阶段的函数中使用它。 我无法将此代码放入管道块中。

我想创建一个处理节点对象的共享库。 我已正确安装并配置了共享库插件。 它正在查找并检查我的库,我可以看到该库的更改正在传播。

该库将操作的基础数据是在运行时确定的“所有节点”。 它可以过滤标签 它可以查看节点的繁忙程度 它可以查看在线与离线情况,如果离线,则将其恢复。 (这是关键要求) 我正在努力询问更详细的问题,例如磁盘空间和/或操作系统版本

我尝试将当前上下文从函数上下文传递到库中,但这会出现为 WorkFlowScript 类

def generateBuildStage(job) {
    def myNode = myNodes.freeNode(this, "${BUILDLABEL}")
    return {
        node myNode.nodeName
        stage ('Update Workspace') {
        ...

我需要 jenkins.instance 类,这样我就可以生成所有节点的列表并对其进行迭代。 我尝试在库中导入 jenkins.model.* 和 hudson.model.* ,但这不起作用。我收到方法未定义错误。 (我认为是因为这些对象没有在该上下文中定义?)

如果我尝试在管道脚本中正确处理 jenkins.instance 以尝试生成列表以传递给库,则管道本身就会停止工作。 我不知道为什么。 没有错误。

我已经在这个原始管道脚本(在“管道”定义之外)中测试了这段代码并且它可以工作,但是在共享库上下文中它不起作用,如果该代码是内联的,管道脚本也不会工作。 省略了一些函数和实际的管道代码。

我确信这与范围有关,但我不知道如何......

import hudson.model.*
import hudson.AbortException

Jenkins jenkins = Jenkins.instance
def targetNode = null
def candidates = []

for (Node node in jenkins.nodes) {
    for (label in node.getAssignedLabels()) {
        println("Testing label ${label}")
        if (buildGroup.equals(label.toString().trim())) {
            println("Found a match ${label}")
            candidates.add(node)
        }
    }
}

if (candidates.size < 1) {
    throw new AbortException("TestChrisK aborted: No such build label ${buildGroup}.")
}
for (node in candidates) {    
    if ( node.getComputer().isOnline() && (node.getComputer().countBusy() < 1)  ) {
        targetNode = node
    }
}
// If we did not find a completely free node, look for one doing only 1 thing
if (! targetNode) {
    for (node in candidates) {
        if ( node.getComputer().isOnline() && (node.getComputer().countBusy() < 2)  ) {
            targetNode = node
        }
    }
}
// Otherwise quit
if (! targetNode) {
     throw new AbortException("TestChrisK aborted: No available nodes in ${buildGroup}.")
}
else {
    println("target node = " + targetNode.nodeName )
}
jenkins jenkins-pipeline jenkins-groovy
1个回答
0
投票

与范围无关,Jenkins 类有一个静态方法返回其实例,单例模式

def nodes = Jenkins.get().nodes
© www.soinside.com 2019 - 2024. All rights reserved.