Pipeline Job
脚本式语法和声明式语法
Jenkins 2.x支持两种pipeline语法:脚本式语法和声明式语法
脚本式流水线:
//脚本式流水线:node用于脚本式流水线,从技术层面上来说,
//它是一个步骤,代表可以用于流水线中执行活动的资源
node('node01') {
stages {
stage('Build') {
steps {
echo 'Building...'
}
}
stage('Test') {
steps {
echo 'Testing...'
}
}
}
}
声明式流水线:
//声明式流水线:agent用于声明式流水线,它作为一个指令用于分配节点;
pipeline{
agent {label'node01'
stages {
stage('Build') {
steps {
echo 'Building...'
}
}
stage('Test') {
steps {
echo 'Testing...'
}
}
}
}
pipeline的组成
(每个stage都是独立执行的,如果有前后关联关系,可以在同一个agent上执行,如果没有关联关系,可以放在不同的agent上执行,就算有关联关系,也可以放在同一agent的不同容器中执行)
pipeline实际上就是基于Groovy语言实现的一种DSL(Domain-Specific
Language),用于描述代码编译到打包发布的整个流水线是如何进行的;
pipeline的定义有一个明确的、必须遵循的结构,它由一些指令及嵌套的代
码块组成,该结构存在以下几个基本元素
◼ pipeline:流水线的最外层结构,代表整条pipeline,包含着pipeline的完整逻辑;
◼ stages:用于包含所有stage的定义;
◼ stage:阶段,代表流水线的一个单独的功能完成时期,例如编译等;
◼ steps:用于在stage中定义完成该阶段功能所需要经历的一系列步骤,并能够把
这些步骤同该stage中的其它定义(如环境的定义等)分隔开;
◼ agent:pipeline中的单独指令,用于指定流水的执行位置,它可能是代表着slave
主机的某个物理机、虚拟机或者容器;
◼ post:用在stage代码块,或者是整个pipeline执行完成后附加的步骤;
在上面给出的几个配置中,post是配置语法中惟一可省略的,但在实际应用
中,通常不能省略
部署完jenkins之后创建一个pipelian项目
Jenkins内置的流水线编辑器
Pipeline编辑器的特性
语法检查
◼ 编辑器会尝试检查Groovy语法和引用的有效性,所有问题都会在对应代码行前面通过红色“X”方框标记提
示出来;
◼ 然而,并非所有的错误标记都代表真正的错误,在某些时候脚本可能无法解析依赖或最近创建的输入,这是
一个异常而非规则;
完整的错误信息
◼ X标记在提供快速识别问题行的同时,还支持鼠标悬停时展示完整的错误信息;
自动补全
◼ 编辑器还提供了一定程度上的自动补全功能,比如自动补全括号;
提供了“代码片断生成器”
◼ 代码片断生成器提供了一种搜索可用的DSL步骤的方法,以帮助用户随时借鉴和查阅感兴趣步骤的主义和语
法
如:点开流水线语法,有片段生成器,指令生成器,点击DDG指令生成器,打算在哪个agent上执行
把生成的内容粘贴到脚本中(在任何一个agent上执行)
指令生成器:定义stages,添加阶段、完成该阶段功能所需要经历的一系列步骤(如参数、环境变量等)
定义克隆代码、构建、测试、打包
应用保存立即构建并查看构建结果(每一个圆点代表执行的一个stage,执行成功为绿色表示)
运行失败的视图
多次运行构建任务时,最新一次的运行位于视图中的最上方;
◼ 当某个stage因任何原因运行失败时,Jenkins会将其标记为红色条纹背景;
◼ 鼠标悬停于stage方块上方,会有错误信息提示;
◼ 例如,我们将此前pipeline示例代码的“Build”阶段有意改为错误格式,例如将echo换成bat命令等,其构建
结果将输出为类似如下视图;
流水线步骤
Pipeline Job中的流水线步骤可以分解显示每个步骤的执行状态
回放(Replay)
对于错误的构建任务,Jenkins提供了一种称为“回放”的机制,它允许用户无须改变已保存的原有代
码的基础上进行试验和调试;
◼ 回放为用户提供了一种在原有代码基础上修改代码并再次触发pipeline的功能,以便于在正式提交代码之前进
行一次变更的快速快速验证并查看效果;
◆ 点击构建菜单中的“回放”,会弹出编辑窗口,并允许用户任意修改程序,而后点击“运行”按钮来验证变更效果;
◆ Jenkins会在回放窗口中运行编辑后的代码,并保存一次全新的构建记录,但原始代码依然保持从前的状态;因此,回放操作能帮用户验证变更,但真正的变更依然需要用户手动更新pipeline的代码完成;