Jenkins Pipeline编码声明式和脚本式的区别_i++

Jenkins是DevOps 技术栈的核心之一,CI/CD 离不开编写 Pipeline 脚本,Jenkins pipeline 分声明式(Declarative)和 脚本式(imperative)。在这里我会对二者的区别进行详细讲解!因为关于pipeline语法的详细内容,官网已经做了详尽地描述,所以在这里我就不在针对基础语法知识进行介绍了,大家可以参考 :

https://www.jenkins.io/doc/book/pipeline/syntax/

声明式Pipline script

声明式pipeline是官方主推的脚本,Pipline script Hello world语法如下:

pipeline {

    agent any

    stages {

        stage('Hello') {

            steps {

                echo 'Hello World'

            }

        }

    }

}

关于声明式Pipeline,结合上述实例,概要介绍如下:

在声明式Pipeline中的基本语句和表达式遵循Groovy的语法;

流水线顶层必须pipeline{};

agent any可以在任何可用的节点上执行pipeline;

stages包含一系列一个或多个 stage 指令, 建议 stages 至少包含一个 stage 指令用于连续交付过程的每个离散部分,比如构建, 测试, 和部署;

steps是每个阶段中要执行的每个步骤。

脚本化Pipeline script

脚本化流水线, 与声明式一样的是, 是建立在底层流水线的子系统上的。与声明式不同的是, 脚本化流水线实际上是由 Groovy构建的通用 DSL 。 Groovy 语言提供的大部分功能都可以用于脚本化流水线的用户。

pipeline {

    agent any

    stages {

        stage('Hello') {

            steps {

                echo 'Hello World'

            }

        }

    }

}

二者的选择

那么为什么两种实现pipeline的方式呢?我们可以简单的了解一下其发展的历史。Jenkins是使用Java实现的,所以在很早的时候就引入了groovy作为DSL,管理员可以使用groovy来实现一些自动化和高级的管理功能。因为groovy引擎已经集成到Jenkins,所以在pipeline一开始很自然就使用groovy来编写Jenkinsfile。但是groovy毕竟是一种语言,对于没有太多编程经验的小白学习成本有些高,这个时候声明式的pipeline就出现了,主要是为了降低入门的难度,二者主要区别如下:

  • 声明式pipeline,官方鼓励声明式编程模型,比较适合没有编程经验的初学者。
  • 脚本式pipeline,是基于groovy的DSL语言实现的,为Jenkins用户提供了大量的灵活性性和可扩展性,如果脚本中有大量的逻辑处理则推荐使用。

个人总结二者的主要区别有两点:

1. 脚本式pipeline只支持stage,像stages 、steps更细致的阶段划分则不支持;

2.当我们需要在脚本中写复杂逻辑的时候,通过脚本式pipeline可以方便的编写脚本,例如需要加入循环的逻辑,使用脚本式pipeline,简单实现如下:

node {

    stage('Hello') {    

       for(int i=0;i<3;i++){
             println i
             println 'Hello World!'

       }
     
    }

}

声明式pipeline 使用循环则需要使用script { for()},代码如下:

pipeline {

    agent any
    stages {

        stage('Hello') {

                steps {

                    script {          

                    for (int i = 0; i < 3; i++) {
                        println i     
                        println 'Hello World'
                      }
                    }

        }

     }

  }

}