jenkins 原理篇——pipeline流水线 声明式语法详解

news2024/11/8 3:16:32

大家好,我是蓝胖子,相信大家平时项目中或多或少都有用到jenkins,它的piepeline模式能够对项目的发布流程进行编排,优化部署效率,减少错误的发生,如何去写一个pipeline脚本呢,今天我们就来简单看看pipeline的语法。

先拿一个hello world的pipeline脚本举例,我们来看看pipeline脚本的组成

pipeline {
    agent any

    stages {
        stage('Hello') {
            steps {
                echo 'Hello World'
            }
        }
    }
}

脚本都是以pipeline的关键字开头,接着看下pipeline内部具体由哪几部分组成。

agent

agent 部分指明了pipeline脚本在哪台机器或者容器内执行,因为jenkins的工作模式是master-agent模式,master可以把流水线任务的执行放到其代理节点上执行。

同时jenkins的节点(master节点或者agent代理节点)可以打上标签,如下表示的是pipeline脚本需要在标签为jdk8的节点上运行。

pipeline {
    agent {
	    node {label:'jdk8'}
    }

    stages {
        stage('Hello') {
            steps {
                echo 'Hello World'
            }
        }
    }
}

agent模块也可以写到stage里,表示特定stage模块都在指定的agent节点上运行,如下所示,

pipeline {
   agent any
    stages {
        stage('Hello') {
             agent {
	    node {label:'jdk8'}
		    }
            steps {
                echo 'Hello World'
            }
        }
    }
}

在文章开头的hello world的脚本中,agent我们指定了any,这表示可以在任意节点上运行pipeline脚本。agent模块不可省略不写。

stages

接着来看下stages模块,stages模块由多个stage组成,一个stage表示一个阶段,比如我们通常将发布的整个流程分为编译,传输,部署等几个阶段。

stage

一个阶段由多个步骤组成,在pipeline语法中,步骤通过steps模块表示,steps包含了一个或多个步骤,在上述hello world的pipeline脚本中,echo ‘Hello World’ 就是一个步骤,比如我们想要执行shell命令就要运行sh步骤,如下所示,

pipeline {
    agent any

    stages {
        stage('Hello') {
            steps {
                sh 'ping 127.0.0.1'
            }
        }
    }
}

pipeline的步骤是可插拔的,可以通过安装某些插件来执行特定的步骤。

post

除了上述模块,还可以在stages或者steps模块后面定义post模块来表示整个pipeline执行完成或者单个stage完成后需要执行的动作。

如下所示,

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                sh 'echo Build stage ...'
            }
            post {
	        	always {
	        		echo "post condition executed: always ..."
	        	}        	
        	}
        }
    }
        post {
    	unstable {
    		echo "post condition executed: unstable ..."
    	}
    	failure {
    		echo "post condition executed: unsuccessful ..."
    	}
    	cleanup {
    		echo "post condition executed: cleanup ..."
    	}
    }
  }

post模块可以定义多个条件块,条件块里写上要执行的步骤,条件块有以下几种,

  • always: 无论当前执行结果是什么状态都执行
  • changed: 当前完成状态和上一步完成状态不同则执行
  • fixed: 上一步为失败或不稳定(unstable) ,当前状态为成功时
  • regression: 上一次完成状态为成功,当前完成状态为失败、不稳定或中止(aborted)时执行。
  • aborted: 当前执行结果是中止状态时(一般为人为中止)执行。
  • failure:当前完成状态为失败时执行。
  • success:当前完成状态为成功时执行。
  • unstable:当前完成状态为不稳定时执行,通常是
  • cleanup:清理条件块。不论当前完成状态是什么,在其他所有条件块执行完成后都执行。

这里再着重解释下unstable 状态,通常我们将测试失败的状态设定为unstable,可以把它理解成日志等级的warn状态。如下我们可以主动设置stage和构建结果为unstable状态。

