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

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 语言提供的大部分功能都可以用于脚本化流水线的用户。

node {

   stage('Hello') {

           echo 'Hello World!'

    }

}

脚本化pipeline 顶层是node{};

支持stage;

可以直接使用groovy语言进行编码

二者的选择

那么为什么两种实现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'

                      }

                   }

       }

    }

  }

}

你可能感兴趣的:(Jenkins Pipeline编码声明式和脚本式的区别)