jenkins 的pipeline 语法讲解上 (4)
一.必要的groovy知识
学习pipeline可以不需要任何groovy知识,但是学习下对于写pipeline如虎添翼。
变量def关键词
#结尾分号不是必须的 def x="abc" def y="xyz"
下面是声明类似js的对象
//编译服务器设置start def buildNodeSettings = [:] buildNodeSettings.node = '阿里云Windows_2008_r2_x86'//编译服务器节点设置 buildNodeSettings.gitUrl = 'https://xxx/JenkinsPipelineProject.git'//git地址 buildNodeSettings.gitBarnches = '*/master' //分支 buildNodeSettings.slnFile = 'JenkinsPipelineProject.sln' //Nuget还原解决方案名
二. pipeline的组成
jenkins pipeline其实就是基于groovy语言实现的一种DSL(领域特定语言),用于描述整条流水线是如何运行的,流水线的内容包括执行编译、打包、测试、发布等步骤。
2.1 pipeline最简结构
pipeline流水线包含多个阶段,每个阶段只专注于处理一件事情,而这件事情又通过多个步骤来完成。jenkins pipeline的一个基本结构如下:
pipeline { agent any stages { stage('build') { steps { echo 'Hello World' } } } }
pipeline:代表整条流水线,包含整条流水线的逻辑。
stages: 阶段容器,stages部分至少包含一个stage
stage:阶段,代表流水线的阶段,每个阶段都必须有名称,本例中build就是阶段名称。
steps: 步骤容器,一个stage阶段中有一个steps,steps部分至少包含一个步骤, echo就是一个步骤.
agent:指定流水线执行位置,流水线中的每个阶段都必须在某个地方(物理机、虚拟机、docker)执行,agent部分即指定具体在哪里执行。
以上每一个部分都是必需的,少一个jenkins都会报错
2.2 步骤
步骤是pipeline中已经不能再拆分的最小操作,前面我们只看到两个步骤:sh和echo。
sh(linux)是指执行一条shell命令;echo是指执行echo命令。bat(windows)执行cmd命令, 这些步骤是jenkins pipeline内置的大量步骤中的几个。
jenkins官方提供了pipeline 步骤参考文档 https://www.jenkins.io/doc/pipeline/steps/
https://plugins.jenkins.io/dotnet-sdk/ 是用于.net core的步骤。
2.3 post部分
post部分包含的是在整个pipeline或者阶段完成后一些附回的步骤,post是可选的部分,但并不代表它作用不大。根据pipeline或阶段的完成状态,post部分分成多种条件块,包括:
always: 不论当前完成状态是什么,都执行。
changed:只要当前完成状态与上一次完成状态不同就执行。
fixed:上一次完成状态为失败或不稳定(unstable),当前完成状态为成功时执行。
regression:上一次完成状态为成功,当前完成状态为失败或不稳定(unstable)或中止(aborted)时执行.
aborted:当前执行结果是中止(一般为人为中止)执行。
failure:当前完成状态为失败时执行。
success:当前完成状态为成功时执行。
unstable:当前完成状态为不稳定时执行。
cleanup:清理条件块,不论当前完成状态是什么,在其他所有条件块执行完成后都执行。
pipeline { agent any stages { stage('Hello') { steps { echo 'Hello World' } post { always{ echo 'stage post always' } } } } post{ success{ echo 'pipeline post success' } always{ echo 'pipeline post always' } } }
2.4 pipeline支持的指令(Directive)
显然基本的结构满足不了现实多变的需求,所以jenkins pipeline通过各种指令来丰富自己,指令可以理解为对jenkins pipe-line基本结构的补充。
下图是使用生成器,生成options指令中的buildDiscarder脚本
以下是所有指令说明:
environment:用于设置环境变量,可定义在stage或pipeline部分。
tools:可定义在stage或pipeline部分,它会自动下载并安装我们指定的工具,并将其加入path变量中.
input:定义在stage部分,会暂停pipeline,提示你输入内容。
options:用于配置pipeline本身的选项,比如options{ retry (3) } 指定pipeline失败时重试2次。可定义在stage或pipeline部分。
parallel:并行执行多个step,在pipeline插件1.2版本后,parallel开始支持对多个阶段进行并行执行。
parameters:与input不同,是执行pipeline前传入的一些参数。
triggers:用于定义执行pipeline的触发器。
when:当满足when定义的条件时,阶段才执行。
buildDiscarder:保存最近历史构建记录的数量。
pipeline { agent any options{ buildDiscarder logRotator(artifactDaysToKeepStr: '', artifactNumToKeepStr: '', daysToKeepStr: '3', numToKeepStr: '10') disableConcurrentBuilds() timeout(time:1, unit:'HOURS') retry(2) } ...
checkoutToSubdirectory:jenkins从版本控制库拉取源码时,默认检出到工作空间的要目录中,此选项可以指定检出到工作空间的子目录。
disableConcurrentBuilds:同一个pipeline, jenkins默认是可以同时执行多次的,引选项是为禁止pipeline同时执行。
pipeline { agent any options{ disableConcurrentBuilds() timeout(time:1, unit:'HOURS') retry(2) } ...
newContainerPerStage:当agent为docker或dockerfile时,指定在同一个jenkins节点上,每个stage都分别运行在一个新的容器中,而不是所有stage都运行在同一个容器中。
retry:当发生失败时进行重试,可以指定整个pipeline的重试次数,当使用retry选项时,options可以被放在stage块中。
pipeline { agent any options{ timeout(time:1, unit:'HOURS') retry(2) } ...
timeout:如果pipeline执行时间过长,超出了我们设置的timeout时间,jenkins将中止pipeline,以下例子以小时为单位,还可以是SECONDS(秒),MINUTES(分钟),当使用timeout选项时,options可以被放在stage块中,通常设置10分钟就可以了。
pipeline { agent any options{ timeout(time:1, unit:'HOURS') } ....
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
2018-11-30 redis 系列17 持久化 AOF