使用jenkins管道插件实现动态并行构建的想法

时间:2016-10-21 09:37:32

标签: jenkins jenkins-plugins jenkins-pipeline

我需要并行地为构建运行一组任务,构建的任务是动态的,它可能会改变。我需要一些帮助来实现下面的细节。

我将在xml中动态生成构建的任务详细信息,其中包含必须并行/串行执行哪些任务的信息

示例:

说有一个版本A.

哪个具有以下任务和执行顺序,第一个任务1必须执行下一个任务2,任务3将并行执行,接下来是任务4

任务1
TASK2,TASK3
task4

这些细节将在动态生成的xml中,如何使用管道插件解析该xml并相应地调度任务。我需要一些想法开始。

1 个答案:

答案 0 :(得分:15)

您可以使用Groovy从工作区(readFile)读取文件,然后生成包含不同闭包的地图,类似于以下内容:

parallel(
  task2: {
    node {
      unstash('my-workspace')
      sh('...')
    }
  },
  task3: {
    node {
      unstash('my-workspace')
      sh('...')
    }
  }
}

为了生成这样的数据结构,您只需使用Groovy中的XML解析通过先前读取的文件内容迭代读取的任务数据。

有时候,我昨天发表了关于管道的讨论并包含了非常相似的例子(presentation,幻灯片34ff。)。相反,我从另一个命令输出中读取了“任务”列表。可以找到完整的代码here(我避免在此处粘贴所有这些内容,而是引用此异地资源)。

魔术位的种类如下:

def parallelConverge(ArrayList<String> instanceNames) {
    def parallelNodes = [:]

    for (int i = 0; i < instanceNames.size(); i++) {
        def instanceName = instanceNames.get(i)
        parallelNodes[instanceName] = this.getNodeForInstance(instanceName)
    }

    parallel parallelNodes
}

def Closure getNodeForInstance(String instanceName) {
    return {
        // this node (one per instance) is later executed in parallel
        node {
            // restore workspace
            unstash('my-workspace')

            sh('kitchen test --destroy always ' + instanceName)
        }
    }
}