- 如何从Groovy类构造函数调用
withCredentials()
?**
- 如何从Groovy类构造函数调用
为什么会这样:
@Library('my-sandbox-libs@dev') sandbox_lib
pipeline {
agent any
stages {
stage( "1" ) {
steps {
script {
try {
def my_obj = new org.obj.Obj()
}
catch(Exception e) {
echo "Jenkinsfile: ${e.toString()}"
throw e
}
}
}
}
}
}
// src/org/obj/Obj.groovy
package org.obj
public class Obj {
def secret_
Obj() {
withCredentials([string(credentialsId: 'test_secret_text', variable: 'val')]) {
this.secret_ = val
}
}
}
...生成此错误:
Jenkinsfile: groovy.lang.MissingMethodException: No signature of method: org.obj.Obj.string() is applicable for argument types: (java.util.LinkedHashMap) values: [[credentialsId:test_secret_text, variable:val]]
Possible solutions: toString(), toString(), print(java.io.PrintWriter), print(java.lang.Object), find(), split(groovy.lang.Closure)
?
- 更新:**根据@daggett的回答,尝试了以下操作:
一个三个三个一个
...生成错误Posting build status of FAILED to bitbucket.company.comhudson.remoting.ProxyException: groovy.lang.MissingMethodException: No signature of method: org.obj.Obj.string() is applicable for argument types: (java.util.LinkedHashMap) values: [[credentialsId:test_secret_text, variable:val]] Possible solutions: toString(), toString(), print(java.io.PrintWriter), print(java.lang.Object), find(), split(groovy.lang.Closure)
然而,下面的例子--只是一个实验--运行良好:
// src/org/obj/Obj.groovy
package org.obj
public class Obj {
def secret_
Obj(pipeline) {
pipeline.echo "hello world"
}
}
注意:我还尝试了public class Obj implements Serializable {...}
,但没有改变注意到的错误。
我仍然很难构建Jenkins/Groovy语言的心理模型,但对我来说,这似乎是因为withCredentials()
有一些"特殊"的地方,阻止了从类构造函数调用它。
如果这是相关的,我有Jenkins版本2.190.3,它有Groovy版本2.4.12。
2条答案
按热度按时间0tdrvxhp1#
这应有助于:https://www.jenkins.io/doc/book/pipeline/shared-libraries/#accessing-steps
最简单的方法-将pipeline作为参数传递到构造函数
这样称呼它
qvk1mo1f2#
我通过以下操作解决了这个问题:
在/vars中创建一个将执行
withCredential
的文件。文件名,例如:
/vars/dockerCommands.groovy
(我之前称之为docker.groovy
,但是Docker已经是一个现有的步骤,所以我建议更改它,这样就不会冲突。)在课堂上我要求这一步。
注意,steps是一个私有变量,它等价于你的
pipeline
变量。我在类的构造函数方法中创建了它。