99

Jenkins 在声明式 pipeline 中并行执行任务 - sparkdev

 6 years ago
source link: http://www.cnblogs.com/sparkdev/p/7617765.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK