【问题标题】:Running Jenkins job simultaneously on all nodes在所有节点上同时运行 Jenkins 作业
【发布时间】:2013-06-24 23:11:50
【问题描述】:

TLDR:我希望能够在 Jenkins 管道中的多个节点上同时运行作业。 [例如 - 基于 aws 在节点 dev、test 和 staging 节点上构建应用程序 x]

我有一大组具有相同标签的节点。我希望能够在 Jenkins 中运行一个作业,该作业在 所有 具有相同标签的节点上执行并且同时执行。

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

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

【问题讨论】:

  • 是否有另一种方法可以在不编辑 resources.xml 文件的情况下将节点添加到作业中?我们最终将扩展到数千个节点,并且必须手动将它们添加到 XML 文件中有点乏味,特别是因为节点可能会发生变化。除此之外,Rundeck 看起来有很多我想要的功能。
  • @MarkO'Connor - 我认为 Rundeck 可以完成我们正在做的事情,然后:) 我们最终将使用 EC2。如果您想将您的回复添加为答案,我应该可以接受。谢谢!

标签: jenkins jenkins-pipeline nodes simultaneous


【解决方案1】:

我正在寻找一种在所有节点上运行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 天)。 parallel nodes 开始并行执行(同时在所有找到的节点上)。

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

【讨论】:

  • 运行良好,但需要nodesByLabel 的“Pipeline Utility Steps”插件。
【解决方案2】:

取上面的几个答案,针对 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

【讨论】:

    【解决方案3】:

    【讨论】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

          • 这不起作用。在轴中放置一个标签将在具有该标签的单个节点上构建作业。
          • 是的,它将在该单个节点上构建作业。通常我们有通用的标签,即多个节点根据它们的用途使用相同的标签名称。 (我们不会为所有节点使用唯一的标签名称,因为节点名称已经是唯一的并且服务于该目的)。您还可以在提供的文本区域中提供多个标签名称。这是我找到的唯一解决方案。如果您对此有更好的解决方案,请帮助我。
          • 标签的重点是能够将它们组合在一起,缩放时,只需确保有一个标签,即'script-1',它会添加到轴上
          【解决方案7】:

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

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

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

          【讨论】:

          • 必须选择单个节点会非常不方便,因为我们希望在某个时候扩展到数千个节点。我查看了 Job DSL 插件并能够生成一个作业,但我不太了解如何遍历每个从站。另外..似乎一旦创建了作业,我仍然需要手动执行它们。
          • @^^^ 这是 Job DSL 的一个很好的介绍,应该稍微揭开它的神秘面纱:youtube.com/watch?v=Gyccyj6lA8k
          • 您可以通过一项工作来触发其他工作。使用downstream 命令。
          【解决方案8】:

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

          我创建了一个触发/调用另一个构建的父作业, 当我打电话给他时,我会传递给他一个我不想继续从事儿童工作的标签

          所以基本上父作业只会触发我需要的作业, 并且子作业将运行与该标签中的奴隶数量一样多的次数 (在我的情况下是 4 次)。

          【讨论】:

          • 当所选标签的节点花费太长以启动触发构建之一时,会发生什么?它不会在另一个已经运行触发构建的相同标签的节点上运行吗?
          • @ldnunes 否,构建将在此标签中的所有节点上运行之前不会完成(当然仅限连接的从站)
          • 这需要“参数化触发器 + 节点标签参数插件”,以便任何无法在其 Jenkins 中找到这些参数的人(即我)。
          【解决方案9】:

          启用This project is parameterized,添加Label 类型的参数,为标签输入任意名称并选择默认值,例如覆盖多个节点的标签或此类标签的结合(&&)。启用Run on all nodes matching the label,保持Run regardless of result,保持Node eligibilityAll nodes

          【讨论】:

          • 如果不是因为它 syas 的事实,这本来可以工作的:"(待定 - 没有带有标签'dev03&&Windows-7-x64'的节点)"
          • 我在 jenkins 参数化选项中没有看到任何“标签类型的参数”。 @鳗鱼
          【解决方案10】:

          解决方案:您可以简洁地在多个 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
          
          
          }
          

          【讨论】:

          • 这在哪里运行所有节点上的作业
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-02
          相关资源
          最近更新 更多