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. WPF BitmapSource /BitmapImage 获取像素点颜色

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. linux-杂项

    1.常用基础 防火墙systemctl status firewalldsystemctl stop firewalldsystemctl start firewalld find / -size + ...

  3. 盘点!HelloGitHub 年度热门开源项目

    春节将至,HelloGitHub 也迎来了年终盘点时刻.这是一份送给开源爱好者的"年终盛宴",期待你在这里发现更多值得关注的开源佳作. 为了满足不同读者的需求,我精心准备了这期超长 ...

  4. LeetCode刷题:runtime error: reference binding to null pointer of type 'int' (stl_vector.h)报错请教

    题目:https://leetcode.cn/problems/merge-intervals/ 错误代码: // 思路初探:做了很多道类似区间操作的题目了.本题就是尽可能少的创建新区间 // 1.首 ...

  5. 单用户模式启动 CentOS/RHEL 7/8 的三种方法

    单用户模式启动 CentOS/RHEL 7/8 的三种方法   单用户模式,也被称为维护模式,超级用户可以在此模式下恢复/修复系统问题. 通常情况下,这类问题在多用户环境中修复不了.系统可以启动但功能 ...

  6. 闲话 6.30 -JL 引理

    参考了 https://spaces.ac.cn/archives/8679/comment-page-1,有一些增删. JL 引理 首先下面需要应用马尔可夫不等式的另一个形式: \[\newcomm ...

  7. 降阶公式/ARC173F

    ARC173F 题意 给定 \(n,A,B\),初始有一个集合 \(S=\{1,2,\dots,A,A +1,A+2,\dots,A+B\}\).进行如下操作 \(n-1\) 次使得剩下 \(n\) ...

  8. Aspire+扣子智能体实现AI自动CodeReview

    一.引言 Code Review在软件开发中扮演着至关重要的角色,它不仅能够提升代码质量,确保代码的可维护性和一致性,还能促进团队成员之间的知识共享和技术提升. 传统的代码审查过程面临着诸多挑战和局限 ...

  9. 15. Docker容器监控之(CAdvisor+InfluxDB+Granfana)的详细安装和常规使用

    15. Docker容器监控之(CAdvisor+InfluxDB+Granfana)的详细安装和常规使用 @ 目录 15. Docker容器监控之(CAdvisor+InfluxDB+Granfan ...

  10. mangoDB操作指令

    studio 3T 更新或插入字段: db.getCollection("data_379129").update({},{$set: {'connectedStatus':Num ...