案例: 我有3台机器(A,B,C)用于从属设备(共享相同的节点标签,例如' build')
我有一个可能触发不同下游工作的管道。我需要确保所有作业和下游作业使用相同的节点(共享一些文件等)。我怎么能这样做?
a)我将节点标签传递给下游,但我不确定下游是否会采用相同的节点。(父作业使用slave" A"我传递节点标签' build& #39;对于下游工作,但也许在下游工作中需要奴隶' B')
b)是什么方法在管道执行时获取运行时从站,当我将这个从属名称传递给下游时?
还是有更好的方法吗?
答案 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}"
但是,是的,如果您想在其他工作中使用此作业中的某些文件进行操作,那么您将需要使用例如。提到了复制工件插件,因为作业的工作空间是独立的,每个作业都有不同的内容。