确保jenkins管道使用相同的节点进行下载流作业

时间:2018-04-19 15:36:20

标签: jenkins jenkins-pipeline

案例: 我有3台机器(A,B,C)用于从属设备(共享相同的节点标签,例如' build')

我有一个可能触发不同下游工作的管道。我需要确保所有作业和下游作业使用相同的节点(共享一些文件等)。我怎么能这样做?

a)我将节点标签传递给下游,但我不确定下游是否会采用相同的节点。(父作业使用slave" A"我传递节点标签' build& #39;对于下游工作,但也许在下游工作中需要奴隶' B')

b)是什么方法在管道执行时获取运行时从站,当我将这个从属名称传递给下游时?

还是有更好的方法吗?

4 个答案:

答案 0 :(得分:1)

我建议你试试NodeLable Parameter插件。

安装完成后,选中“此项目已参数化”选项,然后从“添加参数”下拉列表中选择“节点”。

在使用参数构建作业时,它将填充所有节点作为下拉列表。

它还有一些其他选项可以帮助你。

答案 1 :(得分:1)

对我来说最重要的问题是:为什么他们需要在同一个节点上运行?

反正。实现此目的的一种方法是在第一个管道中检索节点块中的节点名称,如(注意:无法验证下面编写的代码):

// Code for upstream job
@NonCPS
def getNodeName(def context) {
    context.toComputer().name
}
def nodeName = 'undefined'
node('build') {
    nodeName = steps.getContext(FilePath)
}

build job: 'downstream', parameters: [string(name: 'nodeName', value: nodeName)]

在下游流程中,您使用该字符串参数作为节点块的输入 - 当然,您应该确保下游实际参数化的第一个位置具有名为nodeName的字符串参数:

node(nodeName) {
    // do some stuff
}

答案 2 :(得分:0)

即使拥有静态代理,最终也会清理工作区,因此不要依赖构建工作区中存在的文件。

只需在上游作业中存档您需要的任何内容(使用CREATE EXTERNAL TABLE `test1column`( `column3` string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://bucketpath/folder' TBLPROPERTIES ( 'has_encrypted_data'='false', 'transient_lastDdlTime'='1524150460') 步骤),然后在下游作业中使用Copy Artifact Plugin即可获得所需内容。您可能需要参数化下游作业,以便将它们传递给您需要的上游工件(复制工件插件中有大量选择器,您可以使用这些选择器来实现您想要的目标。

答案 3 :(得分:0)

如果从管道手动触发子作业,则可以使用语法来传递特定节点标签

build job: 'test_job', parameters: [[$class: 'LabelParameterValue', name: 'node', label: 'tester1']]
build job: 'test_job', parameters: [[$class: 'LabelParameterValue', name: 'node', label: 'tester2']]

您应该能够以这种方式获得节点的当前标签${env.NODE_NAME}"

但是,是的,如果您想在其他工作中使用此作业中的某些文件进行操作,那么您将需要使用例如。提到了复制工件插件,因为作业的工作空间是独立的,每个作业都有不同的内容。