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

时间:2013-06-24 23:11:50

标签: jenkins jenkins-plugins

我有一大组具有相同标签的节点。我希望能够在Jenkins中运行一个在具有相同标签的节点的所有上执行的工作,同时这样做。

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

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

10 个答案:

答案 0 :(得分:13)

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

请注意,每次添加或删除从属设备时都需要更新选择。

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

答案 1 :(得分:13)

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

答案 2 :(得分:11)

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

答案 3 :(得分:9)

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

答案 4 :(得分:7)

答案 5 :(得分:7)

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

我创建了一个触发/调用另一个构建的父作业, 当我打电话给他时,我将标签传给他,让我无法继续工作。

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

enter image description here

答案 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

enter image description here

答案 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


}