You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins动态并行Stage创建报错:找不到DSL方法‘steps’

Jenkins并行Stage报错解决:No such DSL method 'steps' found

问题场景

我有4个用于触发webhook的curl命令,它们仅单个参数不同。因此我希望提取该curl命令,创建可遍历各唯一参数并调用curl命令的并行Stage。我编写了如下代码:

stage('Push Artifactory Images to ECR') {
    steps {
        script {
            def images = [
                ['stageName': 'Push Metadata Service Image', 'image': env.METADATA_SERVICE_IMAGE],
                ['stageName': 'Push UI Image', 'image': env.UI_IMAGE],
                ['stageName': 'Push AWS Batch Default Image', 'image': env.BATCH_IMAGE],
                ['stageName': 'Push Studio Sample Image', 'image': env.NOTEBOOK_IMAGE]
            ]

            def parallelStages = [:]

            images.each { image ->
                parallelStages[image.stageName] = {
                    stage(image.stageName) {
                        steps {
                            script {
                                sh """
                                curl ${env.ECR_PUSH_URL} -X POST -H 'Content-Type: application/json' \\
                                -d '{"parameters":{"aws_account_id": "${env.AWS_ACCOUNT_ID}", "business_service": "${env.BUSINESS_SERVICE}", "moniker": "${env.MONIKER}", "region": "${env.REGION}", "role_arn": "arn:aws:iam::${env.AWS_ACCOUNT_ID}:role/Deployer", "sourceRepository": "${image.image}"}}'
                                """
                            }
                        }
                    }
                }
            }
        }
    }
}

运行后出现如下错误:

java.lang.NoSuchMethodError: No such DSL method 'steps' found among steps

解决方案

错误根源是在Groovy闭包定义并行Stage时,内部嵌套的stage块不需要再使用steps和内层script——因为闭包本身已经处于脚本上下文,直接执行命令即可。同时需要补充parallel(parallelStages)来触发并行执行,确保代码块正确闭合。

修正后的完整代码:

stage('Push Artifactory Images to ECR') {
    steps {
        script {
            def images = [
                ['stageName': 'Push Metadata Service Image', 'image': env.METADATA_SERVICE_IMAGE],
                ['stageName': 'Push UI Image', 'image': env.UI_IMAGE],
                ['stageName': 'Push AWS Batch Default Image', 'image': env.BATCH_IMAGE],
                ['stageName': 'Push Studio Sample Image', 'image': env.NOTEBOOK_IMAGE]
            ]

            def parallelStages = [:]

            images.each { image ->
                parallelStages[image.stageName] = {
                    stage(image.stageName) {
                        sh """
                        curl ${env.ECR_PUSH_URL} -X POST -H 'Content-Type: application/json' \\
                        -d '{"parameters":{"aws_account_id": "${env.AWS_ACCOUNT_ID}", "business_service": "${env.BUSINESS_SERVICE}", "moniker": "${env.MONIKER}", "region": "${env.REGION}", "role_arn": "arn:aws:iam::${env.AWS_ACCOUNT_ID}:role/Deployer", "sourceRepository": "${image.image}"}}'
                        """
                    }
                }
            }

            // 启动并行执行
            parallel(parallelStages)
        }
    }
}

关键修正点

  • 移除嵌套stage内的steps和内层script块,直接在stage闭包中执行sh命令
  • 添加parallel(parallelStages)语句,触发所有定义好的并行Stage执行
  • 确保所有代码块(script、stage)都正确闭合

内容的提问来源于stack exchange,提问作者Riley Hun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 17:23:10