Jenkins管道作业挂起简单调用从共享库

时间:2017-02-09 17:41:24

标签: jenkins groovy jenkins-pipeline

我有一个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”,它就可以了。

0 个答案:

没有答案