詹金斯参数化矩阵作业

时间:2013-12-05 19:42:47

标签: matrix jenkins

我正在设置Jenkins作业以对一些c ++代码运行一系列测试。代码是在一个Jenkins工作期间生成的。有许多子项目,其代码位于自己的文件夹中。

我的想法是有一个矩阵作业,每个配置在一个代码文件文件夹上运行测试。虽然有两件事我不确定最好的办法......

  1. 我想设置矩阵作业,以便在添加更多子文件夹时自动获取。将文件夹列表作为参数传递给作业,并将该参数用作作业的轴。

  2. 我希望测试不在特定文件夹上运行,除非父文件中的某些代码被父作业更改。

  3. 现在如何设置此测试是完全开放的 - 我正在寻找创意。如果你曾经设置过这样的东西 - 你是怎么做到的?

1 个答案:

答案 0 :(得分:3)

我有类似的任务 - 运行一个矩阵作业,其中可变数量的文件夹作为一个轴。文件夹处于版本控制状态,但很容易成为工件。我所做的,是创造两个工作,一个主要和正常,另一个奴隶和矩阵。以下是需要在主要作业中以高架groovy运行的代码:

import hudson.model.*
def currentBuild = Thread.currentThread().executable;
def jobName = 'SlaveMatrixJob' // Name of the matrix job to configure
def axisFolders = []
def strings =""

// Get the matrix job
def job = hudson.model.Hudson.instance.getItem(jobName)
assert job != null, "The job $jobName could not be found"

// Check it is a matrix job
assert job.getClass() == hudson.matrix.MatrixProject.class, "The job $jobName is of class '${job.getClass().name}', but expecting 'hudson.matrix.MatrixProject'"

// Get the folders
new File("C:\\Path\\Path").eachDirMatch ~/_test.*/, {it ->
   println "Got folder: ${it.name}"
   axisFolders << it.name
}

// Check if the array is empty
assert !axisFolders.isEmpty(), "No folders found to set in the matrix, aborting"

//Sort them
axisFolders.sort()

// Now set new axis list for test folders
def newAxisList = new hudson.matrix.AxisList()
newAxisList.add(new hudson.matrix.TextAxis('TEST_FOLDERS', axisFolders))
job.setAxes(newAxisList)
println "Matrix Job $jobName new axis list: ${job.getAxes().toString()}"

这基本上是在c:\ path \ path中以 _test 开头,然后将它们插入名为 TEST_FOLDERS <的 SlaveMatrixJob 参数中/强>

我不得不接受两个工作,因为我无法在不安装额外插件的情况下使这个动态更新工作,这在当时是不可能的。

对于第二点,您可以向脚本添加逻辑,以检查自上次构建以来文件夹是否已更新,并跳过那些不是的文件夹。或者你可以搜索一些插件,但我的建议是使用脚本来完成更简单的任务。