我有一大组具有相同标签的节点。我希望能够在Jenkins中运行一个在具有相同标签的节点的所有上执行的工作,同时这样做。
我看到了在Jenkins中使用矩阵配置选项的建议,但我只能想到一个轴(标签组)。当我尝试运行该作业时,它似乎只执行一次而不是300次(该标签组中的每个节点都有1次)。
我的另一个轴应该是什么?或者......是否有一些插件可以做到这一点?我曾尝试过NodeLabel参数插件,并选择“在所有可用的在线节点上运行”,但它似乎不能同时运行这些作业。
答案 0 :(得分:13)
矩阵构建将起作用;使用“Slaves”作为轴并展开“Individual nodes”列表以选择所有节点。
请注意,每次添加或删除从属设备时都需要更新选择。
对于更易于维护的解决方案,您可以使用Job DSL plugin设置具有构建模板的种子作业,然后遍历每个从属并创建一个新作业,并将构建标签设置为名称奴隶
答案 1 :(得分:13)
答案 2 :(得分:11)
您需要两个插件:Paramitrized Trigger Plugin能够触发其他作业作为主要作业的构建步骤,NodeLabel Plugin(阅读BuildParameterFactory部分以了解您需要的内容)指定标签。
答案 3 :(得分:9)
实现此目的的最佳和最简单方法是使用Elastic Axis插件。
1。安装pulgin。
2。创建多配置作业。(如果不存在则安装)
3。在作业配置中,您可以找到添加为弹性轴的新轴。添加如下所示的标签,以便在多个从站上运行作业。
答案 4 :(得分:7)
答案 5 :(得分:7)
知道了 - 不需要任何特殊的插件!
我创建了一个触发/调用另一个构建的父作业, 当我打电话给他时,我将标签传给他,让我无法继续工作。
所以基本上父作业只触发我需要的工作, 并且子作业将运行与标签中的从属数量相同的次数 (在我的情况下4次)。
答案 6 :(得分:6)
采取上述一些答案并将其调整为2.0系列。
您现在可以在所有节点上启动所有作业。
// The script triggers PayloadJob on every node.
// It uses Node and Label Parameter plugin to pass the job name to the payload job.
// The code will require approval of several Jenkins classes in the Script Security mode
def branches = [:]
def names = nodeNames()
for (int i=0; i<names.size(); ++i) {
def nodeName = names[i];
// Into each branch we put the pipeline code we want to execute
branches["node_" + nodeName] = {
node(nodeName) {
echo "Triggering on " + nodeName
build job: 'PayloadJob', parameters: [
new org.jvnet.jenkins.plugins.nodelabelparameter.NodeParameterValue
("TARGET_NODE", "description", nodeName)
]
}
}
}
// Now we trigger all branches
parallel branches
// This method collects a list of Node names from the current Jenkins instance
@NonCPS
def nodeNames() {
return jenkins.model.Jenkins.instance.nodes.collect { node -> node.name }
}
取自代码 https://jenkins.io/doc/pipeline/examples/#trigger-job-on-all-nodes
答案 7 :(得分:2)
我一直在寻找一种在所有节点(带有标签docker system prune
)上运行docker
的方法。我以一个非常简单的脚本化管道结束,AFAIK只需管道插件即可工作:
#!/usr/bin/env groovy
def nodes = [:]
nodesByLabel('docker').each {
nodes[it] = { ->
node(it) {
stage("docker-prune@${it}") {
sh('docker system prune -af --filter "until=1440h"')
}
}
}
}
parallel nodes
这是什么,它正在寻找带有标签docker
的所有节点,然后对其进行迭代并创建一个关联数组nodes
,每个找到的节点只有一步(确切地说,这是在做什么)正在清理所有早于60天的旧docker东西)。 parallel nodes
开始并行执行(同时在所有找到的节点上执行)。
希望这对某人有帮助。
答案 8 :(得分:1)
启用This project is parameterized
,添加类型Label
的参数,为标签输入一个任意名称,然后选择默认值,例如覆盖多个节点的标签或此类标签的结合(&&)标签。启用Run on all nodes matching the label
,保留Run regardless of result
,将Node eligibility
保留在All nodes
。
答案 9 :(得分:1)
解决方案:您可以在多个 Jenkins 节点之间简洁地并行同一个构建
这对于在不同环境中构建相同的项目很有用(例如:在测试、开发和暂存环境中构建节点应用程序)
示例:
pipeline {
agent { docker { image 'node:14-alpine' } }
stages {
stage('build') {
steps {
parallelTasks
}
}
}
}
def parallelTasks() {
def labels = ['test', 'dev', 'staging'] // labels for Jenkins node types we will build on
def builders = [:]
for (x in labels) {
def label = x
builders[label] = {
node(label) {
sh """#!/bin/bash -le
echo "build app on ${label} node"
cd /home/app
npm run build
"""
}
}
}
parallel builders
}