在所有节点上同时运行Jenkins作业

use*_*467 24 jenkins jenkins-plugins

我有一大组具有相同标签的节点.我希望能够在Jenkins中运行一个在具有相同标签的所有节点上执行的作业,以及同时执行此操作.

我看到了在Jenkins中使用矩阵配置选项的建议,但我只能想到一个轴(标签组).当我尝试运行该作业时,它似乎只执行一次而不是300次(该标签组中的每个节点都有1次).

我的另一个轴应该是什么?或者......是否有一些插件可以做到这一点?我曾尝试过NodeLabel参数插件,并选择"在所有可用的在线节点上运行",但似乎并没有同时运行这些作业.

thS*_*oft 15

  1. 安装
  2. 对于要运行的作业,请根据需要启用" 执行并发构建"
  3. 除了要在所有从站上运行的作业之外,还要创建另一个作业并进行配置
    • 构建>添加构建步骤>在其他项目上触发/调用构建
      • 添加ParameterFactories>标签工厂的所有节点>标签:节点的标签


gar*_*les 13

矩阵构建将起作用; 使用"Slaves"作为轴并展开"Individual nodes"列表以选择所有节点.

请注意,每次添加或删除从站时都需要更新选择.

对于更易于维护的解决方案,您可以使用Job DSL插件设置具有构建模板的种子作业,然后遍历每个从属并创建一个新作业,并将构建标签设置为从属名称.


小智 12

您需要两个插件:Paramitrized Trigger Plugin,能够触发其他作业作为主要作业的构建步骤,以及NodeLabel插件(请阅读BuildParameterFactory部分以了解您需要的内容)来指定标签.


Amo*_*kar 10

实现此目的的最佳和最简单的方法是使用Elastic Axis插件.
1.安装喷嘴.
2.创建多配置作业.(如果不存在则安装)
3.在作业配置中,您可以找到添加为弹性轴的新轴.添加如下所示的标签,以便在多个从站上运行作业. 在此输入图像描述


mar*_*rix 8

我正在寻找一种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
Run Code Online (Sandbox Code Playgroud)

注意:需要管道实用程序步骤

它的作用是查找带有 label 的所有节点docker,然后对其进行迭代并创建一个关联数组,nodes每个找到的节点一个步骤(准确地说,它所做的是清理所有早于 60 天的旧 docker 内容)。parallel nodes开始并行执行(同时在所有找到的节点上)。

希望这会对某人有所帮助。

  • 效果很好,但需要“nodesByLabel”的“Pipeline Utility Steps”插件。 (3认同)

Mar*_*nor 7


Sha*_*uan 7

知道了 - 不需要任何特殊的插件!

我已经创建了一个触发/调用另一个构建的父作业,而当我打电话给他时,我将标签告诉他,这不是我要做的孩子的工作.

所以基本上父作业只触发我需要的作业,子作业将运行与该标签中的从属数量相同的次数 (在我的情况下为4次).

在此输入图像描述

  • 对于任何无法在Jenkins(即我)中找到这些参数的人来说,这需要'参数化触发器+ nodelabel参数插件'. (5认同)

dru*_*bin 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 }
}
Run Code Online (Sandbox Code Playgroud)

取自代码 https://jenkins.io/doc/pipeline/examples/#trigger-job-on-all-nodes