pipeline {
    agent any

    stages {
        stage('Test') {
            steps {
                warnError('watch it'){
                  sh '''
                          echo 'Running tests...'
                          exit 1
                          
                        '''   
                }

            }
        }
        stage('Hello2') {
            steps {
                echo 'hello'
            }
        }
    }
    
    post {
        failure {
            echo "failure"
        }
        success {
            echo "success"
        }
        unstable {
            echo "unstable"
        }
    }
}

最终产生的构建视图如下:

在这里插入图片描述

指令

pipeline除了上述的基本结构外,还提供了一些其他指令作为其基本结构的补充,

Jenkins pipeline支持的指令有:

  • environment:用于设置环境变量,可定义在stage或pipeline部分。
  • tools:可定义在pipeline或stage部分。它会自动下载并安装我们指定的工具,并将其加入PATH变量中。
  • input:定义在stage部分,会暂停pipeline,提示你输入内容。
  • options:用于配置Jenkins pipeline本身的选项,比如options {retry(3)}指当pipeline失败时再重试2次。options指令可定义在stage或pipeline部分。
  • parallel:并行执行多个step。在pipeline插件1.2版本后,parallel开始支持对多个阶段进行并行执行。
  • parameters:与input不同,parameters是执行pipeline前传入的一些参数。
  • triggers:用于定义执行pipeline的触发器。
  • when:当满足when定义的条件时,阶段才执行。

在使用指令时,需要注意的是每个指令都有自己的“作用域”。如果指令使用的位置不正确,Jenkins将会报错。

更多的配置案例请参考 流水线语法 (jenkins.io)

嵌入式脚本

在pipeline 声明式语法中,当需要执行代码块条件判断时除了使用when指令,还可以使用groovy语法的脚本,脚本还可以执行for循环的操作,配置代码如下,脚本需要被script块包括起来

写script块内的脚本需要先简单了解下groovy的语法

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

函数调用

pipeline脚本同样可以定义函数,然后通过调用函数来执行一段逻辑,函数的定义遵循groovy的语法,如下,我定义了一个hello的函数,然后对其进行调用。

注意,函数定义是放到pipeline外面的。因为要接收函数返回值,所以整个函数调用是放到了script块里,groovy的语法中双引号中可以用$变量名来引用特定的变量。

def hello(String name){
    echo "$name"
    return "Yes"
}
pipeline {
    agent any

    stages {
        stage('Hello2') {
            steps {
             script {
                def  res = hello('Beatiful')
                echo "$res"
             }
            }
        }
    }
    
}

共享库

虽然pipeline脚本能够定义函数提取重复逻辑,但是如果有100个pipeline脚本都需要同一个函数,不可能定义100遍这样的函数,所以jenkins提供了共享库的机制,来让我们方便去定义一个函数可以供多个pipeline脚本使用。下面介绍下写一个共享库的基本步骤,

创建一个代码库,并上传git

我们要写的函数就定义在vars目录下,在vars目录中的文件名如果有多个单词需遵循驼峰格式的命名,到时候引用函数的函数名和vars目录下的文件名一致。

BoxJenkins
├── README.md
├── src
└── vars
    ├── hello.groovy

hello.groovy 的文件内容如下,注意里面的函数名call是固定的,不可变动。

def call(String name){  
    echo "$name"  
}
jenkins 引入共享库

在Jenkins的Manage Jenkins→Configure System→Global Pipeline Libraries中配置共享库的git地址。

在这里插入图片描述

其中Name则是到时候我们要引入的库名称

pipeline 中引入共享库

引入共享库的语法为 在pipeline块外部使用@Library(‘lanpangzi-lib@master’) _ ,以下是配置示例,其中@master 中的master代表库的版本,可以由分支名,tag名,乃至commit id代替。

@Library('lanpangzi-lib@master') _

pipeline {
    agent any

    stages {
        stage('Hello2') {
            steps {
             hello('wudi')
            }
        }
    }
    
}

关于共享库还有更多的用法,例如在共享库中定义pipeline模板,以及使用共享库中src的代码,这里就不再展开了。

总结

