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

Jenkins 在声明式 pipeline 中并行执行任务的更多相关文章

  1. Spring -12 -声明式事务及完整的XML配置文件信息 -声明式事务中的相关属性(tx:advice的标签)

    1.编程式事务: 1.1由程序员编程事务控制代码. 1.2OpenSessionInView 就属于编程式事务: session.commit()和rollback() 2.声明式事务: 2.1事务控 ...

  2. mysql事务管理及spring声明式事务中主动异常抛出使数据库回滚

    mysql的引擎常用的有两个,一个MyISAM,另一个是InnoDB,mysql默认的为MyISAM,而InnoDB才是支持事务的.所以一般需要修改下,如何修改就不说了. 事务需要依赖数据库,好久没使 ...

  3. spring 声明式事务中try catch捕获异常

    原文:http://heroliuxun.iteye.com/blog/848122 今天遇到了一个这个问题 最近遇到这样的问题,使用spring时,在业务层需要捕获异常(特殊需要),当前一般情况下不 ...

  4. Jenkins pipeline声明式语法

    目录 一.最简结构 二.简单例子 一.最简结构 pipeline {     agent any     stages {         stage('pull') {             st ...

  5. 7.Jenkins进阶之流水线pipeline语法入门学习(2)

    目录一览: (2) Declarative Pipeline Syntax 2.1) Sections - 章节 2.2) Directives - 指令 2.3) Sequential Stages ...

  6. 6.Jenkins进阶之流水线pipeline语法入门学习(1)

    目录一览: 0x00 前言简述 Pipeline 介绍 Pipeline 基础知识 Pipeline 扩展共享库 BlueOcean 介绍 0x01 Pipeline Syntax (0) Groov ...

  7. devops-2:Jenkins的使用及Pipeline语法讲解

    DevOps-Jenkins Jenkins简介 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续 ...

  8. Spring声明式事务不回滚问题

    疑问,确实像往常一样在service上添加了注解 @Transactional,为什么查询数据库时还是发现有数据不一致的情况,想想肯定是事务没起作用,出现异常的时候数据没有回滚.于是就对相关代码进行了 ...

  9. jenkins pipeline的声明式与脚本式

    自从Jenkins 2.0 版本升级之后,支持了通过代码(Groovy DSL)来描述一个构建流水线,灵活方便地实现持续交付,大大提升 Jenkins Job 维护的效率,实现从 CI 到 CD 到转 ...

随机推荐

  1. SQL分组查询

      把数据分成多个逻辑组,以便能对每个组的数据进行操作,对每个组进行聚集计算. 1.创建分组 分组是在SELECT语句的GROUP BY子句中建立的 例子:         SELECT vendId ...

  2. java多线程知识点概述

    这里只起一个概述的作用,极其简单的列一下知识点,需要在脑海中过一下,如果哪些方面不熟悉的话,建议利用网络资源去学习. 1.线程.进程概念 概念 线程状态及其转换 2.死锁.预防.解决 3.jdk线程实 ...

  3. Mysql 数据库date, datetime类型设置0000-00-00默认值(default)报错问题

    Mysql 数据库date, datetime类型设置0000-00-00默认值报错问题 现象:MySQL5.7版本之后,date, datetime类型设置默认值"0000-00-00&q ...

  4. H5页面中尝试调起APP

    安卓版本5.0以上 IOS版本10.0以上 采用事件触发的方式处理唤醒APP 市面上常见的功能 这种功能现如今应该非常普遍了,淘宝H5,知乎H5等等... 点击后会调起APP或者打开下载页面或者直接进 ...

  5. chrome开发工具指南(十三)

    模拟传感器:地理定位与加速度计 由于大多数桌面设备都没有 GPS 芯片和加速度计,所以测试它们比较困难.Chrome DevTools 的 Sensors 模拟窗格可以通过模拟常见的移动设备传感器来降 ...

  6. WAF防火墙介绍

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt187 在互联网应用高速发展的同时,承载Web信息系统的Web服务器也面临着巨 ...

  7. HashMap 底层算法分析

    详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp72 Hash算法HashMap使用Hash算法,所以在解剖HashMap ...

  8. main方法快速编辑日历

    public static void main(String[] args) { Scanner input=new Scanner (System.in); System.out.println(& ...

  9. 即时作图新工具—ProcessOn【推荐】…

    www.processon.com 推荐这个在线作图网站:免费登录,云端存储,面向对象,最重要的是提供了丰富模板! 在线软件的人气会越来越高,这是趋势啊~

  10. 转:【Java并发编程】之一:可重入内置锁

    每个Java对象都可以用做一个实现同步的锁,这些锁被称为内置锁或监视器锁.线程在进入同步代码块之前会自动获取锁,并且在退出同步代码块时会自动释放锁.获得内置锁的唯一途径就是进入由这个锁保护的同步代码块 ...