zoukankan      html  css  js  c++  java
  • Jenkins 在声明式 pipeline 中并行执行任务

    在持续集成的过程中,并行的执行那些没有依赖关系的任务可以缩短整个执行过程。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 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 {} 块中的命令都会在日志中显示执行时间。好了,现在执行上面的配置,然后查看执行日志:

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

    总结

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

  • 相关阅读:
    maven junit.framework不存在问题解决
    maven项目在打war包时出现非法字符: 'ufeff' 解决方案
    如何隐藏tomcat命令窗口
    小程序如何生成开发版的带参二维码
    小程序码生成随记
    生活中的一些笔记
    存储过程
    项目出现 The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path 解决方法
    maven环境配置详解,及maven项目的搭建及maven项目聚合
    sqldeveloper和plsqldebeloper
  • 原文地址:https://www.cnblogs.com/sparkdev/p/7617765.html
Copyright © 2011-2022 走看看