如何在同一个Jenkins节点中加载另一个groovy脚本?

时间:2016-08-10 14:29:58

标签: jenkins jenkins-pipeline jenkinsfile

从另一个管道脚本加载管道脚本时,两个管道不会在同一节点上执行:第一个在我的主节点上执行,第二个在从节点上执行。

我以这种方式使用带有Pipeline Script from SCM选项的Jenkins管道来完成大量工作:

  • 我的每个作业都使用Poll SCM选项定义了相应的Git repo URL,以便在对我的代码进行更改(基本作业使用)时自动轮询存储库。

  • 我的每个作业都在其存储库的根目录中定义了一个简单的Jenkinsfile,而内部的管道脚本基本上只是加载了一个更通用的管道。

例如

node {
    // --- Load the generic pipeline ---
    checkout scm: [$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], submoduleCfg: [], userRemoteConfigs: [[url: 'http://github/owner/pipeline-repo.git']]]
    load 'common-pipeline.groovy'
}()

我的 common-pipeline.groovy 管道执行实际的工作,例如构建,发布或部署工件,例如:

{ ->
    node() {
        def functions = load 'common/functions.groovy'

        functions.build()
        functions.release()
        functions.deploy()
    }
}

现在我不想强制每个作业的节点,因此两个管道都有node("master")node("remote")因为我真的不想要手动处理,但是一旦第一个管道在特定节点上运行(主站 slave1 slave2 ),我就会这样做, slave3 )第二个/已加载的管道在同一节点上执行,因为否则我的实际Git存储库代码不能从其他节点的工作空间中获得...

有什么方法可以指定我希望我的第二个管道在第一个管道的同一个节点上执行,或者在使用load步骤时传递一个参数?

2 个答案:

答案 0 :(得分:2)

如何在结帐后和脚本加载之前存储工作区?:

e.g。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table id="myId">
  <tbody>
    <tr>
     <td>Hello</td>
     <td>world</td>
    </tr>
  </tbody>
</table>

然后在另一个节点(){}部分中取消暂存:

e.g。 stash includes: '**', name: "source"

这样它就可以在其他节点中使用

不要忘记通过

清理工作区

或者如何创建一个包含结帐逻辑的公共函数(可能将分支作为参数传递)。然后你可以丢弃Jenkins文件中的node(){}并在共享的groovy脚本中使用node(){}条目?

e.g。 Jenkinsfile

unstash "source"

共pipeline.groovy:

load 'common-pipeline.groovy'
createWorlflow("*/master")

答案 1 :(得分:1)

您可以为第二个管道创建参数化作业,并在触发第二个作业时使用该参数来控制节点。

第二个管道如下所示:

node(runhereParam) {

}