Jenkins 一文带你详解Pipeline定义与结构
为什么使用pipeline?
本质上,jenkins是一个自动化引擎,它支持许多自动模式。流水线向Jenkins添加了一组强大的工具,支持用例、简单的持续集成到全面的持续交付流水线。 通过对一系列的发布任务建立标准的模板,用户可以利用更多流水线的特性,比如:
代码化: 流水线是在代码中实现的,通常会存放到源代码控制,使团队具有编辑、审查和更新他们项目的交付流水线的能力。
耐用性:流水线可以从Jenkins的master节点重启后继续运行。
可暂停的:流水线可以由人功输入或批准继续执行流水线。
解决复杂发布: 支持复杂的交付流程。例如循环、并行执行。
可扩展性: 支持扩展DSL和其他插件集成。
构建一个可扩展是Jenkins的核心价值,流水线可以通过ShareLibrary的方式来扩展。
pipeline定义
关于Jenkins流水线的运行我们可以抽象一下,例如:可以把流水线(pipeline)想象成13号线地铁,把流水线的阶段(stage)想象成地铁的每一个站点,把流水线脚本(jenkinsfile)想象成地铁线路图。这就是流水线的多样性,每条线路都有不同的站点。
现在地铁(Jenkins)已经有了,我们需要设计地铁的运行线路图(Jenkinsfile),在线路图中指定要经过的站点(stages)。这下你是否已经知道我们要运行一条流水线,需要先做什么呢? –编写jenkinsfile
Pipeline
Jenkins的Pipeline通过Jenkinsfile进行描述(类似于Dockerfile)(镜像通过dockerfile描述,pipeline通过jenkinsfile描述)
Jenkinsfile是Jenkins的特性(pipeline as code)
Pipeline是Jenkins的核心功能,提供一组可扩展的工具。
通过Pipeline 的DSL语法可以完成从简单到复杂的交付流水线实现。
Jenkinsfile
Jenkinsfile使用两种语法进行编写,分别是声明式和脚本式。
声明式和脚本式的流水线从根本上是不同的。
声明式是jenkins流水线更友好的特性。
脚本式的流水线语法,提供更丰富的语法特性。
声明式流水线使编写和读取流水线代码更容易设计。
Pipeline定义
一条流水线通过Jenkinsfile描述
安装声明式插件Pipeline
DeclarativeJenkinsfile组成
指定node节点/workspace
指定指定运行选项
指定stages阶段
指定构建后操作
Pipeline有声明式和脚本式的语法,后面会用声明式嵌入脚本方式,通过sharelibary完善我们的jenkinfile
这里面就是pipeline的脚本,这条流水线包含了步骤,代码里面包含的所有内容都叫jenkinfile
语法有两种,一种是声明式的语法,一种是脚本方式,建议直接使用声明式语法,声明式语法功能更加强大一些,比如构建成功了做什么,构建失败了做什么。有现成的DSL直接使用就行了
所以声明方式的比脚本方式的更加友好些,在声明式里面也可以嵌入脚本式
Pipeline结构
声明式pipeline包含了几个部分组成:
整个流水线都是由pipeline这个块组成的,然后里面有一些标签,比如agent指定在哪个节点上运行这条流水线
后面的stages指的是阶段,所有的阶段都在这个大的stages里面,下面有好多小的stage,每个stage都有步骤
再往后就是构建后的操作,假如前面流水线都执行完了,如果状态是成功的要做什么,失败了要做什么,不管成功失败又要做什么
上面就是流水线的结构
(1)Pipeline agent
指定node节点/workspace
指定运行选项(可以忽略)
第一部分agent,agent指定的运行的节点,node可以以标签的方式指定节点,比如下面我这条流水线要运行在有master标签的节点上,然后工作目录这里做了自定义
(2)Pipeline options
第二部分就是运行时候的选项
比如排查什么时候运行失败的,会在日志里面打印时间,使用timestamps需要安装插件
跳过默认的checkout,声明式的脚本默认会检查有没有配置代码库,如果有的话可以自动的帮你下载,但是没必要下载,所以跳过
有些时候项目不需要并行
有时候流水线的构建会超时了,一直卡在那,这样会消耗大量的资源,而且会占用构建队列。
所以这里要设置流水线的超时时间,超时时间的流水线会自动结束
(3)Pipeline stages
Steps是步骤,一般stages下面都有steps,这个步骤超时时间是5分钟,然后嵌入一个脚本打印信息
(4)Pipeline post
构建后的操作,这个非常的重要,这是固定的格式,可以按照这个代码块模板去写,比如成功失败了发个邮件通知
这里current是全局的变量
写代码可以用好多变量,可以自己去定义变量,也可以使用jenkins的全局变量
上面是一个完整的流水线
pipeline演示
来我们一起看下这里的配置,看下Jenkinsfile的组成及每个部分的功能含义。
使用agent{},指定node节点/workspace(定义好此流水线在某节点运行)
指定options{}运行选项(定义好此流水线运行时的一些选项,例如输出日志的时间)
指定stages{}(stages包含多个stage,stage包含steps。是流水线的每个步骤)
指定post{}(定义好此流水线运行成功或者失败后,根据状态做一些任务)
pipeline{ //指定运行此流水线的节点 agent { node { label "build"}} //流水线的阶段 stages{ //阶段1 获取代码 stage("CheckOut"){ steps{ script{ println("获取代码") } } } stage("Build"){ steps{ script{ println("运行构建") } } } } post { always{ script{ println("流水线结束后,经常做的事情") } } success{ script{ println("流水线成功后,要做的事情") } } failure{ script{ println("流水线失败后,要做的事情") } } aborted{ script{ println("流水线取消后,要做的事情") } } } }
验证流水线效果
查看Jenkins构建日志(正确效果)
目录 返回
首页