创建自定义groovy闭包以重用shell()功能

时间:2017-10-26 18:14:47

标签: jenkins groovy closures jenkins-job-dsl

我在Jenkins服务器中使用Groogy DSL插件。我意识到这个步骤在许多地方和工作中都会重复。

steps {
    shell('''#!/bin/bash -ex
        |aws s3 cp s3://${STACK_S3_BUCKET_NAME}/file myfile --region ${AWS_REGION}
        |aws s3 cp s3://${STACK_S3_BUCKET_NAME}/otherfile .
        |
        |'''.stripMargin())

我是使用Groovy的新手,我想创建一种自定义的Groovy Step或Closure来避免这个过程,我想做类似的事情:

awsS3cp {
    from: '${ORIGIN}'
    to: '${DESTINATION}'
    }

然后实现这样的事情:

def awsS3cp { context -> 
    shell('''#!/bin/bash -ex
            |aws s3 cp s3://$from $to
            |'''.stripMargin())
    }

尝试1

我是这样做的,它失败了:

def awsS3cp(String from, String to) {
      shell("""#!/bin/bash -ex
            |echo 'copy from $from to $to'
            |""".stripMargin())
}

def createEnvironmentJob = freeStyleJob( jobName )

createEnvironmentJob.with{
    description( jobDescription )
    steps {
     awsS3cp ("S3-SOURCE-BUCKET","S3-TARGET-BUCKET") 
    }
}

错误输出:

No signature of method: create_environment.shell() is applicable for argument types: (java.lang.String) values: [#!/bin/bash -ex
echo 'copy from S3-SOURCE-BUCKET to S3-TARGET-BUCKET'
]
Possible solutions: queue(java.lang.String), sleep(long), every(), grep(), job(java.lang.String), queue(javaposse.jobdsl.dsl.Job)
Finished: FAILURE

1 个答案:

答案 0 :(得分:0)

一种选择是在外面定义一个函数:

def awsS3cp(String from, String to) {
  return sh("""#!/bin/bash -ex
            |aws s3 cp s3://$from $to
            |""".stripMargin())
}

然后,在管道定义中调用它:

steps {
    awsS3cp('source', 'destination')
}