在持续集成的过程中,并行的执行那些没有依赖关系的任务可以缩短整个执行过程。Jenkins 的 pipeline 功能支持我们用代码来配置持续集成的过程。本文将介绍在 Jenkins 中使用声明式 pipeline 语法完成任务的并行执行。

Stage 内的并行执行

在声明式 pipeline 版本 1.2 之前,这是唯一的并行方式,我们看一下代码的写法:

stage('run-parallel') {
steps {
parallel(
a: {
echo "task 1"
},
b: {
echo "task 2"
}
)
}
}

在同一个 stage 内部,我们可以并行的执行多个 step。代码中的 step a 和 b 会在同一台 agent 上并行执行。但是我们可以看到,这种并行执行的方式具有很大的局限性。首先因为 agent 只能在 stage 上设置,所以这种方式不能在不同的 agent 上执行并行的任务。其次并行执行的粒度为 step 级别,执行点小任务还行,但这样的粒度对设计持续集成的流程来说明显过小。所以,我们急需的是 stage 级别的并行执行能力。

Stage 级别的并行执行

在刚刚发布的声明式 pipeline 版本 1.2中,Jenkins 终于开始支持 stage 级别的并行执行:

稍微有一点要求是你的 Jenkins 的版本要大于 2.7:

下面的实例代码描述了如何执行 stage 级别的并行任务:

pipeline {
agent any
stages {
stage('Stage1') {
agent { label "test1" }
steps {
timestamps {
echo '这是第一个被执行的 stage.'
sleep
}
}
}
stage('并行执行的 Stage') {
parallel {
stage('Stage2.1') {
agent { label "test2" }
steps {
timestamps {
echo "在 agent test2 上执行的并行任务 1."
sleep
echo "在 agent test2 上执行的并行任务 1 结束."
}
}
}
stage('Stage2.2') {
agent { label "test3" }
steps {
timestamps {
echo "在 agent test3 上执行的并行任务 2."
sleep
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 {} 块中的命令都会在日志中显示执行时间。好了,现在执行上面的配置,然后查看执行日志:

从日志中可看到,Stage.21 和 Stage2.2 中的任务在执行时间上是重叠的,并且运行它们的 agent 也不一样。

总结

Stage 级别的并行任务处理是非常有用的功能,尤其是在我们设计持续集成的流程时。让一些可以并行的任务(比如不同平台上的自动测试)同时执行可以明显缩短整个过程耗费的时间,从而提升持续执行的效能。

最新文章

  1. Android打开WIFI或者移动网络的代码实现
  2. angularjs-ngModel传值问题
  3. ThinkPHP框架下基于RBAC的权限控制模式详解
  4. Java-String.intern的深入研究
  5. dsd
  6. python 用正则处理日志实例
  7. 简单gulp.js
  8. permutohedral lattice理解
  9. 剑指offer编程题Java实现——面试题14调整数组顺序使奇数位于偶数之前
  10. CentOS 使用SMB服务 让windows能够上传文件
  11. 2019.01.20 NOIP模拟 迅雷(kruskal/二分+并查集)
  12. C语言面试题5
  13. Redis高级特性---------事务与持久化与发布订阅
  14. Nginx-------Nginx的安装和多域名配置
  15. 《Javascript启示录》要点汇总
  16. 【Android】3.14 公交线路查询功能
  17. 没的选择时,存在就是合理的::与李旭科书法字QQ聊天记录
  18. 你应该知道的PHP库
  19. 三十分钟理解:线性插值,双线性插值Bilinear Interpolation算法
  20. window cmd 自动补全

热门文章

  1. 如何使用 Weave 网络?- 每天5分钟玩转 Docker 容器技术(63)
  2. docker 添加国内源
  3. JSON 理解
  4. RESTful学习记录
  5. 49、html基础认识&常用标签(1)
  6. c# DateTime 类
  7. Spring MVC 解决无法访问静态文件和"全局异常处理"
  8. dreamweaver代码提示失效
  9. 软工+C(2017第3期) 超链接
  10. 201521123097《Java程序设计》第四周学习总结