使用Jenkins管道进行矩阵配置

时间:2016-06-20 10:55:46

标签: jenkins jenkins-pipeline jenkins-blueocean

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

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

我试过了:

  • 作为单独的stage步骤连续执行它们。很好,但需要的时间比必要的多。
  • parallel步骤内执行它们,在其中分配或不分配node。但是我无法使用stage并行内部步骤来了解可视化的已知限制。

有推荐的方法吗?

5 个答案:

答案 0 :(得分:15)

TLDR:Jenkins.io希望您为每个版本使用节点

  

Jenkins.io:在管道编码上下文中,“节点”是执行两件事的步骤,通常是通过从代理上的可用执行程序获取帮助来实现:

     
      
  1. 通过将其中的步骤添加到Jenkins构建队列来安排其中包含的步骤(这样,只要节点上的执行程序槽空闲,就会运行相应的步骤)

  2.   
  3. 最佳做法是在节点内完成所有重要工作,例如构建或运行shell脚本,因为阶段中的节点块告诉Jenkins其中的步骤资源密集程度足以安排,从代理池请求帮助,并且只在他们需要时锁定工作区。

  4.   

Vanilla Jenkins舞台中的节点块看起来像:

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

进一步扩展这一概念,Cloudbees撰写了关于parallelism and distributed builds with Jenkins的文章。您的Cloudbees工作流程可能如下所示:

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

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

修改

要解决可视化@Stephen想要看到的问题,他是对的 - 它不起作用! Jenkins和is documented here提出了这个问题,涉及使用“标记块”的决议是still in progress :-(

  

问:是否有文档让管道用户不要将各个阶段放入并行步骤中?

     

A:不,如果完成,则认为这是不正确的用法;阶段仅作为管道中的顶级构造有效,这就是为什么标记块作为单独构造的概念已经成为......而且,我的意思是从管道中的并行步骤中删除阶段。

如果您尝试在并行作业中使用舞台,那么您将度过一段美好时光。

ERROR: The ‘stage’ step must not be used inside a ‘parallel’ block.

答案 1 :(得分:4)

我建议使用Declarative Matrix作为在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}"
                        }
                    }
                }
            }
        }
    }
}

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

Jenkins blog post关于矩阵指令。

答案 2 :(得分:2)

如@StephenKing所述,Blue Ocean将显示比当前阶段视图更好的并行分支。计划即将推出的舞台视图版本将能够显示所有分支,但它不会在视觉上指示任何嵌套结构(看起来与串行运行配置相同)。

无论如何,更深层次的问题是,在解决JENKINS-27395和相关请求之前,您基本上只会获得整体构建的通过/未通过状态。

答案 3 :(得分: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”等的阶段得到详细的报告。)

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

答案 4 :(得分:1)

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

enter image description here