28

Jenkins Pipeline 插件(又名 Workflow)可以使用其他Multibranch插件进行扩展,以自动构建分支和拉取请求。

运行多个配置的首选方式是什么?例如,使用 Java 7 和 Java 8 构建。这通常称为矩阵配置(因为语言版本、框架版本等多种组合)或构建变体。

我试过:

  • stage作为单独的步骤连续执行它们。很好,但需要的时间比必要的多。
  • 在一个步骤中执行它们parallel,有或没有nodes 在其中分配。有效,但我不能使用stage并行内部的步骤来限制它的可视化方式。

有推荐的方法吗?

4

5 回答 5

16

TLDR:Jenkins.io希望您为每个构建使用节点

Jenkins.io:在管道编码上下文中,“节点”是一个执行两件事的步骤,通常是通过从代理上的可用执行者那里获得帮助:

  1. 通过将其中包含的步骤添加到 Jenkins 构建队列来安排其中包含的步骤运行(以便一旦节点上的执行器插槽空闲,相应的步骤就会运行)

  2. 最佳实践是在节点内完成所有实质性工作,例如构建或运行 shell 脚本,因为阶段中的节点块会告诉 Jenkins,它们中的步骤是资源密集型的,可以安排,请从代理池请求帮助,并仅在需要时锁定工作区。

阶段内的 Vanilla Jenkins 节点块如下所示:

stage 'build' {
    node('java7-build'){ ... }
    node('java8-build'){ ... }
}

进一步扩展这个概念 Cloudbees 写了关于并行性和分布式构建与 Jenkins的文章。您的 Cloudbees 工作流程可能如下所示:

stage 'build' {
    parallel 'java7-build':{
      node('mvn-java7'){ ... }
    }, 'java8-build':{
      node('mvn-java8'){ ... }
    }
}

您对管道中不同构建的可视化要求可以满足任一工作流程,但我相信 Jenkins 文档的最佳实践。


编辑

为了解决@Stephen想看到的可视化问题,他是对的——它不起作用!该问题已向 Jenkins 提出并在此处记录,涉及使用“标记块”的解决方案仍在进行中:-(

问:是否有文档允许管道用户不要将阶段放在并行步骤中?

A:不,如果这样做了,这被认为是错误的使用;阶段仅作为流水线中的顶级结构有效,这就是为什么将标记块作为单独结构的概念出现的原因......我的意思是从我的流水线中的并行步骤中删除阶段。

如果您尝试在并行作业中使用阶段,您将度过一段糟糕的时光。

ERROR: The ‘stage’ step must not be used inside a ‘parallel’ block.
于 2016-07-13T12:19:16.960 回答
6

我建议将声明矩阵作为在 Jenkins 中运行多个配置的首选方式。它允许您为每个配置执行定义的阶段,而无需重复代码。

例子:

pipeline {
    agent none
    stages {
        stage('Test') {
            matrix {
                agent {
                    label "${NODENAME}"
                }
                axes {
                    axis {
                        name 'NODENAME'
                        values 'java7node', 'java8node'
                    }
                }
                stages {
                    stage('Test') {
                        steps {
                            echo "Do Test for ${NODENAME}"
                        }
                    }
                }
            }
        }
    }
}

请注意,声明矩阵是本机声明管道功能,因此不需要额外的插件安装。

Jenkins关于矩阵指令的博客文章。

于 2020-02-07T13:05:03.313 回答
3

正如@StephenKing 所指出的,Blue Ocean 将比当前阶段视图更好地显示并行分支。计划中即将发布的阶段视图版本将能够显示所有分支,尽管它不会在视觉上指示任何嵌套结构(看起来就像您连续运行配置一样)。

无论如何,更深层次的问题是您基本上只会获得整个构建的通过/失败状态,等待对JENKINS-27395和相关请求的解决。

于 2016-08-25T15:25:58.903 回答
2

为了在多个平台上测试每个提交,我使用了这个基本的 Jenkinsfile 框架:

def test_platform(label, with_stages = false)
{
    node(label)
    {
        // Checkout
        if (with_stages) stage label + ' Checkout'
        ...

        // Build
        if (with_stages) stage label + ' Build'
        ...

        // Tests
        if (with_stages) stage label + ' Tests'
        ...
    }
}

/*
parallel ( failFast: false,
    Windows: { test_platform("Windows") },
    Linux:   { test_platform("Linux")   },
    Mac:     { test_platform("Mac")     },
)
*/

test_platform("Windows", true)
test_platform("Mac",     true)
test_platform("Linux",   true)

有了这个,从顺序执行切换到并行执行相对容易,它们中的每一个都有其优点和缺点:

  • 并行执行运行得更快,但它不包含阶段标记
  • 顺序执行要慢得多,但是由于阶段,您可以获得详细的报告,标记为“Windows Checkout”、“Windows Build”、“Windows Tests”、“Mac Checkout”等)

我暂时使用顺序执行,直到找到更好的解决方案。

于 2016-08-29T09:21:04.353 回答
1

至少BlueOcean UI似乎有一种解脱。这是我得到的(tk-*节点是并行步骤):

在此处输入图像描述

于 2016-07-19T19:44:04.577 回答