Jenkins pipeline jenkinsfile的两种写作方式,声明式和脚本式。

为什么需要pipeline?

在多年前Jenkins成为最流行的持续集成服务器的Jenkins 1.x时代,所有的新功能都是通过安装插件来增强,所有的配置都是通过网页界面来实现的。

在Jenkins迈入2.x的时代,为了跟随时代的步伐(everything is code),Jenkins引入了配置及代码的概念。用代码来表示流程是为了版本控制和自动化的方便,使得配置跟源代码一样可重现,更加容易地支持多分支开发部署。 具体地来说,就是Jenkins引入了pipeline的概念,可以使用groovy来编写Jenkinsfile。

为什么两种实现pipeline的方式呢?

真的是看戏的不嫌事大,同一功能两种实现,很多用户也会被搞迷吧。下面咱们就来捋一捋这个发展过程。

Jenkins是使用Java实现的,所以在很早的时候就引入了groovy作为DSL,管理员可以使用groovy来实现一些自动化和高级的管理功能。因为groovy引擎已经集成到Jenkins,所以在pipeline一开始很自然就使用groovy来编写Jenkinsfile。

但是groovy毕竟是一种语言,对于没有太多编程经验的小白这个学习曲线有点太陡峭。这个时候声明式的pipeline就出现了,主要是为了降低入门的难度。

作为Jenkins用户该如何选择呢?

  • 声明式pipeline鼓励声明式编程模型,比较适合没有编程经验的初学者。
  • 脚本式pipeline,是基于groovy的DSL语言实现的,为Jenkins用户提供了大量的灵活性性和可扩展性。
  • 声明式pipeline会得到越来越多的官方支持,可以使用Visual Pipeline Editor来编辑和验证声明式pipeline。
  • 如果实在是声明式语法还没有支持的功能,还可以在声明式里直接调用脚本。

所以推荐新手从声明式pipeline开始。

声明式pipeline:

https://jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline

脚本式pipeline:

https://jenkins.io/doc/book/pipeline/syntax/#scripted-pipeline

下面我们分别来个例子来初步感受下,看看你更喜欢哪种?

声明式pipeline

pipeline {
agent any
stages {
stage('Example Build') {
steps {
echo 'Hello World'
}
}
stage('Example Deploy') {
when {
branch 'production'
environment name: 'DEPLOY_TO', value: 'production'
}
steps {
echo 'Deploying'
}
}
}
}

脚本式pipeline

node {
stage('Example') {
if (env.BRANCH_NAME == 'master') {
echo 'I only execute on the master branch'
} else {
echo 'I execute elsewhere'
}
}
}

声明式pipeline里调用脚本式语法

pipeline {
agent any
stages {
stage('Example') {
steps {
echo 'Hello World' script {
def browsers = ['chrome', 'firefox']
for (int i = 0; i < browsers.size(); ++i) {
echo "Testing the ${browsers[i]} browser"
}
}
}
}
}
}

参考:

https://stackoverflow.com/questions/43484979/jenkins-scripted-pipeline-or-declarative-pipeline

https://medium.com/@brianrthompson/scripted-vs-declarative-pipelines-which-to-choose-c6af403f1e97

