如果您阅读此博客文章,则很有可能正在寻找有关脚本化和声明性管道之间的实际差异的信息,对吗?那你找不到更好的地方了。我将向您展示这两者之间的四个最实际的区别。和我待几分钟,享受旅程!

为什么要有两种管道类型?

脚本化管道是Jenkins中作为代码的管道的第一个实现。即使它使用底层的管道子系统,它还是或多或少地设计为使用Groovy构建的通用DSL。这意味着它不具有固定的结构,并且由您决定如何定义管道逻辑。

声明性管道更自以为是,其结构是明确定义的。可能看起来有些局限。

但实际上,您可以使用脚本化或声明性管道来实现相同的目的。那么选择哪一个呢?如果您问我这个问题,我会说使用声明性管道。以下内容这就是为什么。

1.管道启动时的代码验证

pipeline {

agent any

stages {

stage("Build") {

steps {

echo "Some code compilation here..."

}

}

stage("Test") {

steps {

echo "Some tests execution here..."

echo 1

}

}

}

}

如果我们尝试运行以下管道,则验证将很快使构建失败。该日志显示只能与触发String参数,所以我们得到这样的错误。

请注意,管道没有执行任何阶段,只是失败了。这可能为我们节省了很多时间-想象一下执行Build阶段几分钟,而只是获取echo步骤希望得到的信息java.lang.String而不是java.lang.Integer。

现在,让我们看一下与该示例等效的脚本管道。

node {

stage("Build") {

echo "Some code compilation here..."

}

stage("Test") {

echo "Some tests execution here..."

echo 1

}

}

该管道执行相同的阶段和相同的步骤。但是,有一个明显的区别。让我们执行它,看看它产生什么结果。

它按预期失败。但是这次是执行Build阶段,也是Test阶段的第一步。如您所见,没有验证管道代码。在这种情况下,声明式管道可以更好地处理此类用例。

2.从指定步骤重新开始

声明式管道具有的另一个很酷的功能是“从阶段重新启动”。让我们修复上一个示例中的管道,看看是否只能重新启动Test阶段。

pipeline {

agent any

stages {

stage("Build") {

steps {

echo "Some code compilation here..."

}

}

stage("Test") {

steps {

echo "Some tests execution here..."

}

}

}

}

让我们执行它。

在这里您可以看到已选择测试阶段。在右侧的步骤列表上方,有一个名为“重新启动测试”的选项。让我们单击它并查看结果。

如您所见,Jenkins跳过了Build阶段(它使用了先前构建中的工作空间),并从Test阶段开始了下一个管道执行。当您执行一些外部测试并且由于远程环境的某些问题而导致测试失败时,这可能会很有用。您可以使用测试环境解决问题,然后重新运行该阶段,而无需重建所有工件。(在这种情况下,应用程序的代码未更改。)

现在,让我们看一下脚本化管道示例。

node {

stage("Build") {

echo "Some code compilation here..."

}

stage("Test") {

echo "Some tests execution here..."

}

}

如您所见,没有重新启动选项。声明式管道与脚本式管道-2:0。

3.声明式管道options块

两种管道类型都支持第三个功能,但是我认为声明性管道更好地处理了它。假设我们将以下功能添加到上一个管道中。

控制台日志中的时间戳。

ANSI颜色输出。

在1分钟的超时构建阶段,2分钟超时的测试阶段。

声明式管道如下所示。

pipeline {

agent any

options {

timestamps()

ansiColor("xterm")

}

stages {

stage("Build") {

options {

timeout(time: 1, unit:"MINUTES")

}

steps {

sh 'printf "\\e[31mSome code compilation here...\\e[0m\\n"'

}

}

stage("Test") {

options {

timeout(time: 2, unit:"MINUTES")

}

steps {

sh 'printf "\\e[31mSome tests execution here...\\e[0m\\n"'

}

}

}

}

让我们运行它。

这是控制台日志。

StartedbyuserSzymon Stepniak

Running inDurabilitylevel: MAX_SURVIVABILITY

[Pipeline] Start ofPipeline

[Pipeline] node

Running onJenkinsin/home/wololock/.jenkins/workspace/pipeline-sandbox

