
这篇文章第一次出现在詹金斯.io作者Liam Newman,我经常发现自己需要在一堆不同的配置上运行相同的操作。到目前为止,这意味着我必须在管道中复制同一阶段的多个副本。当我需要进行更改时,我必须在整个流程的多个位置进行相同的更改。维护一个更大的配置更是困难声明性管道Pipeline 1.5.0-beta1(现在可以从Jenkins实验性更新站点获得)添加了一个新的matrix部分,它允许我指定一个列表阶段,然后在多个配置上并行运行同一个列表。我们来看看吧!单配置管道我将从一个包含构建和测试阶段的简单管道开始。我使用echo步骤作为构建和测试的占位符actions.Jenkinsfilepipeline{代理无阶段{阶段('BuildAndTest'){任何探员阶段{阶段("构建"){台阶{回音"Do Build"}}阶段("测试"){台阶{回声"做测试"}}}}}}Pipeline for multiple platforms and browser我想在平台和浏览器的组合上运行我的构建和测试。新的matrix指令允许我指定一组轴。每个轴都有一个名称和一个或多个值的列表。当管道运行时,Jenkins将获取这些数据,并在每个轴的所有可能的值组合上运行我的阶段。矩阵中的所有单元并行运行(仅受可用代理的数量限制)。运行每个单元内的阶段顺序。我的矩阵有两个轴:平台和浏览器。我有三个PLATFORM值和四个BROWSER值,这导致我的stage以12种不同的组合运行。我已经更改了回声步数以使用每个轴的值细胞。詹金斯文件管道{代理无阶段{阶段('BuildAndTest'){矩阵{任何探员轴线{轴心{名称"平台"值"linux"、"windows"、"mac"}轴心{名称"浏览器"值"firefox"、"chrome"、"safari"、"edge"}}阶段{阶段("构建"){台阶{echo"为${PLATFORM}-${BROWSER}进行构建"}}阶段("测试"){台阶{echo"对${PLATFORM}-${BROWSER}进行测试"}}}}}}}日志输出(已截断)。。。[管道]阶段[管道]{(BuildAndTest)[管道]平行[管道]{(分支:Matrix-OS='linux',BROWSER='firefox')[管道]{(分支:Matrix-OS='windows',BROWSER='firefox')[管道]{(分支:Matrix-OS='mac',BROWSER='firefox')[管道]{(分支:Matrix-OS='linux',BROWSER='chrome')[管道]{(分支:Matrix-OS='windows',BROWSER='chrome')[管道]{(分支:Matrix-OS='mac',BROWSER='chrome')[管道]{(分支:Matrix-OS='linux',BROWSER='safari')[管道]{(分支:Matrix-OS='windows',BROWSER='safari')[管道]{(分支:Matrix-OS='mac',BROWSER='safari')[管道]{(分支:Matrix-OS='linux',BROWSER='edge')(隐藏)[管道]{(分支:Matrix-OS='windows',BROWSER='edge')[管道]{(分支:Matrix-OS='mac',BROWSER='edge')...为linux做构建-safari为linux构建-firefox为windows做构建-firefox测试linux-firefox为mac构建firefox为linux做构建-chrome测试windows-firefox... 排除了无效的组合我创建了我的基本矩阵,我注意到我有一些无效的组合。Microsoft Edge只在Windows上运行,并且没有Linux版本的Safari。我可以使用排除指令从矩阵中删除无效单元格。每个排除都有一个或多个带有名称和值的轴指令。exclude中的axis指令生成一组组合(类似于生成矩阵单元)。与排除组合中的所有值匹配的矩阵单元将从矩阵中移除。如果我有多个exclude指令,则每个指令都将单独求值以删除细胞。什么时候处理一长串要排除的值,我可以使用notValues代替values来指定不希望排除的轴值。是的,这是一个双重否定,所以会有点混乱。我试着只在我真正需要的时候使用它它。在下面是我的示例管道,我特别排除了linux和safari的组合,还排除了任何非windows的平台浏览器。这个管道使用两个轴,但轴的数量没有限制指令。还有,在此管道中,每个排除都指定两个轴的值,但这不是必须的。如果我们只想运行"linux"单元,我们可以使用以下排除:exclude{轴心{名称"平台"notValues"linux"}}管道{代理无阶段{阶段('BuildAndTest'){矩阵{任何探员轴线{轴心{名称"平台"值"linux"、"windows"、"mac"}轴心{名称"浏览器"值"firefox"、"chrome"、"safari"、"edge"}}排除{排除{轴心{名称"平台"值"linux"}轴心{名称"浏览器""safari"价值观}}排除{轴心{名称"平台"notValues"窗口"}轴心{名称"浏览器""边缘"值}}}阶段{阶段("构建"){台阶{echo"为${PLATFORM}-${BROWSER}进行构建"}}阶段("测试"){台阶{echo"对${PLATFORM}-${BROWSER}进行测试"}}}}}}}日志输出(已截断)。。。[管道]阶段[管道]{(BuildAndTest)[管道]平行[管道]{(分支:Matrix-OS='linux',BROWSER='firefox')[管道]{(分支:Matrix-OS='windows',BROWSER='firefox')[管道]{(分支:Matrix-OS='mac',BROWSER='firefox')[管道]{(分支:Matrix-OS='linux',BROWSER='chrome')[管道]{(分支:Matrix-OS='windows',BROWSER='chrome')[管道]{(分支:Matrix-OS='mac',BROWSER='chrome')[管道]{(分支:Matrix-OS='windows',BROWSER='safari')[管道]{(分支:Matrix-OS='mac',BROWSER='safari')[管道]{(分支:Matrix-OS='windows',BROWSER='edge')...为linux构建-firefox... 在matrix指令中控制运行时的单元行为我还可以添加"每单元"指令。这些指令和我添加到stage的指令是一样的,它们让我控制矩阵中每个单元的行为。这些指令可以使用它们单元格中的轴值作为输入的一部分,允许我自定义每个单元格的行为以匹配其轴值。开我的Jenkins服务器我已经为每个代理配置了与操作系统相匹配的标签("linux代理"、"windows代理"和"mac代理")。为了在适当的操作系统上运行矩阵中的每个单元,我使用Groovy字符串为该单元配置标签模板化.matrix{轴{。。。}排除{。。。}代理人{标签"${PLATFORM}-agent"}阶段{。。。}// ...}偶尔我会从Jenkins webui手动运行管道。当我这样做的时候,我希望能够选择一个平台来运行。axis和exclude指令定义构成矩阵的静态单元集。这组组合是在运行开始之前,在处理任何参数之前生成的。这意味着我不能在作业完成后从矩阵中添加或删除单元格已经开始了另一方面,"每单元"指令在运行时计算。我可以在矩阵内部使用"per cell"when指令来控制执行矩阵中的哪些单元。我将添加一个带有平台列表的choice参数,并向when指令添加条件,它要么允许所有平台执行,要么只执行与我选择的匹配的单元格平台.管道{参数{choice(name:'PLATFORM_FILTER',选项:['all','linux','windows','mac',description:'在特定平台上运行')}代理无阶段{阶段('BuildAndTest'){矩阵{代理人{标签"${PLATFORM}-agent"}当{任何{表达式{params.PLATFORM_过滤器=='全部'}表达式{params.PLATFORM_过滤器== 环境平台}} }轴线{轴心{名称"平台"值"linux"、"windows"、"mac"}轴心{名称"浏览器"值"firefox"、"chrome"、"safari"、"edge"}}排除{