简体   繁体   中英

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. So I've taken the original script from the below link.

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. So I've installed Groovy plugin and updated the groovy version in the Global Tools config and ran the script.

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 库中解决了问题。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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