当前位置: 首页 > 面试题库 >

Jenkins在不同的代理上并行构建

耿俊彦
2023-03-14
问题内容

我有一个Jenkins声明性管道的小例子,该管道应同时在“ Windows”和“
Linux”代理上运行。目标是动态构建配置矩阵(例如,发布/调试配置;不同的CMake参数;等等),并使所有组合并行运行。但是,我被困在建立从预备变量执行并行步骤的管道中。

这是脚本的一个版本,其中并行阶段是在parallel{}块内显式指定的:

pipeline {
    agent any
    stages {
        stage ("Parallel Build") {
            parallel {
                stage ("Windows") {
                    steps {
                        echo "TEST Windows"
                    }
                }
                stage ("Linux") {
                    steps {
                        echo "TEST Linux"
                    }
                }
            }
        }
    }
}

我的计划是在parallel{}块中动态创建阶段(取决于所需的配置),但是我不确定语法或是否完全可能。

像这样:

def stage_list = {
    stage ("Windows") {          <=== How to correctly create the stage_list?
        steps {
            echo "TEST Windows"
        }
    }
    stage ("Linux") {
        steps {
            echo "TEST Linux"
        }
    }
}

pipeline { 
    agent any
    stages {    
        stage ("Parallel Build") {
                parallel stage_list <== How to replace a block with variable?
        }
    }
}

上面的代码会在詹金斯中返回错误:

WorkflowScript: 17: Expected a block for parallel @ line 17, column 9.
           stage ("Parallel Build") {
           ^

WorkflowScript: 17: Expected one of "steps", "stages", or "parallel" for stage "Parallel Build" @ line 17, column 9.
           stage ("Parallel Build") {
           ^

有谁知道如何做到这一点?

编辑 :在前两个答案之后,我想更新一下我的问题。

我测试了创建stage_list变量的建议方法。但是,如果我将此调用parallel stage_list放到原始结构中,则会得到与以前相同的错误。script像这样使用时运行良好

pipeline { 
    agent any
    stages {    
        stage ("Parallel Build") {
            steps {
                script {
                    parallel stepsForParallel
                }
            }            
        }
    }
}

有人可以向我解释差异吗?为什么它一起工作stepsscript,但没有他们?

编辑2: 出于文档方面的原因,我想用解决问题的方法来结束我的问题:

SmartToms回答和詹金斯关于Docker的管道语法的官方文档明确指出,声明性管道和脚本化管道是两种需要不同处理的单独方法(请注意每个示例下方的“切换脚本化管道”链接)。

解决我的问题的一种方法是使用脚本化的管道-
如果有人对此示例感兴趣,这里是一个管道的链接,其中包含了显示原理的管道脚本。


问题答案:

从本文档中可以这样进行:

// Creation of the stage_list
def stage_list = ["Windows", "Linux"]

// Creation of a map of stages
def stepsForParallel = stage_list.collectEntries {
    ["echoing ${it}" : transformIntoStage(it)]
}

// Run the stages in parallel
parallel stepsForParallel

// Creation of the stage
def transformIntoStage(inputString) {
    return {
        stage (inputString) {
            steps {
                echo "TEST "+inputString
            }
        }
    }
}

您可以在此处找到有关并行Jenkins声明式管道的更多信息。

编辑

为什么它一起工作stepsscript,但没有他们?

根据本文档,我认为parallel与列表一起使用是
方法(在Declarative Pipeline 1.2之前),该方法要求在Declarative Pipeline中使用Scripted
Pipeline。

似乎新方法parallel(来自Declarative Pipeline 1.2)不能与列表一起使用。因此,要执行此操作,必须使用 旧的
Scripted Pipeline方法,因此,您需要封装自己的命令pipeline stage_listscript而该命令本身必须由封装steps

您可以在此处找到有关脚本化管道和声明性管道的更多信息。



 类似资料:
  • 这是org.csanchez.jenkins.plugins.Kubernetes日志。我已经上传到wetransfer->we.tl/t-zisbftkzrk 我已经读过很多关于这个问题的文章,并且已经用这个JAVA_OPTS配置了jenkins,但是问题没有得到解决。 Kubernetes插件配置有: null

  • 我有一个多分支管道架构的以下Jenkinsfile 我试图在Ubuntu和Red Hat节点上并行运行“构建”阶段,而仅在Ubuntu节点上运行“测试”阶段。 任何人都可以帮助我指定如何选择在哪些节点上运行哪些阶段。我在网上找到的解决方案很少,但他们建议重写构建阶段两次:一次用于Red Hat节点,另一次用于Ubuntu节点。难道没有办法在没有代码重复的情况下做到这一点吗? 非常感谢

  • 问题内容: 我目前在“开发”框中安装了Jenkins实例。这样可以很好地构建并且可以毫无问题地部署到我们的开发环境中。 在构建过程中,我的项目使用了一个包含诸如数据库连接URL之类的详细信息的属性文件(诸如此类的详细信息显然会因我所指向的环境而异)。 我想知道的是配置项目的最佳方法是什么,以便当我想将Jenkins构建的WAR文件发布到Production中时,它包含Production属性而不是

  • rabbitMQ教程部分中的hello world示例只要求使用不同机器的ip更改主机名。但这对我不起作用。我已尝试将外部IP地址绑定到Rabbit MQ服务器​ 但这不起作用。我还需要对配置文件或代码执行其他操作吗? 这是发送代码 还有我在另一台机器上运行的接收代码 我得到的错误是 我感谢你们花时间帮助我。

  • 请帮我做下面的事。我在一台共享服务器上安装了Jenkins。目前由多个团队使用,因此不允许在那里安装其他软件包/软件。每个团队都添加了专用的从节点,并根据需要进行配置。同样,我们有一个专用节点来运行我们的作业。(这也是我想运行我的工作的地方。) 我有 bitbucket 存储库,其中“Jenkinsfile”将包含部署步骤,而“Dockerfile”则希望从中创建容器并在其中运行部署步骤。 我想先

  • 问题内容: 我安装了Github插件并将Poll SCM设置为1分钟。下面是我的配置的图片。 因此,当我提交仓库时,一分钟后构建便开始了。 在我的github存储库上,我创建了一个webhook(但超时)和一个也不起作用的服务(我认为问题出在我的jenkins服务器上)。 但是缺少“将更改推送到GitHub时生成”复选框。 问题答案: 在GitHub插件v1.25.1版本上,触发器已重命名为 Gi