如何从指定的分支而不是主分支加载CPS Global Lib?

时间:2016-02-20 14:34:51

标签: jenkins jenkins-workflow

我正在研究Jenkins Pipeline Global Lib的功能。它似乎非常方便,但由于其全球性质,任何有害的变化都会影响所有工作。因此,我希望能够在推送到另一个分支上的主人之前测试它。

有没有办法指定我想要包含特定作业的全局lib源的分支?

更新。我尝试使用测试分支中的直接git clone解决方法,然后load我的库文件明确替换自动加载的文件。 当这个lib使用src/中的其他一些类时会出现问题。因为在这种情况下,始终使用其来自master的预加载版本。

因此,在以下条件下,它会从功能测试运行common.groovy,但在调用Hello from master!!!!时会打印b.dummy()

Jenkins中的管道脚本:

node('myhost'){
    git url: 'ssh://10.0.0.1:12345/workflowLibs.git',
        branch: 'feature-test'

    dir ('src'){
        load 'com/foo/Base.groovy'
    }
    dir ('vars'){
        common = load 'common.groovy'
    }
}

println common.dummy()

vars / common.groovy(功能测试):

package com.foo
def dummy(){
    def b = new com.foo.Base()
    b.dummy()
}

src / com / foo / Base.groovy(master):

package com.foo
def dummy(){
    return 'Hello from master!!!!'
}

src / com / foo / Base.groovy(功能测试):

package com.foo
def dummy(){
    return 'Hello from feature-test!!!!'
}

1 个答案:

答案 0 :(得分:4)

据我所知,这是不可能的 - 推送到此repo的脚本不能通过具有不同的分支来进行版本化。

您可以采取一些替代方法,包括将您的脚本托管在外部仓库中(即不使用Global Lib仓库):

您可以使用Pipeline Remote Loader plugin,它允许您从远程仓库中提取管道脚本,例如

def p = fileLoader.fromGit('bar/common.groovy', 
          'https://example.com/foo/pipelines.git',
          'test-branch', null, '')
p.doSomething()

您还可以使用此插件轻松地从同一个仓库加载多个Pipeline脚本。

或者,您可以在管道执行中查看脚本Git仓库,并直接在load脚本中查看:

stage 'Load scripts'
def p
dir('tmp') {
    git url: 'https://example.com/foo/pipelines.git',
        branch: 'test-branch'
    p = load 'bar/common.groovy'
}

stage 'Do something'
p.doSomething()

如果您想继续使用Global Lib repo,可以使用上述技术测试脚本,然后设置Jenkins作业以将脚本更改推送到主Global Lib仓库。