我想创建一个自定义步骤,详见此处: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'})
,它不起作用
答案 0 :(得分:4)
您也可以在没有script
包装器
这是一个效果很好的例子:
脚本
//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)
}
}
希望对您的情况有用