gpt4 book ai didi

Jenkins 管道多配置项目

转载 作者:行者123 更新时间:2023-12-04 11:19:20 25 4
gpt4 key购买 nike

原始情况:

我在 Jenkins (Jenkins)有一份正在运行 Ant 脚本的工作。我轻松地使用“多配置项目”在一个以上的软件版本上测试了该ant脚本。

这种类型的项目真的很酷,因为它允许我指定所需的两个软件的所有版本(在我的情况下为Java和Matlab),并且它将使用我的所有参数组合来运行我的ant脚本。

这些参数然后用作要在我的 Ant 要使用的可执行文件的位置的定义中串联的字符串。

example: env.MATLAB_EXE=/usr/local/MATLAB/${MATLAB_VERSION}/bin/matlab



这工作得很好,但是现在我正在将该脚本迁移到它的规范版本。

管道迁移:

我设法使用 Parametrized pipelines插件以管道方式实现了相同的脚本。这样,我达到了可以手动选择要使用哪个版本的软件(如果我手动触发构建)的点,并且还找到了一种定期执行此操作的方法,该方法可以在每次运行时选择我想要的参数。

该解决方案似乎相当有效,但是并不能令人满意。

我的多配置项目具有以下某些功能:
  • 我可以设置多个参数以对它们进行插值并执行每种组合
  • 执行清晰地分开,并且在构建历史/构建详细信息中易于识别使用了哪些设置
  • 只需在参数中添加一个新的“possible”值即可产生所需的执行方式

  • 要求

    因此,我想知道是否有更好的解决方案可以同时满足上述要求。

    长话短说:有什么方法可以使用 Jenkins 实现多配置项目,但要使用管道技术?

    最佳答案

    我已经看到了这个问题,最近也问了很多类似的问题,所以解决这个问题似乎很有趣……

    用代码可视化的矩阵/多配置作业实际上只是嵌套了几个循环,每个参数轴对应一个。

    您可以使用一些经过硬编码的for循环来遍历一些列表来构建相当简单的东西。否则,您可能会变得更加复杂,并进行一些递归循环,因此您不必对特定循环进行硬编码。

    DISCLAIMER: I do ops much more than I write code. I am also very new to groovy, so this can probably be done more cleanly, and there are probably a lot of groovier things that could be done, but this gets the job done, anyway.



    只需做一点工作,就可以将该matrixBuilder封装在一个类中,以便您可以传递任务闭包和轴列表,并返回任务图。将其粘贴在共享库中,并在任何地方使用。从多配置作业中添加其他一些功能(例如过滤器)应该很容易。

    此尝试使用递归matrixBuilder函数遍历任意数量的参数轴并构建所有组合。然后,它并行执行它们(显然取决于节点的可用性)。
    /*
    All the config axes are defined here
    Add as many lists of axes in the axisList as you need.
    All combinations will be built
    */
    def axisList = [
    ["ubuntu","rhel","windows","osx"], //agents
    ["jdk6","jdk7","jdk8"], //tools
    ["banana","apple","orange","pineapple"] //fruit
    ]



    def tasks = [:]
    def comboBuilder
    def comboEntry = []


    def task = {
    // builds and returns the task for each combination

    /* Map the entries back to a more readable format
    the index will correspond to the position of this axis in axisList[] */
    def myAgent = it[0]
    def myJdk = it[1]
    def myFruit = it[2]

    return {
    // This is where the important work happens for each combination
    node(myAgent) {
    println "Executing combination ${it.join('-')}"
    def javaHome = tool myJdk
    println "Node=${env.NODE_NAME}"
    println "Java=${javaHome}"
    }

    //We won't declare a specific agent this part
    node {
    println "fruit=${myFruit}"
    }
    }
    }


    /*
    This is where the magic happens
    recursively work through the axisList and build all combinations
    */
    comboBuilder = { def axes, int level ->
    for ( entry in axes[0] ) {
    comboEntry[level] = entry
    if (axes.size() > 1 ) {
    comboBuilder(axes[1..-1], level + 1)
    }
    else {
    tasks[comboEntry.join("-")] = task(comboEntry.collect())
    }
    }
    }

    stage ("Setup") {
    node {
    println "Initial Setup"
    }
    }

    stage ("Setup Combinations") {
    node {
    comboBuilder(axisList, 0)
    }
    }

    stage ("Multiconfiguration Parallel Tasks") {
    //Run the tasks in parallel
    parallel tasks
    }

    stage("The End") {
    node {
    echo "That's all folks"
    }
    }

    您可以在 http://localhost:8080/job/multi-configPipeline/[build]/flowGraphTable/(在构建页面上的Pipeline Steps链接下找到)中看到该作业的更详细的流程。

    编辑:
    您可以将阶段下移到“任务”创建中,然后更清楚地看到每个阶段的详细信息,但不能像多配置作业那样以整洁的矩阵形式查看。
    ...
    return {
    // This is where the important work happens for each combination
    stage ("${it.join('-')}--build") {
    node(myAgent) {
    println "Executing combination ${it.join('-')}"
    def javaHome = tool myJdk
    println "Node=${env.NODE_NAME}"
    println "Java=${javaHome}"
    }
    //Node irrelevant for this part
    node {
    println "fruit=${myFruit}"
    }
    }
    }
    ...

    或者,您可以使用自己的 node包装每个 stage以获得更多详细信息。

    在执行此操作时,我注意到以前的代码中有一个错误(现在已在上面修复)。我正在将 comboEntry引用传递给任务。我应该发送一份副本,因为尽管各阶段的名称正确,但是在实际执行这些阶段时,这些值当然是所有遇到的最后一个条目。所以我将其更改为 tasks[comboEntry.join("-")] = task(comboEntry.collect())

    我注意到您可以在执行并行任务时保留原始的 stage ("Multiconfiguration Parallel Tasks") {}。从技术上讲,现在您已嵌套了多个阶段。我不确定 Jenkins 应该如何处理,但是没有提示。但是,“父”级时序不包括并行级时序。

    我还注意到,当一个新的构建开始运行时,在作业的“阶段 View ”上,所有以前的构建都消失了,大概是因为阶段名称不完全匹配。但是,在构建完成运行之后,它们都再次匹配,并且旧的构建再次出现。

    最后,Blue Ocean似乎并没有以同样的方式生动化。它不能识别并行进程中的“阶段”,只能识别封闭阶段(如果存在),如果不能,则不能识别“并行”。然后仅显示各个并行过程,而不显示其中的各个阶段。

    关于 Jenkins 管道多配置项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46601999/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com