30

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

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

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

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

4

10 回答 10

17
  1. 安装
  2. 对于您要运行的作业,如有必要,启用执行并发构建
  3. 除了要在所有从站上运行的作业之外创建另一个作业并对其进行配置
    • 构建 > 添加构建步骤 > 在其他项目上触发/调用构建
      • 添加参数工厂>标签工厂的所有节点>标签:节点的标签
于 2016-01-27T14:11:48.143 回答
13

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

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

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

于 2013-06-24T23:20:07.080 回答
13

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

于 2013-09-13T06:02:23.373 回答
10

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

于 2015-04-26T07:31:09.353 回答
10

采取一些上述答案并将它们调整为 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

于 2017-01-06T12:32:14.910 回答
9
  • Rundeck 可能是更适合您需求的工具。可以设置为并行运行多个作业,并有一个 Jenkins 插件:http ://rundeck.org/
  • Rundeck 旨在与更大的系统集成。我们从配置管理数据库生成资源文件。很容易看到文档:http ://rundeck.org/docs/administration/node-resource-sources.html 。
  • 另外插件可用于亚马逊和/或 puppet 和 chef 等系统:http ://rundeck.org/plugins
于 2013-06-28T19:11:07.790 回答
7

明白了 - 不需要任何特殊的插件!

我创建了一个触发/调用另一个构建的父作业,当我打电话给他时,我将我不想让子作业运行的标签传递给他。

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

在此处输入图像描述

于 2015-07-06T08:26:17.980 回答
6

我正在寻找一种docker system prune在所有节点上运行的方法(带有 label 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开始并行执行(同时在所有找到的节点上)。

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

于 2020-05-09T06:04:33.720 回答
1

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

在此处输入图像描述

于 2018-08-23T17:37:19.423 回答
0

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


}
于 2020-12-27T13:39:46.650 回答