[Pipeline] {

[Pipeline] timestamps

[Pipeline] {

[Pipeline] ansiColor

[Pipeline] {

[Pipeline] stage

[Pipeline] { (Build)

[Pipeline] timeout

15:10:04  Timeout settoexpirein1min0 sec

[Pipeline] {

[Pipeline] sh

15:10:04  + printf '\e[31mSome code compilation here...\e[0m\n'

15:10:04  Somecode compilation here...

[Pipeline] }

[Pipeline] // timeout

[Pipeline] }

[Pipeline] // stage

[Pipeline] stage

[Pipeline] { (Test)

[Pipeline] timeout

15:10:04  Timeout settoexpirein2min0 sec

[Pipeline] {

[Pipeline] sh

15:10:05  + printf '\e[31mSome tests execution here...\e[0m\n'

15:10:05  Sometests execution here...

[Pipeline] }

[Pipeline] // timeout

[Pipeline] }

[Pipeline] // stage

[Pipeline] }

[Pipeline] // ansiColor

[Pipeline] }

[Pipeline] // timestamps

[Pipeline] }

[Pipeline] // node

[Pipeline] EndofPipeline

Finished: SUCCESS

在声明性管道中,选项与管道脚本逻辑分开。该脚本管道也支持timestamps,ansiColor和timeout选项,但它需要一个不同的代码。这是使用脚本化管道表达的相同管道。

node {

timestamps {

ansiColor("xterm") {

stage("Build") {

timeout(time: 1, unit:"MINUTES") {

sh 'printf "\\e[31mSome code compilation here...\\e[0m\\n"'

}

}

stage("Test") {

timeout(time: 2, unit:"MINUTES") {

sh 'printf "\\e[31mSome tests execution here...\\e[0m\\n"'

}

}

}

}

}

我想你看到了问题。在这里,我们仅使用timestamps和ansiColorJenkins插件。想象再添加一个或两个插件。声明式与脚本式,3:0。

4.用when块跳过阶段。

在此博客文章中我最后要提到的是when声明性管道支持的块。让我们改进前面的示例并添加以下条件:

仅在等于时执行测试阶段。env.FOO``bar

这是声明性管道代码的外观。

pipeline {

agent any

options {

timestamps()

ansiColor("xterm")

}

stages {

stage("Build") {

options {

timeout(time: 1, unit:"MINUTES")

}

steps {

sh 'printf "\\e[31mSome code compilation here...\\e[0m\\n"'

}

}

stage("Test") {

when{

environment name:"FOO", value:"bar"

}

options {

timeout(time: 2, unit:"MINUTES")

}

steps {

sh 'printf "\\e[31mSome tests execution here...\\e[0m\\n"'

}

}

}

}

然后执行它。

该测试如预期阶段被跳过。现在,让我们尝试在脚本化管道示例中执行相同的操作。

node {

timestamps {

ansiColor("xterm") {

stage("Build") {

timeout(time: 1, unit:"MINUTES") {

sh 'printf "\\e[31mSome code compilation here...\\e[0m\\n"'

}

}

if (env.FOO == "bar") {

stage("Test") {

timeout(time: 2, unit:"MINUTES") {

sh 'printf "\\e[31mSome tests execution here...\\e[0m\\n"'

}

}

}

}

}

}

如您所见,我们必须使用if-condition来检查是否env.FOO等于bar,然后才添加Test阶段。(不幸的是,这并不是真正的跳过。)让我们运行它,看看结果如何。

这是不同的结果。在脚本化管道用例中,甚至不会呈现“ 测试”阶段。在我看来,这可能会带来一些不必要的混乱,声明性管道会更好地处理它。声明式与脚本式,4:0。

结论

这是我在声明性和脚本化Jenkins管道之间的四大区别。这些不是唯一的区别,我想您的列表可能看起来有些不同。你的选择是什么?您更喜欢声明性管道还是脚本化管道?

【编辑推荐】

【责任编辑:姜华 TEL:(010)68476606】

点赞 0

