我可以使用散列表为声明性管道的参数定义自定义步骤吗?

时间:2017-12-20 17:25:07

标签: jenkins jenkins-plugins jenkins-pipeline

我想创建一个自定义步骤,详见此处:https://jenkins.io/doc/book/pipeline/shared-libraries/#defining-custom-steps

脚本如下所示:

// vars/buildPlugin.groovy
def call(body) {
    // evaluate the body block, and collect configuration into the object
    def config = [:]
    body.resolveStrategy = Closure.DELEGATE_FIRST
    body.delegate = config
    body()
...

我可以在脚本管道中运行它:

buildPlugin {
    name = 'git'
}

这意味着在声明性管道中我必须将其包装在脚本块中:

script {
    buildPlugin {
        name = 'git'
    }
}

我有很多自定义脚本和groovy类,它使得必须将它们包装在我的管道中的脚本块中。我能否以声明管道可以使用的方式编写groovy脚本而无需脚本{}?

编辑:

从管道调用groovy脚本就像这样:

myCustomStep('sldkfjlskdf')

但我想在示例中使用哈希表:

# In myCustomStep.grooy
def call(body) {

    def config = [:]
    body.resolveStrategy = Closure.DELEGATE_FIRST
    body.delegate = config
    body()

为了现在打电话,我必须这样做:

myCustomStep{
    param1 = 'sldkfjlskdf'
    param2 = 'sdfsdfsdfdf'
}

这样做我得到Expected a step @ line....并且必须将其包裹在一个步骤

有没有办法获得好的命名参数,就像使用哈希表方法但不必包装一步?我也试过把它称为myCustomStep({param1 = 'sdfsdf'}),它不起作用

2 个答案:

答案 0 :(得分:4)

您也可以在没有script包装器

的声明性pipline中使用它

这是一个效果很好的例子:

脚本

//vars/shOut.groovy
def call(shellScript) {
  return sh(returnStdout: true, script: shellScript).trim()
}

Jenkinsfile

@Library('modelsLib') _

pipeline {
  agent { label 'master' }

  stages {
    stage('some stage') {
      steps {
        echo "hello!"
        shOut 'touch xxyyzz'
        sh 'ls -otr'
      }
    }
  }
}

输出

[Pipeline] {
[Pipeline] stage
[Pipeline] { (some stage)
[Pipeline] echo
hello!
[Pipeline] sh
[test-pipeline] Running shell script
+ touch xxyyzz
[Pipeline] sh
[test-pipeline] Running shell script
+ ls -otr
total 32
-rw-r--r-- 1 jenkins     0 Dec 20 17:59 xxyyzz
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline

答案 1 :(得分:0)

在管道外部定义闭包。

def buildOpts = {name = 'git'}

pipeline {
  ...
  steps {
    buildPlugin(buildOpts)
  }
}

希望对您的情况有用