Groovy 循环中包含电子邮件的Jenkins文件在第一次迭代中失败
詹金斯使用的最新版本 编辑:完整Java异常的pastebin- 目标:循环所有节点,检查是否脱机,为每个脱机节点发送电子邮件警报。 (也尝试了emailext警报,无法使用“脱机”) 失败:我的Jenkins文件运行正常,没有电子邮件。 如果电子邮件在for循环中或在函数中单独定义,则在发送第一封电子邮件后,作业会崩溃Groovy 循环中包含电子邮件的Jenkins文件在第一次迭代中失败,groovy,jenkins-pipeline,jenkins-plugins,Groovy,Jenkins Pipeline,Jenkins Plugins,詹金斯使用的最新版本 编辑:完整Java异常的pastebin- 目标:循环所有节点,检查是否脱机,为每个脱机节点发送电子邮件警报。 (也尝试了emailext警报,无法使用“脱机”) 失败:我的Jenkins文件运行正常,没有电子邮件。 如果电子邮件在for循环中或在函数中单独定义,则在发送第一封电子邮件后,作业会崩溃 [Pipeline] End of Pipeline an exception which occurred: in field hudson.model.Slave.
[Pipeline] End of Pipeline an exception which occurred: in field hudson.model.Slave.launcher in object hudson.slaves.DumbSlave@ae938e61 .... and many more
我的文件:
pipeline {
agent{
label 'master'
}
options {
// Enable timestamps in log
timestamps()
skipDefaultCheckout()
timeout(time: 4, unit: 'MINUTES')
}
stages {
stage('Monitor') {
steps{
script{
def offlineSlaves = []
for (aSlave in hudson.model.Hudson.instance.slaves) {
def thisSlave = aSlave.name
echo 'Name: ' + thisSlave + ' is being checked.'
if ( aSlave.getComputer().isOffline().toString() == 'true') {
slaveState = 'OFFLINE'
echo 'Name: ' + thisSlave + ' is ' + slaveState + ' !'
emailext (
mimeType: 'text/html',
body: "${env.JOB_NAME} found an OFFLINE node: ${name} ",
subject: "Jenkins ERROR: Build Node ${name} is OFFLINE " ,
to: 'jfisher@xxx')
}
}
}
}
}
}
post {
failure {
emailext (
body: 'Monitor Nodes Jenkins Job failed !',
presendScript: '$DEFAULT_PRESEND_SCRIPT',
recipientProviders: [requestor(),culprits()],
subject: 'Monitor Nodes Jenkins Failed',
to: 'jfisher@intouchhealth.com')
}
}
}
此代码的问题在于
getComputer()
部分。在管道中,您应该只使用Serializable,而从getComputer()
返回的SlaveComputer
不是
您应该做的是将这个部分移动到一个用NonCPS注释的函数中
@NonCPS
def shallTrigger() {
for (aSlave in hudson.model.Hudson.instance.slaves) {
def thisSlave = aSlave.name
echo 'Name: ' + thisSlave + ' is being checked.'
if ( aSlave.getComputer().isOffline().toString() == 'true') {
slaveState = 'OFFLINE'
echo 'Name: ' + thisSlave + ' is ' + slaveState + ' !'
emailext (
mimeType: 'text/html',
body: "${env.JOB_NAME} found an OFFLINE node: ${name} ",
subject: "Jenkins ERROR: Build Node ${name} is OFFLINE " ,
to: 'jfisher@xxx')
}
}
}
嗨,John,你能为抛出的异常附加整个堆栈跟踪吗?在上面添加了pastebin,thanksThanks,我转到函数,按照指示放置在管道括号外。当我运行作业时,会出现错误,这些错误看起来可能与需要批准进程内脚本批准有关,但在Manage Jenkins->in-process etc下没有提供任何错误,但是,当我注释掉emailext部分时,循环工作正常(就像以前一样)…这解决了问题,再加上认识到emailext只运行一次,然后不管发生什么都结束作业。所以我保存了一个离线节点列表,并在一封电子邮件中发送出去。