pipeline和java的区别_总结:四个Pipeline脚本式与声明式语法差异相关推荐

  1. c和java的区别_论C语言和Java的区别

    原标题: 论C语言和Java的区别 在计算机的发展史上,出现过几百种编程语言,经过多年的发展,留下来的编程语言里面,历史最悠久的是最基础的C 语言,最流行的是Java,发展势头最好的是Python·· ...

  2. java swing事件_第四节 Java Swing事件处理

    第四节:事件处理 一个图形界面完的成只是程序开发中起步的工作,因为要想让每一个组件都发挥其作用,就必须对所有的组件进行事件处理.那么什么是事件处理,所谓事件就表示一个对象发生状态变化.例如,每当按下一 ...

  3. it跟java的区别_详细介绍JAVA和C++区别

    JAVA和C++都是面向对象语言.也就是说,它们都能够实现面向对象思想(封装,继乘,多态).而由于c++为了照顾大量的C语言使用者,而兼容了C,使得自身仅仅成为了带类的C语言,多多少少影响了其面向对象 ...

  4. python web和java web区别_成都汇智动力-谈谈个人认为的JavaWeb开发与PythonWeb开发的区别...

    原标题:成都汇智动力-谈谈个人认为的JavaWeb开发与PythonWeb开发的区别 今天这篇文章谈一谈Java Web开发和Python Web开发的区别.在这里我并不是鼓励大家从Java Web转 ...

  5. erp开发和java开发区别_【成都】斯达领科 | 招聘高级Java工程师、ERP产品经理,期待你的加入!...

    成都IT内推圈成立于2016年,专注成都IT互联网领域的招聘与求职;覆盖精准IT人群10W+,通过内推圈推荐且已入职人数超过5000+,合作公司均系成都知名或靠谱公司.此公众号每天7:30AM准时推送 ...

  6. php和nodejs和java的区别_讨论PHP和Node.js开发之间有什么区别

    在很长一段时刻内,决定在Node.js和PHP之间进行挑选是一件很费事的工作,但关于后端程序员来说,这一直很费事,但它从未影响过开发人员.可是工作很快就发生了改变,现在开发人员有必要挑选其中之一.No ...

  7. java parameters用法_(四)Parameters,简单参数就用这个

    Parameters注解在测试方法上指定参数列表,然后在测试方法中声明对应的形参,形参与参数列表一一对应,但名字可以不同,如下所示: public class Test1 { @Parameters( ...

  8. as400和java的区别_文件传输协议和AS400

    我目前收到以下错误: 远程服务器返回错误:(501)参数或参数中的语法错误 . 我已经检查了服务器并且文件确实存在,如果我打开命令提示符并键入以下代码它可以工作: ftp open 192.168.1 ...

  9. java 自适应屏幕_自适应屏幕的CSS响应式布局设计技巧总结

    摘要:这篇CSS教程栏目下的"自适应屏幕的CSS响应式布局设计技巧总结",介绍的技术点是"css响应式.响应式布局.响应式.自适应.CSS.设计",希望对大家开 ...

最新文章

  1. 图像分割2020总结:结构,损失函数,数据集和框架
  2. Linux下独立添加PHP扩展模块 mssql
  3. SQL Server 监控统计阻塞脚本信息
  4. 安装win7时,无法创建新的分区系统和无法定位现有分区系统
  5. java导入导出excel_Java导入导出Excel工具 easyexcel
  6. 功夫小子实践开发-Menu家族学习及开始菜单场景的实现
  7. 手机写代码 termux
  8. web压力测试工具介绍
  9. 圣诞帽php,微信小程序“圣诞帽”的实现方法
  10. 明源售楼系统技术解析—MVC架构
  11. java最后冲刺2个月校招了(XB的指导)
  12. 一个程序员是如何蜕变为投资人的?
  13. 简智音科技:抖音与快手相比,谁的前景更好?
  14. 自动化运维之自动化监控
  15. 【自动驾驶】碰撞检测算法
  16. 5G 帧结构、物理资源与物理信道
  17. html5怎么做相册影集,照片制作视频软件|狸窝照片制作视频软件 如何用照片制作视频...
  18. springboot项目配置yml中数据源后报错Unknown database user_information(已解决)
  19. Ajax提交post请求返回404错误
  20. Hibernate中ManyToOne删除Many的一方出现 deleted object would be re-saved by cascade

热门文章

  1. MegEngine计算图、MatMul优化解析
  2. MindSpore应用目标
  3. 2020年Yann Lecun深度学习笔记(上)
  4. 深入理解Nginx工作原理
  5. ExampleUnitTest的用法
  6. 025_Excel知识汇总
  7. 如何更优雅地对接第三方API
  8. 【云安全与同态加密_调研分析(3)】国内云安全组织及标准——By Me
  9. 理解Faster R-CNN
  10. 06章 映射一对多双向关联关系、以及cascade、inverse属性