Jenkins pipeline jenkinsfile的两种写作方式声明式和脚本式的更多相关文章

  1. jenkins pipeline的声明式与脚本式

    自从Jenkins 2.0 版本升级之后,支持了通过代码(Groovy DSL)来描述一个构建流水线,灵活方便地实现持续交付,大大提升 Jenkins Job 维护的效率,实现从 CI 到 CD 到转 ...

  2. PyCharm上unittest 测试用例两种执行方式

    每次讲到unittest测试框架的时候,经常有同学在群里反映,为啥我的运行不是按照我往suite里添加的用例顺序执行的,为什么别人的能跑出来报告,我的就不行... 当然,首先确认代码是OK的,如果代码 ...

  3. Web APi之认证(Authentication)两种实现方式【二】(十三)

    前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再叙述废话. 序言 对于所谓的认证说到底 ...

  4. Android中BroadcastReceiver的两种注册方式(静态和动态)详解

    今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式. BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来 ...

  5. Android中Fragment与Activity之间的交互(两种实现方式)

    (未给Fragment的布局设置BackGound) 之前关于Android中Fragment的概念以及创建方式,我专门写了一篇博文<Android中Fragment的两种创建方式>,就如 ...

  6. JavaScript 函数的两种声明方式

    1.函数声明的方式 JavaScript声明函数有两种选择:函数声明法,表达式定义法. 函数声明法 function sum (num1 ,num2){ return num1+num2 } 表达式定 ...

  7. Redis两种持久化方式(RDB&AOF)

    爬虫和转载请注明原文地址;博客园蜗牛:http://www.cnblogs.com/tdws/p/5754706.html Redis所需内存 超过可用内存怎么办 Redis修改数据多线程并发—Red ...

  8. struts2+spring的两种整合方式

    也许有些人会因为学习了struts1,会以为struts2.struts1与spring的整合也是一样的,其实这两者相差甚远.下面就来讲解一下struts2与spring的整合两种方案.(部分转载,里 ...

  9. easyui datagride 两种查询方式

    easyui datagride 两种查询方式function doReseach() { //$('#tt').datagrid('load', { // FixedCompany: $('.c_s ...

  10. 【Visual Lisp】两种出错处理方式

    两种出错处理方式:一种是对出错函数进行重定义,一种是对错误进行捕捉处理. ;;============================================================= ...

随机推荐

  1. UWP ManipulationStarted 移动图片或控件不要滑出父容器的判断

    假设自定义一个用户控件用以在父容器Grid里拖动/移动: <UserControl x:Class="App6.Pic" xmlns="http://schemas ...

  2. Oracle trunc的使用

    在生产环境中我们经常会用到只取年月日或者时间处理的场景,大多数人用的都是to_char(string,'yyyy-mm-dd')或者to_date(string,'yyyy-mm-dd')来处理,不说 ...

  3. oracle开启了审计功能,导致sysaux表空间满的问题

    查询是否开启审计功能 SQL> show parameter audit 如下图所示: AUDIT_TRAIL参数用于指定数据库审计跟踪信息的记录方式.它接受三个可能的参数:NONE,DB,OS ...

  4. mount命令及挂载本地yum源

    mount命令 mount [-t vfstype] [-o options] device dir 其中: 1.-t vfstype 指定文件系统的类型,通常不必指定.mount 会自动选择正确的类 ...

  5. Docker启动Nginx

    Docker启动Nginx 搜索镜像 docker search nginx 拉取镜像 这里拉取的官方镜像 docker pull nginx 创建挂载目录 将nginx的文件都放在/opt/ngin ...

  6. datawhale-大模型攻防比赛实践-第一次行动

    最近刚好是在写智能信息安全的教程,最后一章准备讲内容安全,里面有一节探讨大模型安全的内容,刚好可以拿比赛的内容当案例. 首先,可以通过modelscope平台获得GPU使用权限.然后你就可以跑base ...

  7. 如何在啥也不懂的情况下将你的公众号接入DeepSeek或其它大模型

    如何在啥也不懂的情况下将你的公众号接入DeepSeek或其它大模型 前言 最近国产大模型的"顶流"DeepSeek可谓是红得发紫,朋友圈刷屏的AI神回复.公众号爆款推文,都少不了它 ...

  8. 源码方式本地化部署deepseek和量化

    前置条件 1.python环境,安装教程:https://www.python.org/downloads/2.wsl环境(Windows系统),安装教程:https://learn.microsof ...

  9. 使用vscode开发微信小程序

    1. 安装插件 2. 文件-打开文件夹-将新建的微信小程序导入,代码会有高亮的效果 3. 编辑内容,查看效果,如果有就说明插件引入成功.

  10. 基于Microsoft.Extensions.VectorData实现语义搜索

    大家好,我是Edison. 上周水了一篇 Microsoft.Extensions.AI 的介绍文章,很多读者反馈想要了解更多.很多时候,除了集成LLM实现聊天对话,还会有很多语义搜索和RAG的使用场 ...