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

如何在同一Jenkins节点中加载另一个groovy脚本?,jenkins,jenkins-pipeline,jenkinsfile,Jenkins,Jenkins Pipeline,Jenkinsfile,从另一个管道脚本加载管道脚本时,两个管道不会在同一个节点上执行:第一个管道在主节点上执行,第二个管道在从节点上执行 我将Jenkins pipelines与SCM中的管道脚本一起使用选项,用于许多作业,方法如下: 我的每个作业都使用Poll SCM选项定义其对应的Git repo URL,以便在更改代码时自动轮询存储库(基本作业用法) 我的每个作业都在其存储库的根目录下定义了一个简单的Jenkinsfile,其中的管道脚本基本上什么也不做,只是加载了一个更通用的管道 例如: 我的common

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

我将Jenkins pipelines与SCM中的
管道脚本一起使用
选项,用于许多作业,方法如下:

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

  • 我的每个作业都在其存储库的根目录下定义了一个简单的
    Jenkinsfile
    ,其中的管道脚本基本上什么也不做,只是加载了一个更通用的管道

例如:

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

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

        functions.build()
        functions.release()
        functions.deploy()
    }
}
现在我不想为每个作业强制节点,因此两个管道都有
节点(“主”)
节点(“远程”)
,因为我真的不想手动处理,但是我希望第一个管道在特定节点上运行后(主节点、从属节点1、从属节点2、从属节点3)第二个/加载的管道在同一个节点上执行,因为在其他节点的工作区中无法使用我的实际Git存储库代码


是否有任何方法可以指定我希望第二条管道与第一条管道在同一节点上执行,或者在使用
加载
步骤时传递参数?

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

第二条管道如下所示:

node(runhereParam) {

}

在签出之后和脚本加载之前保存工作区如何

e、 g

然后在另一个node(){}节中取消搁置它:

e、 g。
unstash“源代码”

这样,它将在另一个节点中可用

不过别忘了清理工作区

或者创建一个包含签出逻辑的公共函数(可能作为参数传入分支)怎么样。然后您可以放弃Jenkins文件中的node(){},而只使用共享groovy脚本中的node(){}条目

e、 詹金斯档案

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

def createWorkflow(branches){
node() {
        def functions = load 'common/functions.groovy'
        functions.checkout(branches)
        functions.build()
        functions.release()
        functions.deploy()
    }
}

我看不出这能解决我的问题?首先,我不希望有单独的触发作业,因为这会导致并发性问题(同时运行的10个服务必须等待第二个参数化作业按顺序执行),这就是为什么我使用管道,以便能够从不同的作业执行相同的代码。其次,即使使用您的解决方案,第二个作业的参数
runhereParam
在哪里获得?我需要管道的两部分在同一个节点上执行!Stash/Unstash似乎是个好主意,不幸的是,由于某种原因,我无法访问我的
公共管道
闭包,load命令在执行公共闭包之前失败。。。将第二个脚本作为函数加载也是一个好主意,因为它可以确保两个步骤都在同一个节点上运行,但是在
createWorkflow
函数中进行checkouting意味着我复制了签出步骤(Jenkins已经使用
Poll SCM
配置完成了此步骤)。。。我想我正在尝试将您的两种解决方案结合起来:调用函数和在加载的函数中取消设置初始工作区的状态……实际上,我无法从
Poll SCM
配置中隐藏代码签出,因为当执行管道代码时,我已经(可能)在另一个节点上运行代码,我无法控制上面的
Jenkins Poll SCM
执行。。。
load 'common-pipeline.groovy'
createWorlflow("*/master")
def createWorkflow(branches){
node() {
        def functions = load 'common/functions.groovy'
        functions.checkout(branches)
        functions.build()
        functions.release()
        functions.deploy()
    }
}