这一节,基本上对jenkins的pipeline脚本语法做了比较完整的介绍,在以后再看pipeline脚本时,可能还会接触到许多插件提供的函数或更多的指令,但是它们都逃不开pipeline脚本的基本结构,掌握了基础语法,后面才能更上一层楼。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1114713.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

行业追踪,2023-10-20

自动复盘 2023-10-20 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

Note——torch.size() umr_maximum() array.max() itertools.product()

torch.size Problem TypeError: ‘torch.Size’ object is not callable Reason Analysis torch.Size函数不可调用 因为torch只可以.size() 或 shape Solution 将y.shape()替换为y.size() 或 y.shape ytorch.normal(0,0.01,y.size())2 return umr_maximum(a, axis, None…

那些你面试必须知道的ES6知识点

目录 1、var、let、const的区别2、作用域考题3、合并两个对象4、箭头函数和普通函数的区别5、Promise有几种状态6、find和filter的区别7、some和every的区别 1、var、let、const的区别 区别一&#xff1a; var有变量提升&#xff0c;而let和const没有 <script>console.l…

英伟达禁售?FlashAttention助力LLM推理速度提8倍

人工智能领域快速发展&#xff0c;美国拥有强大的AI芯片算力&#xff0c;国内大部分的高端AI芯片都是采购英伟达和AMD的。而为了阻止中国人工智能领域发展&#xff0c;美国频繁采取出口管制措施。10月17日&#xff0c;美国拜登突然宣布&#xff0c;升级芯片出口禁令。英伟达限制…

【openwrt学习笔记】Dying Gasp功能和pstore功能的配置(高通 ipq95xx)

目录 一、Dying Gasp信号1.1 概念1.2 实现原理 二、pstore 功能2.1 概念2.2 实现原理 三、openwrt中开启pstore功能3.1 软硬件参数3.2 各文件修改3.2.1 defconfig3.2.2 dts(ipq9574-default-memory.dtsi)3.2.3 fs/pstore/ram.c 四、测试4.1 挂载4.2 触发命令和效果 参考资料&am…

cocos creator 在网页中调试的时候直接代码调试方法

cocos creator 在网页中调试的时候直接代码调试方法

数据结构───顺序表(梦开始的地方)

从一个编程小白到入门&#xff0c;大学选的软件工程&#xff0c;从大一开始就没有真正的了解这个专业&#xff0c;更别说以后的发展方向。活了几十年&#xff0c;也不知道自己究竟要成为一个什么样的人。似乎在大二的某一天&#xff0c;忽然意识到我不该如此庸碌下去&#xff0…

对话 L2 潜力新星 Mantle:模块化理念推动生态可持续建设

作为一个由 DAO 主导实现快速增长&#xff0c;致⼒推动⼤众应⽤与数字虚拟资产治理技术—— Mantle 如何凭借模块化设计理念、可扩展性技术优势、高效能数据处理机制在 Layer2 版图中成长为新晋潜力项目&#xff1f;从测试网到主网上线&#xff0c;Mantle 经历了数个技术更新阶…

【(数据结构)— 双向链表的实现】

&#xff08;数据结构&#xff09;— 双向链表的实现 一.双向链表的结构二. 双向链表的实现2.1 头文件 ——双向链表的创建及功能函数的定义2.2 源文件 ——双向链表的功能函数的实现2.3 源文件 ——双向链表功能的测试2.4 双向链表各项功能测试运行展示2.4.1 双向链表的初始化…

发现一不错的编程助手 Amazon CodeWhisperer

Amazon CodeWhisperer 是一款 AI 编程助手&#xff0c;旨在为开发人员提供智能化的编程辅助工具。作为一款基于人工智能的编程助手&#xff0c;CodeWhisperer 的目标是提高开发人员的生产效率、降低开发成本&#xff0c;并提供高质量的编程解决方案。 1.安装过程参考官网 htt…

C++11函数适配器bind() --- C++11新语法bind() 你了解多少?什么是适配器???

文章目录 1.介绍头文件定义原型 2.引入2.1现有语法无法解决2.2bind的文档阅读2.3bind()绑定函数对于2.1问题的解决 1.介绍 头文件 #include <functional> 定义 bind函数定义在头文件中&#xff0c;是一个函数模板&#xff0c;它就像一个函数包装器(适配器)&#xff0c…

苹果 AirPods Pro 2 耳机新固件(6A305)

苹果公司对采用 Lightning 端口和 USB-C 端口的 AirPods Pro 2 耳机&#xff0c;推出了内部编号为 6A305 的全新固件&#xff0c;高于 10 月 10 日发布的 6A303 更新。用户无需手动更新&#xff0c;只需将 AirPods 通过蓝牙连接到 iPhone &#xff0c;此时便会自动安装新的固件…

甄知科技张礼军:数智化转型助企业破茧成蝶!

数智化浪潮滚滚向前&#xff0c;正席卷各行各业&#xff0c;带领企业从数字化时代跨入数智化时代。可什么是数智化&#xff1f;如何实现数智化转型&#xff1f;已经成为横亘在无数企业面前的大难题&#xff01; 事实上&#xff0c;数智化是数字化、AI和业务三个要素的交集&…

SQLServe联合主键、联合索引、唯一索引,聚集索引,和非聚集索引、主键、唯一约束和外键约束、索引运算总结

联合主键 SQL server 中给表增加联合主键的两种方法 第一种方法&#xff0c;新建表时增加联合主键&#xff1a; create table t_students(id int not null,name varchar(10) not null Primary Key (id, name),age int,dept_id int )注&#xff1a;联合主键的列需要限制非空约…

操作系统【OS】系统调用

系统调用 定义 操作系统对应用程序和程序员提供的接口用户程序执行陷入指令&#xff08;Trap或访管指令&#xff09;来发起系统调用&#xff0c;请求操作系统提供服务OS 通过提供系统调用避免用户程序直接访问外设【应用程序通过系统调用使用OS的设备管理服务】操作系统不同, …

弹出框,使用树结构查询数据

效果如下: 描述:希望点击某个按钮,弹出一个窗口,然后通过下拉框,点击下拉框里面的组织信息,然后查询对应组织的成员对象列表,并展示到表格中 HTML代码(最主要的就是树的那个): <el-dialog :visible.sync="TesteePage.showDialog" width="70%&quo…

初出茅庐的小李博客之Windows11运行Linux记录

安装教程 超简单&#xff0c;不安装虚拟机&#xff0c;Windows11运行Linuxhttps://zhuanlan.zhihu.com/p/393484912 注意事项 出现错误有可能是少了驱动 驱动下载地址 https://link.zhihu.com/?targethttps%3A//wslstorestorage.blob.core.windows.net/wslblob/wsl_updat…

bp(back propagation)

文章目录 定义过程前向传播计算过程计算损失函数&#xff08;采用均方误差MSE&#xff09;反向传播误差&#xff08;链式法则&#xff09;计算梯度更新参数 简单实例 定义 反向传播全名是反向传播误差算法&#xff08;Backpropagation&#xff09;&#xff0c;是一种监督学习方…

HZOJ-271: 滑动窗口

题目描述 ​ 给出一个长度为 N&#xfffd; 的数组&#xff0c;一个长为 K&#xfffd; 的滑动窗口从最左移动到最右&#xff0c;每次窗口移动&#xff0c;如下图&#xff1a; 找出窗口在各个位置时的极大值和极小值。 输入 ​ 第一行两个数 N,K&#xfffd;,&#xfffd;。 …

win yolov5.7 tensorRT推理

安装TensorRT 下载tensorrt8.xx版本&#xff0c;适用于Windows的cuda11.x的版本 官方下载地址https://developer.nvidia.com/nvidia-tensorrt-8x-download 把tensorRT里面的bin、include、lib添加到本机CUDA中&#xff0c;CUDA需要加入环境变量中 配置虚拟环境 torch的版本…