简体   繁体   English

Groovy 脚本因系统 groovy 而失败

[英]Groovy script failing with system groovy

I'm trying to setup a jenkins job to monitor Jenkins Slaves and it needs to send an email notification with the cause whenever the slaves goes offline.我正在尝试设置一个 jenkins 作业来监视 Jenkins Slaves,并且它需要在奴隶离线时发送带有原因的电子邮件通知。 So I've taken the original script from the below link.所以我从下面的链接中获取了原始脚本。

https://www.jenkins.io/doc/book/managing/nodes/ https://www.jenkins.io/doc/book/managing/nodes/

But when I tried to run the script in "Script Console" and the error says that it needs to run on system groovy rather than running in Groovy DSL.但是当我尝试在“脚本控制台”中运行脚本时,错误表明它需要在系统 groovy 上运行,而不是在 Groovy DSL 中运行。 So I've installed Groovy plugin and updated the groovy version in the Global Tools config and ran the script.所以我安装了 Groovy 插件并更新了全局工具配置中的 groovy 版本并运行了脚本。

import hudson.node_monitors.*
import hudson.slaves.*
import java.util.concurrent.*

jenkins = Jenkins.instance

import hudson.model.*;
import hudson.util.*;
import jenkins.model.*;
import hudson.filepath.*
import hudson.slaves.*
import javax.mail.*
import javax.mail.internet.*;
import javax.activation.*

def sendMail (agent, cause) {

 message = agent + " agent is down. Check https://jenkins.abc.com:8443/computer/" + agent + "\nBecause " + cause
 subject = agent + " agent is offline"
 toAddress = "abc@abc.com"
 fromAddress = "jenkins@abc.com"
 host = "smtp.abc.com"
 port = "25"

 Properties mprops = new Properties();
 mprops.setProperty("mail.transport.protocol","smtp");
 mprops.setProperty("mail.host",host);
 mprops.setProperty("mail.smtp.port",port);

 Session lSession = Session.getDefaultInstance(mprops,null);
 MimeMessage msg = new MimeMessage(lSession);


 //tokenize out the recipients in case they came in as a list
 StringTokenizer tok = new StringTokenizer(toAddress,";");
 ArrayList emailTos = new ArrayList();
 while(tok.hasMoreElements()) {
   emailTos.add(new InternetAddress(tok.nextElement().toString()));
 }
 InternetAddress[] to = new InternetAddress[emailTos.size()];
 to = (InternetAddress[]) emailTos.toArray(to);
 msg.setRecipients(MimeMessage.RecipientType.TO,to);
 InternetAddress fromAddr = new InternetAddress(fromAddress);
 msg.setFrom(fromAddr);
 msg.setFrom(new InternetAddress(fromAddress));
 msg.setSubject(subject);
 msg.setText(message)

 Transport transporter = lSession.getTransport("smtp");
 transporter.connect();
 transporter.send(msg);
}


def getEnviron(computer) {
   def env
   def thread = Thread.start("Getting env from ${computer.name}", { env = computer.environment })
   thread.join(2000)
   if (thread.isAlive()) thread.interrupt()
   env
}

def agentAccessible(computer) {
    getEnviron(computer)?.get('PATH') != null
}

def numberOfflineNodes = 0
def numberNodes = 0
for (agent in jenkins.getNodes()) {
   def computer = agent.computer
   numberNodes ++
   println ""
   println "Checking computer ${computer.name}:"
   def isOK = (agentAccessible(computer) && !computer.offline)
   if (isOK) {
     println "\t\tOK, got PATH back from slave ${computer.name}."
    // println('\tcomputer.isOffline: ' + slave.getComputer().isOffline());
     println('\tcomputer.isTemporarilyOffline: ' + slave.getComputer().isTemporarilyOffline());
     println('\tcomputer.getOfflineCause: ' + slave.getComputer().getOfflineCause());
     println('\tcomputer.offline: ' + computer.offline);
   } else {
     numberOfflineNodes ++
     println "  ERROR: can't get PATH from agent ${computer.name}."
    // println('\tcomputer.isOffline: ' + agent.getComputer().isOffline());
     println('\tcomputer.isTemporarilyOffline: ' + agent.getComputer().isTemporarilyOffline());
     println('\tcomputer.getOfflineCause: ' + agent.getComputer().getOfflineCause());
     println('\tcomputer.offline: ' + computer.offline);
     sendMail(computer.name, agent.getComputer().getOfflineCause().toString())
     if (agent.getComputer().isTemporarilyOffline()) {
       if (!agent.getComputer().getOfflineCause().toString().contains("Disconnected by")) {
         computer.setTemporarilyOffline(false, agent.getComputer().getOfflineCause())
       }
     } else {
         computer.connect(true)
     }
   }
 }
