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'
}
}
}
}
}
}