美文网首页Devops开发
Jenkins Pipeline编码声明式和脚本式的区别

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

作者: 测试开发Kevin | 来源:发表于2021-09-23 13:45 被阅读0次

    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编码声明式和脚本式的区别

        本文链接:https://www.haomeiwen.com/subject/boxogltx.html