我有一组具有相同标签的节点。我希望能够在Jenkins上运行一个作业,该作业在所有具有相同标签的节点上同时执行。
我看到建议在Jenkins中使用矩阵配置选项,但我只能想到一个轴(标签组)。当我尝试运行作业时,似乎它只执行一次,而不是300次(针对该标签组中每个节点1次)。
我的其他轴应该是什么呢?或者......是否有某个插件可以做到这一点?我已经尝试过NodeLabel Parameter Plugin,并选择“在所有可用的在线节点上运行”,但似乎它不会同时运行作业。
您需要两个插件: 参数化触发器插件 以便将其他作业作为主作业的构建步骤来触发,以及NodeLabel插件 (阅读BuildParameterFactory部分以获得所需内容的描述) 来指定标签。
矩阵构建将起作用;使用“从属节点”作为轴,并展开“各个节点”列表以选择所有节点。
请注意,每次添加或删除从属节点时,您需要更新选择。
为了获得更易维护的解决方案,您可以使用Job DSL插件设置种子任务,其中包含构建模板,然后循环遍历每个从属节点,并创建具有构建标签设置为从属节点名称的新任务。
基于上述回答的部分内容,对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
最好、最简单的方法是使用Elastic Axis插件。
1. 安装插件。
2. 创建一个多配置任务。(如果没有安装则需要安装)
3. 在任务配置中,您可以找到新添加的弹性轴(Elastic axis)。按照下面的标签添加以便在多个从节点上运行此任务。
我在寻找一种运行docker system prune
命令的方法,以在所有节点(带有标签docker
)上运行该命令。最终,我使用了一个相当简单的脚本管道,据我所知,它只需要管道插件即可运行:
#!/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
,每个找到的节点都有一个步骤(准确来说,这个功能是清理所有旧的Docker内容,时间超过60天)。parallel nodes
开始并行执行(同时在所有找到的节点上执行)。nodesByLabel
。 - jds210明白了 - 不需要任何特殊的插件!
我创建了一个父任务,触发/调用另一个构建, 当我调用它时,我传递给它标签,以便让子任务在其上运行。
因此,父任务只会触发我所需的任务, 并且子任务将根据该标签中的从属数量运行多次 (在我的情况下运行4次)。
启用此项目是参数化的
,添加一个类型为标签
的参数,输入标签的任意名称并选择默认值,例如涵盖多个节点的标签或这些标签的合取(&&)。启用在匹配标签的所有节点上运行
,保持无论结果如何都运行
,将节点资格
保持为所有节点
。
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
}