println ("Number of Offline Nodes: " + numberOfflineNodes)
println ("Number of Nodes: " + numberNodes) 

Now the result is throwing some Class error which I couldn't figure it out.现在的结果是抛出一些我无法弄清楚的类错误。 Any help would be much appreciated.任何帮助将非常感激。

[Jenkins_Slaves_Offline_Notification] $ /u00/jenkins-agent/tools/hudson.plugins.groovy.GroovyInstallation/groovy-3-0-6/bin/groovy -cp scripts/groovy /u00/jenkins-agent/workspace/Corporate/Global-Tools/BA_Workspace_Cleanup/Jenkins_Slaves_Offline_Notification/jenkins_ba_offline_not.groovy
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
/u00/jenkins-agent/workspace/Corporate/Global-Tools/BA_Workspace_Cleanup/Jenkins_Slaves_Offline_Notification/jenkins_ba_offline_not.groovy: 31: unable to resolve class Session
@ line 31, column 10.
Session lSession = Session.getDefaultInstance(mprops,null);
^

/u00/jenkins-agent/workspace/Corporate/Global-Tools/BA_Workspace_Cleanup/Jenkins_Slaves_Offline_Notification/jenkins_ba_offline_not.groovy: 32: unable to resolve class MimeMessage
@ line 32, column 14.
MimeMessage msg = new MimeMessage(lSession);
^

/u00/jenkins-agent/workspace/Corporate/Global-Tools/BA_Workspace_Cleanup/Jenkins_Slaves_Offline_Notification/jenkins_ba_offline_not.groovy: 32: unable to resolve class MimeMessage
@ line 32, column 20.
MimeMessage msg = new MimeMessage(lSession);
^

/u00/jenkins-agent/workspace/Corporate/Global-Tools/BA_Workspace_Cleanup/Jenkins_Slaves_Offline_Notification/jenkins_ba_offline_not.groovy: 39: unable to resolve class InternetAddress
@ line 39, column 17.
emailTos.add(new InternetAddress(tok.nextElement().toString()));
^

/u00/jenkins-agent/workspace/Corporate/Global-Tools/BA_Workspace_Cleanup/Jenkins_Slaves_Offline_Notification/jenkins_ba_offline_not.groovy: 41: unable to resolve class InternetAddress[]
@ line 41, column 20.
InternetAddress[] to = new InternetAddress[emailTos.size()];
^

/u00/jenkins-agent/workspace/Corporate/Global-Tools/BA_Workspace_Cleanup/Jenkins_Slaves_Offline_Notification/jenkins_ba_offline_not.groovy: 41: unable to resolve class InternetAddress[]
@ line 41, column 25.
InternetAddress[] to = new InternetAddress[emailTos.size()];
^

/u00/jenkins-agent/workspace/Corporate/Global-Tools/BA_Workspace_Cleanup/Jenkins_Slaves_Offline_Notification/jenkins_ba_offline_not.groovy: 42: unable to resolve class InternetAddress[]
@ line 42, column 7.
to = (InternetAddress[]) emailTos.toArray(to);
^

/u00/jenkins-agent/workspace/Corporate/Global-Tools/BA_Workspace_Cleanup/Jenkins_Slaves_Offline_Notification/jenkins_ba_offline_not.groovy: 44: unable to resolve class InternetAddress
@ line 44, column 18.
InternetAddress fromAddr = new InternetAddress(fromAddress);
^

/u00/jenkins-agent/workspace/Corporate/Global-Tools/BA_Workspace_Cleanup/Jenkins_Slaves_Offline_Notification/jenkins_ba_offline_not.groovy: 44: unable to resolve class InternetAddress
@ line 44, column 29.
InternetAddress fromAddr = new InternetAddress(fromAddress);
^

/u00/jenkins-agent/workspace/Corporate/Global-Tools/BA_Workspace_Cleanup/Jenkins_Slaves_Offline_Notification/jenkins_ba_offline_not.groovy: 46: unable to resolve class InternetAddress
@ line 46, column 14.
msg.setFrom(new InternetAddress(fromAddress));
^

/u00/jenkins-agent/workspace/Corporate/Global-Tools/BA_Workspace_Cleanup/Jenkins_Slaves_Offline_Notification/jenkins_ba_offline_not.groovy: 50: unable to resolve class Transport
@ line 50, column 12.
Transport transporter = lSession.getTransport("smtp");
^

11 errors

Build step 'Execute Groovy script' marked build as failure
Collecting metadata...
Metadata collection done.
Finished: FAILURE

通过将 javax.mail jar 文件放在 groovy 库中解决了问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM