如何从 Jenkins 管道脚本中的标签获取节点名称
How to get node names from labels in a Jenkins pipeline script
我有一组虚拟机来测试我的构建结果。所有 VM 都配置为 Jenkins 从节点。主节点可以启动和停止虚拟机。
VM 被标记为三个一组(cluster1
、cluster2
),并具有不同的角色(role1
、role2
、role3
) .
我想编写一个管道脚本,将 GROUP 名称作为其参数 (StringParameterValue) 并且
- 启动属于该组的虚拟机
- 运行 每个节点上的单独测试(并行)
- 完成后停止 VM。
管道脚本大致如下:
def VM1 = ??? get name of the node labeled ("GROUP && role1") ???;
def VM2 = ??? get name of the node labeled ("GROUP && role2") ???;
def VM3 = ??? get name of the node labeled ("GROUP && role3") ???;
def VMs = [VM1, VM2, VM3];
node (master) {
stage 'Start'
def start = [:];
for ( vm in VMs ) {
start["${vm}"] = {
build job: 'Start_VM', parameters: [
[$class: 'StringParameterValue', name: 'VMNAME', value: vm]];
}
}
parallel start;
def tests = [:];
for (int i = 0; i < VMs.size; i++) {
tests["role${i}"] = {
node (VMs[i]) {
build job: "Test_role${i}";
}
}
}
parallel tests;
Stage 'Stop'
def stop = [:];
for ( vm in VMs ) {
stop["${vm}"] = {
build job: 'Stop_VM', parameters: [
[$class: 'StringParameterValue', name: 'VMNAME', value: vm]];
}
}
parallel stop;
}
问:如何通过组标签导出各个节点名称?
我实现了一个从节点标签中获取节点名称的函数:
def roles = ['role1', 'role2', 'role3'];
def getNodeNames (group, roles) {
def lgroup = Jenkins.instance.getLabel(group)
def result = [:]
for (role in roles) {
def lrole = lgroup.and(Jenkins.instance.getLabel(role))
def nodes = lrole.getNodes()
if (nodes.size() > 0) {
result[role] = nodes[0].getNodeName()
}
}
print "getNodeNames($group) = ${result}"
return result
}
def VMs = getNodeNames(GROUP)
我有一组虚拟机来测试我的构建结果。所有 VM 都配置为 Jenkins 从节点。主节点可以启动和停止虚拟机。
VM 被标记为三个一组(cluster1
、cluster2
),并具有不同的角色(role1
、role2
、role3
) .
我想编写一个管道脚本,将 GROUP 名称作为其参数 (StringParameterValue) 并且
- 启动属于该组的虚拟机
- 运行 每个节点上的单独测试(并行)
- 完成后停止 VM。
管道脚本大致如下:
def VM1 = ??? get name of the node labeled ("GROUP && role1") ???;
def VM2 = ??? get name of the node labeled ("GROUP && role2") ???;
def VM3 = ??? get name of the node labeled ("GROUP && role3") ???;
def VMs = [VM1, VM2, VM3];
node (master) {
stage 'Start'
def start = [:];
for ( vm in VMs ) {
start["${vm}"] = {
build job: 'Start_VM', parameters: [
[$class: 'StringParameterValue', name: 'VMNAME', value: vm]];
}
}
parallel start;
def tests = [:];
for (int i = 0; i < VMs.size; i++) {
tests["role${i}"] = {
node (VMs[i]) {
build job: "Test_role${i}";
}
}
}
parallel tests;
Stage 'Stop'
def stop = [:];
for ( vm in VMs ) {
stop["${vm}"] = {
build job: 'Stop_VM', parameters: [
[$class: 'StringParameterValue', name: 'VMNAME', value: vm]];
}
}
parallel stop;
}
问:如何通过组标签导出各个节点名称?
我实现了一个从节点标签中获取节点名称的函数:
def roles = ['role1', 'role2', 'role3'];
def getNodeNames (group, roles) {
def lgroup = Jenkins.instance.getLabel(group)
def result = [:]
for (role in roles) {
def lrole = lgroup.and(Jenkins.instance.getLabel(role))
def nodes = lrole.getNodes()
if (nodes.size() > 0) {
result[role] = nodes[0].getNodeName()
}
}
print "getNodeNames($group) = ${result}"
return result
}
def VMs = getNodeNames(GROUP)