Jenkins Pipeline 持续集成

Jenkins Pipeline 持续集成

Pipeline Script 基础

在使用Pipeline之前请确保Jenkins是2.x版本以上,并且安装了Pipeline插件。
Jenkins提供了pipeline方法,作为配置的入口。该方法接受一个闭包,在闭包内定义配置:

pipeline {
  // do some thing 
}

闭包内的方法层级结构:

  • stages
    • stage
      • steps
        • step

一个例子:

pipeline {
    agent any
    stages {
        stage('1. 初始化') {
            steps {
                script {
                    println("Hello")
                }
            }
        }
}

对于上述例子的执行逻辑:
Jenkins关心的一个入口就是pipeline方法,调用的时候执行我们传递给pipeline的闭包。该闭包内包含一段代码,执行时其实就是这闭包的执行过程。对于上面那段配置执行流程为:

  1. 调用agent方法,参数是any
  2. 调用stages方法,参数是个闭包,开始执行闭包
  3. 调用stage传入参数 1. 初始化, 调用后返回的方法还接受闭包。
  4. 执行script的闭包
  5. 向上返回,执行结束
    通过执行过程来看JenkinPipeline的设计非常简单,主要是利用Groovy语言的闭包特性和调用无参方法不需要括号的特性。但是这样设计也有明显的缺点:
  6. 无法直接看出各层的依赖关系。
  7. 配置抽象,Java程序员不容易理解,具有一定的学习成本。
    我们可以将上面的配置改造成类似Java程序的写法:
def myScript = {println("Hello")}
def myScriptInStep = script(myScript)
def mySteps = steps(myScriptInStep)
def initStage = stage('1. 初始化')(mySteps)

def pipelineFunc = {
    agent any
    stages initStage
}
pipeline pipelineFunc

这样写对象之间的关系清楚了,但是没有闭包的那种写法直观。

多分支

Jenkins同样可以对多分支进行处理。它可以同时监控多个分支,并且通过groovy灵活配置。在集成的过程中,有的分支提交代码可能需要测试,通过之后才能合并;有的分支提交代码可能是可以部署了,我们可以根据不同的分支决定持续集成的操作,通过when方法可以设置stage执行的条件:

pipeline{
  stages{
    stage("init"){
      when {
         branch 'dev'// 当代码的分支为dev 执行当前stage
      }
    }
  }
}

创建build时需要配合多分支Pipeline使用,这个特性可以通过Pipeline可视化体现出来。

并行执行

如果测试阶段有多个单元测试,为了提高速度可以将这些单元测试并行执行。
通过Jenkins可以在Stage中创建并行执行的子Stage,并且为这些Stage分配不同的运行节点。

pipeline{
  stages{
    stage("init"){
      parallel{ // 创建并行的子stages
        stage("init 1"){
            // do some thing
        }
        stage("init 2"){
            // do some thing
        }
      }
    }
  }
}

在上述配置的stagesinit 1 init 2 中可以分别执行不同的单元测试,并同时运行达到节省时间的目的,这个优势在单元测试较多时候表现比较明显。

猜你喜欢

转载自www.cnblogs.com/oaks/p/12203439.html