运行具有多个值的功能

时间:2018-12-04 08:51:29

标签: jenkins groovy

我的工作方式如下

def runTestsInDocker(arg) {
    measureDuration(script: this, measurementName: 'build') {
        executeDocker(dockerImage: dockerImage,  dockerWorkspace: '/go/src') {
            sh """
            mkdir -p /go/src/github.com/ftr/myGoPro
            go ${arg}                        
            """
        }
    }

当我只有1个参数时,此参数可以正常工作 现在,我想添加新参数,以便可以执行以下操作

def runTestsInDocker(arg,arg2,arg3) {
    measureDuration(script: this, measurementName: 'build') {
        executeDocker(dockerImage: dockerImage,  dockerWorkspace: '/go/src') {
            sh """
            mkdir -p /go/src/github.com/ftr/myGoPro

            go ${arg}  
           go ${arg1}
           go ${arg2}
            """
        }
    }

但是这里有两个问题

1。如果我只需要传递一个参数会怎样?

  1. 如果要传递10个参数,我将有10个参数?

在Groovy中是否有更好的方法来处理它?

更新,假设我需要使用1个参数调用该函数

   def runTestsInDocker(Map<String,String> params) {
        measureDuration(script: this, measurementName: 'build') {
            executeDocker(dockerImage: dockerImage,  dockerWorkspace: '/go/src') {
                sh """
                mkdir -p /go/src/github.com/ftr/myGoPro

                go ${params.get('arg')}  

                """
            }
        }

其他功能

   def runTestsInDocker(Map<String,String> params) {
        measureDuration(script: this, measurementName: 'build') {
            executeDocker(dockerImage: dockerImage,  dockerWorkspace: '/go/src') {
                sh """
                mkdir -p /go/src/github.com/ftr/myGoPro

                go ${params.get('arg')}  
                go ${params.get('arg1')} 
                """
            }
        }

我事先不知道需要使用多少参数,那么如何动态地进行设置呢?

2 个答案:

答案 0 :(得分:2)

您可以将Map发送到方法来调用multiple parameters

def runTestsInDocker( Map<String,String> params) {

并使用地图调用它:

def params = [ arg:'value', arg1:'value1' ];
runTestsInDocker(params);

内部方法通过以下方式动态遍历地图:

params.each{ k, v -> go ${v} }

答案 1 :(得分:1)

看看您的目标示例,这似乎是varargs的完美案例。

def runTestsInDocker(String... args) {
    measureDuration(script: this, measurementName: 'build') {
        executeDocker(dockerImage: dockerImage, dockerWorkspace: '/go/src') {
            sh """
            mkdir -p /go/src/github.com/ftr/myGoPro
            go ${args.join('\ngo ')}
            """
        }
    }
}

如果您真的只想在特定位置传递参数,则此方法签名也允许这样做。

runTestsInDocker(null,'foo',null,'bar')
// OR
def args = []
args[2] = 'foo'
args[5] = 'bar'
runTestsInDocker(args as String[])

如果由于某种原因,您确实想要具有不同名称和语义的参数,那么我将研究以下内容:

  • 默认值,例如runTestsInDocker(String arg = null, String arg1 = null, String arg2 = null)
  • 地图参数,例如runTestsInDocker(Map map)
  • POGO参数,例如runTestsInDocker(MyPogo args)。与map相比,这提供了类型检查,并且仅用您需要的值来构造POGO非常容易。