Groovy:此处不需要方法定义
我相信这是一个简单的解决方案,但我对一般编程,尤其是Groovy编程还是新手 我试图在Jenkins 2管道作业中启用松弛通知,但粘贴和自定义最终代码块会导致以下错误Groovy:此处不需要方法定义,groovy,jenkins-pipeline,slack,Groovy,Jenkins Pipeline,Slack,我相信这是一个简单的解决方案,但我对一般编程,尤其是Groovy编程还是新手 我试图在Jenkins 2管道作业中启用松弛通知,但粘贴和自定义最终代码块会导致以下错误 Method definition not expected here. Please define the method at an appropriate place or perhaps try using a block/Closure instead. 这是我现在的代码,虽然我已经用一些位替换了安全性。错误发生在def
Method definition not expected here. Please define the method at an appropriate place or perhaps try using a block/Closure instead.
这是我现在的代码,虽然我已经用一些位替换了安全性。错误发生在def notifyBuild(字符串buildStatus='STARTED'){
行
node('on-demand-t2large'){
stage ('Checkout') {
checkout( checkout stuff here )
}
stage ('Build') {
try {
notifyBuild('STARTED')
dir("place") {
sh 'script name'
}
}
catch (e) {
// If there was an exception thrown, the build failed
currentBuild.result = "FAILED"
throw e
}
finally {
// Success or failure, always send notifications
notifyBuild(currentBuild.result)
}
def notifyBuild(String buildStatus = 'STARTED') {
// build status of null means successful
buildStatus = buildStatus ?: 'SUCCESSFUL'
// Default values
def colorName = 'RED'
def colorCode = '#FF0000'
def subject = "${buildStatus}: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]'"
def summary = "${subject} (${env.BUILD_URL})"
def details = """<p>STARTED: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]':</p>
<p>Check console output at "<a href='${env.BUILD_URL}'>${env.JOB_NAME} [${env.BUILD_NUMBER}]</a>"</p>"""
// Override default values based on build status
if (buildStatus == 'STARTED') {
color = 'YELLOW'
colorCode = '#FFFF00'
} else if (buildStatus == 'SUCCESSFUL') {
color = 'GREEN'
colorCode = '#00FF00'
} else {
color = 'RED'
colorCode = '#FF0000'
}
// Send notifications
slackSend (channel: '@me', color: colorCode, message: summary)
}
}
}
node('on-demand-t2large'){
阶段(“签出”){
结帐(在这里结帐)
}
阶段(‘构建’){
试一试{
notifyBuild('已启动')
目录(“地点”){
sh“脚本名称”
}
}
捕获(e){
//如果引发异常,则生成失败
currentBuild.result=“失败”
掷e
}
最后{
//成功或失败,始终发送通知
notifyBuild(currentBuild.result)
}
def notifyBuild(字符串buildStatus='STARTED'){
//生成状态为null表示成功
buildStatus=buildStatus?:“成功”
//默认值
def colorName='RED'
def颜色代码='#FF0000'
def subject=“${buildStatus}:Job'${env.Job_NAME}[${env.BUILD_NUMBER}]”
def summary=“${subject}(${env.BUILD\u URL})”
def details=“”已启动:作业“${env.Job_NAME}[${env.BUILD_NUMBER}]”:
检查控制台输出是否在“p>”
//基于生成状态覆盖默认值
如果(buildStatus==“已启动”){
颜色=‘黄色’
颜色代码='#FFFF00'
}else if(buildStatus=='SUCCESSFUL'){
颜色=‘绿色’
颜色代码='#00FF00'
}否则{
颜色=‘红色’
颜色代码='#FF0000'
}
//发送通知
slackSend(频道:'@me',颜色:颜色代码,消息:摘要)
}
}
}
我从谷歌上了解到groovy不接受内部类定义,但作为一名编程新手,我不知道如何修复它。如果有任何帮助(包括我可以学习的解释!),我将不胜感激。将notifyBuild()
方法移到节点和stage
层次结构之外,如下所示:
node('on-demand-t2large'){
stage ('Checkout') {
checkout( checkout stuff here )
}
stage ('Build') {
try {
notifyBuild('STARTED')
dir("place") {
sh 'script name'
}
} catch (e) {
// If there was an exception thrown, the build failed
currentBuild.result = "FAILED"
throw e
} finally {
// Success or failure, always send notifications
notifyBuild(currentBuild.result)
}
}
}
def notifyBuild(String buildStatus = 'STARTED') {
// build status of null means successful
buildStatus = buildStatus ?: 'SUCCESSFUL'
// Default values
def colorName = 'RED'
def colorCode = '#FF0000'
def subject = "${buildStatus}: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]'"
def summary = "${subject} (${env.BUILD_URL})"
def details = """<p>STARTED: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]':</p>
<p>Check console output at "<a href='${env.BUILD_URL}'>${env.JOB_NAME} [${env.BUILD_NUMBER}]</a>"</p>"""
// Override default values based on build status
if (buildStatus == 'STARTED') {
color = 'YELLOW'
colorCode = '#FFFF00'
} else if (buildStatus == 'SUCCESSFUL') {
color = 'GREEN'
colorCode = '#00FF00'
} else {
color = 'RED'
colorCode = '#FF0000'
}
// Send notifications
slackSend (channel: '@me', color: colorCode, message: summary)
}
node('on-demand-t2large'){
阶段(“签出”){
结帐(在这里结帐)
}
阶段(‘构建’){
试一试{
notifyBuild('已启动')
目录(“地点”){
sh“脚本名称”
}
}捕获(e){
//如果引发异常,则生成失败
currentBuild.result=“失败”
掷e
}最后{
//成功或失败,始终发送通知
notifyBuild(currentBuild.result)
}
}
}
def notifyBuild(字符串buildStatus='STARTED'){
//生成状态为null表示成功
buildStatus=buildStatus?:“成功”
//默认值
def colorName='RED'
def颜色代码='#FF0000'
def subject=“${buildStatus}:Job'${env.Job_NAME}[${env.BUILD_NUMBER}]”
def summary=“${subject}(${env.BUILD\u URL})”
def details=“”已启动:作业“${env.Job_NAME}[${env.BUILD_NUMBER}]”:
检查控制台输出是否在“p>”
//基于生成状态覆盖默认值
如果(buildStatus==“已启动”){
颜色=‘黄色’
颜色代码='#FFFF00'
}else if(buildStatus=='SUCCESSFUL'){
颜色=‘绿色’
颜色代码='#00FF00'
}否则{
颜色=‘红色’
颜色代码='#FF0000'
}
//发送通知
slackSend(频道:'@me',颜色:颜色代码,消息:摘要)
}
解释:大多数Groovy DSL不允许在DSL元素中声明。Jenkins DSL似乎也不例外。您可以使用闭包
node('on-demand-t2large'){
def notifyBuild={String buildStatus->
//生成状态为null表示成功
buildStatus=buildStatus?:“成功”
//默认值
def colorName='RED'
def颜色代码='#FF0000'
def subject=“${buildStatus}:Job'${env.Job_NAME}[${env.BUILD_NUMBER}]”
def summary=“${subject}(${env.BUILD\u URL})”
def details=“”已启动:作业“${env.Job_NAME}[${env.BUILD_NUMBER}]”:
检查控制台输出是否在“p>”
//基于生成状态覆盖默认值
如果(buildStatus==“已启动”){
颜色=‘黄色’
颜色代码='#FFFF00'
}else if(buildStatus=='SUCCESSFUL'){
颜色=‘绿色’
颜色代码='#00FF00'
}否则{
颜色=‘红色’
颜色代码='#FF0000'
}
//发送通知
slackSend(频道:'@me',颜色:颜色代码,消息:摘要)
}
阶段(“签出”){
结帐(在这里结帐)
}
阶段(‘构建’){
试一试{
notifyBuild('已启动')
目录(“地点”){
sh“脚本名称”
}
}捕获(e){
//如果引发异常,则生成失败
currentBuild.result=“失败”
掷e
}最后{
//成功或失败,始终发送通知
notifyBuild(currentBuild.result)
}
}
}
我建议将notifyBuild()
方法定义移到节点和stage
层次结构之外。也就是说,取底部}
的最后两个大括号,并将它们上移到def notifyBuild>上方的一行(…
。将第三个底部大括号留在原处。@BalRog做到了!非常感谢!
node('on-demand-t2large') {
def notifyBuild = { String buildStatus ->
// build status of null means successful
buildStatus = buildStatus ?: 'SUCCESSFUL'
// Default values
def colorName = 'RED'
def colorCode = '#FF0000'
def subject = "${buildStatus}: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]'"
def summary = "${subject} (${env.BUILD_URL})"
def details = """<p>STARTED: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]':</p>
<p>Check console output at "<a href='${env.BUILD_URL}'>${env.JOB_NAME} [${env.BUILD_NUMBER}]</a>"</p>"""
// Override default values based on build status
if (buildStatus == 'STARTED') {
color = 'YELLOW'
colorCode = '#FFFF00'
} else if (buildStatus == 'SUCCESSFUL') {
color = 'GREEN'
colorCode = '#00FF00'
} else {
color = 'RED'
colorCode = '#FF0000'
}
// Send notifications
slackSend (channel: '@me', color: colorCode, message: summary)
}
stage ('Checkout') {
checkout( checkout stuff here )
}
stage ('Build') {
try {
notifyBuild('STARTED')
dir("place") {
sh 'script name'
}
} catch (e) {
// If there was an exception thrown, the build failed
currentBuild.result = "FAILED"
throw e
} finally {
// Success or failure, always send notifications
notifyBuild(currentBuild.result)
}
}
}