我有一个jenkins管道工作,一直很好。我有一些类似的管道,我一直在复制一小组可重用的实用方法。所以,我已经开始构建一个共享库来减少重复。
我正在使用以下页面获取指导:https://jenkins.io/doc/book/pipeline/shared-libraries/。
对于我移入共享库的每个方法,我在共享库中创建一个“vars / methodname.groovy”文件,并将方法名称更改为“call”。
我一直在做这些,并验证管道工作仍然有效,这一切都正常。
原始方法集将引用几个“全局”变量,例如“env.JOB_NAME”和“params。”。为了使该方法在共享库中工作,我将添加对那些env vars和params的引用作为方法的参数。这也很好。
但是,我不喜欢这样一个事实,即我必须传递这些“全局”变量,这些变量从作业开始时基本上是静态的,有时候通过这些方法的几个层次我已经放入共享库。
所以,我现在已经从该doc页面创建了类似“vars / acme.groovy”的例子。我将定义实例变量来存储所有这些“全局”变量,并将每个“vars / methodname.groovy”文件中定义的每个单一方法作为实例变量移动到这个新类中。
我还在类中为每个实例变量定义了一个“with”方法(setter为链接返回“this”)。
我最初会在我的“node”块中配置它,如下所示(库中的文件名为“vars / uslutils.groovy”):
uslutils.withCurrentBuild(currentBuild).with...
然后当我需要调用任何重用的方法时,我只会做“uslutils.methodname(optionalparameters)
”。
我还在类中添加了一个“toString()”方法,仅用于调试(因为调试Jenkinsfiles非常简单:))。
奇怪的是,我发现如果我从管道脚本中调用此toString()
方法,则该作业将永远挂起,我必须手动终止它。我想我在一些Groovy AST中遇到了一些非显而易见的递归,但是我看不出我做错了什么。
这是我在共享库中的“vars / uslutils.groovy”文件:
import hudson.model.Cause
import hudson.triggers.TimerTrigger
import hudson.triggers.SCMTrigger
import hudson.plugins.git.GitStatus
class uslutils implements Serializable {
def currentBuild
String mechIdCredentials
String baseStashURL
String jobName
String codeBranch
String buildURL
String pullRequestURL
String qBotUserID
String qBotPassword
def getCurrentBuild() { return currentBuild }
String getMechIdCredentials() { return mechIdCredentials }
String getBaseStashURL() { return baseStashURL }
String getJobName() { return jobName }
String getCodeBranch() { return codeBranch }
String getBuildURL() { return buildURL }
String getPullRequestURL() { return pullRequestURL }
String getQBotUserID() { return qBotUserID }
String getQBotPassword() { return qBotPassword }
def withCurrentBuild(currentBuild) { this.currentBuild = currentBuild; return this }
def withMechIdCredentials(String mechIdCredentials) { this.mechIdCredentials = mechIdCredentials; return this }
def withBaseStashURL(String baseStashURL) { this.baseStashURL = baseStashURL; return this }
def withJobName(String jobName) { this.jobName = jobName; return this }
def withCodeBranch(String codeBranch) { this.codeBranch = codeBranch; return this }
def withBuildURL(String buildURL) { this.buildURL = buildURL; return this }
def withPullRequestURL(String pullRequestURL) { this.pullRequestURL = pullRequestURL; return this }
def withQBotUserID(String qBotUserID) { this.qBotUserID = qBotUserID; return this }
def withQBotPassword(String qBotPassword) { this.qBotPassword = qBotPassword; return this }
public String toString() {
// return "[currentBuild[${this.currentBuild}] mechIdCredentials[${this.mechIdCredentials}] " +
// "baseStashURL[${this.baseStashURL}] jobName[${this.jobName}] codeBranch[${this.codeBranch}] " +
// "buildURL[${this.buildURL}] pullRequestURL[${this.pullRequestURL}] qBotUserID[${this.qBotUserID}] " +
// "qBotPassword[${this.qBotPassword}]]"
return this.mechIdCredentials
}
请注意,我暂时简化了toString()方法,直到我弄清楚我在这里做错了什么。
这是我在“节点”块顶部添加的内容:
uslutils.currentBuild = currentBuild
println "uslutils[${uslutils}]"
当我运行这个工作时,它会打印出来之前的行的信息,然后它会永远显示旋转的东西,直到我杀死这个工作。如果我注释掉“println”,它就可以了。