在持续集成的过程当中,并行的执行那些没有依赖关系的任务能够缩短整个执行过程。Jenkins 的 pipeline 功能支持咱们用代码来配置持续集成的过程。本文将介绍在 Jenkins 中使用声明式 pipeline 语法完成任务的并行执行。测试
在声明式 pipeline 版本 1.2 以前,这是惟一的并行方式,咱们看一下代码的写法:spa
stage('run-parallel') { steps { parallel( a: { echo "task 1" }, b: { echo "task 2" } ) } }
在同一个 stage 内部,咱们能够并行的执行多个 step。代码中的 step a 和 b 会在同一台 agent 上并行执行。可是咱们能够看到,这种并行执行的方式具备很大的局限性。首先由于 agent 只能在 stage 上设置,因此这种方式不能在不一样的 agent 上执行并行的任务。其次并行执行的粒度为 step 级别,执行点小任务还行,但这样的粒度对设计持续集成的流程来讲明显太小。因此,咱们急需的是 stage 级别的并行执行能力。插件
在刚刚发布的声明式 pipeline 版本 1.2中,Jenkins 终于开始支持 stage 级别的并行执行:设计
稍微有一点要求是你的 Jenkins 的版本要大于 2.7:3d
下面的实例代码描述了如何执行 stage 级别的并行任务:日志
pipeline { agent any stages { stage('Stage1') { agent { label "test1" } steps { timestamps { echo '这是第一个被执行的 stage.' sleep 5 } } } stage('并行执行的 Stage') { parallel { stage('Stage2.1') { agent { label "test2" } steps { timestamps { echo "在 agent test2 上执行的并行任务 1." sleep 5 echo "在 agent test2 上执行的并行任务 1 结束." } } } stage('Stage2.2') { agent { label "test3" } steps { timestamps { echo "在 agent test3 上执行的并行任务 2." sleep 10 echo "在 agent test3 上执行的并行任务 2 结束." } } } } } stage('Stage3') { agent { label "test1" } steps { timestamps { echo '这是最后一个被执行的 stage.' } } } } }
上面的代码描述的执行顺序是 Stage1, 并行执行的 Stage 和 Stage3。其中并行执行的 Stage 包含两个并行执行的子 Stage,分别是 Stage2.1 和 Stage2.2,而且这两个 Stage 被指定到了不一样的 agent。为了可以在日志中显示步骤执行的时间,咱们使用了 Timestamper 插件。全部在 timestamps {} 块中的命令都会在日志中显示执行时间。好了,如今执行上面的配置,而后查看执行日志:code
从日志中可看到,Stage.21 和 Stage2.2 中的任务在执行时间上是重叠的,而且运行它们的 agent 也不同。blog
Stage 级别的并行任务处理是很是有用的功能,尤为是在咱们设计持续集成的流程时。让一些能够并行的任务(好比不一样平台上的自动测试)同时执行能够明显缩短整个过程耗费的时间,从而提高持续执行的效能。ip