Groovy:此处不需要方法定义

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

我相信这是一个简单的解决方案,但我对一般编程,尤其是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 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 &QUOT;<a href='${env.BUILD_URL}'>${env.JOB_NAME} [${env.BUILD_NUMBER}]</a>&QUOT;</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 &QUOT;<a href='${env.BUILD_URL}'>${env.JOB_NAME} [${env.BUILD_NUMBER}]</a>&QUOT;</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 &QUOT;<a href='${env.BUILD_URL}'>${env.JOB_NAME} [${env.BUILD_NUMBER}]</a>&QUOT;</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)
        }
    }
}