检查Jenkins节点是否在线执行作业,否则发送电子邮件警报

gr8qqesn  于 2023-06-21  发布在  Jenkins
关注(0)|答案(3)|浏览(218)

Jenkins作业专用于特殊节点,如果因为节点离线而无法运行作业,我希望收到通知。是否可以设置此功能?
换句话说,默认的Jenkins行为是等待节点,如果作业已经在节点离线时启动(“挂起”作业状态)。在这种情况下,我想让作业失败(或者根本不启动),并发送“node offline”邮件。
这个节点检查的东西应该在作业内部,因为作业很少执行,我不在乎当作业不需要它时,节点是否离线。我试过外部节点观看插件,但它并不完全是我想要的-它触发电子邮件每次节点离线,它是多余的,在我的情况下。

pu82cl6c

pu82cl6c1#

我找到了一个答案here。您可以添加一个命令行或PowerShell块来调用curl命令并处理结果

curl --silent $JENKINS_URL/computer/$JENKINS_NODENAME/api/json

结果json包含offline属性,值为true/false

ipakzgxi

ipakzgxi2#

我不认为检查节点是否可用可以在您想要运行的作业(例如JobX)中完成。检查的行为,特别是在执行JobX的时候,本身需要一个作业来运行--我不知道有什么插件/配置选项可以做到这一点。JobX无法检查JobX的节点是否空闲。
我使用了很多流作业(在转换到流水线逻辑的过程中),其中JobA将触发JobB,因此JobA可以运行在主节点上,检查JobBJobX在您的情况下,如果启动了就会触发。
JobA需要是一个自由式作业,并运行“执行系统groovy脚本> Groovy命令”构建步骤。下面的groovy代码是从许多工作示例中提取出来的,因此未经测试:

import hudson.model.*;
import hudson.AbortException;
import java.util.concurrent.CancellationException;

def allNodes = jenkins.model.Jenkins.instance.nodes
def triggerJob = false
for (node in allNodes) {
  if ( node.getComputer().isOnline() && node.nodeName == "special_node" ) {
    println node.nodeName + " " + node.getComputer().countBusy() + " " + node.getComputer().getOneOffExecutors().size
    triggerJob = true
    break
  }
}

if (triggerJob) {
    println("triggering child build as node available")
    def job = Hudson.instance.getJob('JobB')
    def anotherBuild
    try {
        def params = [
          new StringParameterValue('ParamOne', '123'),
        ]
        def future = job.scheduleBuild2(0, new Cause.UpstreamCause(build), new ParametersAction(params))
        anotherBuild = future.get()
    } catch (CancellationException x) {
        throw new AbortException("${job.fullDisplayName} aborted.")
    }

} else {    
    println("failing parent build as node not available")
    build.getExecutor().interrupt(hudson.model.Result.FAILURE)
    throw new InterruptedException()
}

要让节点离线电子邮件,您可以触发一个构建后操作,以便在失败时发送电子邮件。

pkbketx9

pkbketx93#

尝试使用插件Pipeline Utility Steps的工具nodesByLabel

online_nodes = nodesByLabel label: "jenkins-slave-3", offline: false
if (online_nodes) {
    echo "online"
} else {
    echo "offline"
}

结果(在线):

Started by user testteam
 Replayed #9
 [Pipeline] Start of Pipeline
 [Pipeline] nodesByLabel (hide)
 Found a total of 1 nodes with the 'jenkins-slave-3' label
 [Pipeline] echo
 online
 [Pipeline] End of Pipeline
 Finished: SUCCESS

结果(离线):

Started by user testteam
 Replayed #8
 [Pipeline] Start of Pipeline
 [Pipeline] nodesByLabel
 Could not find any nodes with 'jenkins-slave-1' label
 [Pipeline] echo
 offline
 [Pipeline] End of Pipeline
 Finished: SUCCESS

相关问题