欢迎访问我的博客,你的支持,是我最大的动力!

Jenkins2权威指南-基础知识与流水线执行流程

Linux 小马奔腾 18℃ 评论
目录:
[显示]

Jenkins2 简介

DSL基于groovy实现,是jenkins核心组件;jenkinsfile -> 声明式流水线,其中jenkinsfile可使用源码版本控制
流水线即代码:脚本式流水线 -> 更高级 -> 声明式流水线(接近web界面构建的流水线)

Blue Ocean,展示流水线并提供点选式日志查看、可视化编辑

jenkins2新的任务类型,需要在初始化向导中选择安装系统推荐的插件
多分支流水线,multibranch pipeline,在有jenkinsfile的项目中,若创建一个新的分支,jenkins将自动基于这个新分支创建一个新任务

jinkens2流水线的特性是能容忍节点的重新启动,这也要求插件中对有状态的对象进行序列化
插件需要提供api供流水线调用

基础知识

脚本式语法
优点:
更少的代码段落和弱规范要求;更强大的程序代码能力;更像编写代码程序;传统的流水线即代码模型,兼容性强;更灵活的自定义代码操作;能构建复杂的工作流
缺点:
更高的编程水平;语法检查受限于groovy;和传统jenkins模型有很大差异;更复杂

声明式语法
优点:
更结构化,贴近传统web表单形式;更强大的声明内容能力,可读性高;可通过blue ocean图形化界面自动生成;段落可映射到常见的jenkins概念;更友好的语法检查和错误识别;能提升流水线的一致性
缺点:
对迭代逻辑支持较弱;部分功能缺乏支持;更难实现自定义流水线代码;对复杂流水线支持较弱

主节点
节点,任何可以执行jenkins任务的系统,包括主节点、代理节点、docker;node用于脚本式流水线
代理节点,(从节点);agent用于声明式流水线

jenkins dsl基于groovy语言实现

节点配置中多个标签以空格分隔;使用标签时,可使用逻辑运算符,如 || ,&&

节点 -> 阶段 -> 步骤step

step语法:
groovy允许跳过参数的圆括号
如果只有一个必选参数,同时只传递一个数值,可省略参数名
如果没有参数,默认参数是script对象,   bat([script: 'echo hi']) -> bat 'echo hi'

代码片段生成器
代码片段生成器的内容基于流水线步骤的定义来生成和更新,这些定义来自于插件的支持
实际是由安装了哪些插件决定
提供基于web表单的界面,在其中填入需要的参数,自动生成对应的dsl代码段

git中的两个参数
polling,设置为false时,源码仓库中的变更不会自动检测并重新构建。(需要轮询功能打开)
changelog,设置为false时,不会获取变更记录,在输出中对应changes部分

构建流水线 Build Pipeline,插件,当前公司在使用的方式

stage view中,浅红色代表虽然执行成功,但下游某个阶段出现失败

回放 Replay (不是Rebuild)
不修改原始代码,临时修改进行验证,用于调试
命令行方式时行回放
java -jar ~/jenkins-cli.jar -s http://<jenkins-url> replay-pipeline "<Name>" < Jenkinsfile

流水线执行流程

触发任务
脚本式流水线,通过properties代码块(该属性会与web界面定义的属性合并处理,且web界面的优先级更高)
声明流水线,通过triggers指令定义

脚本式流水线与参数

声明式流水线与参数

创建本地变量存放input返回值不适用于声明式模型

使用parameters指令
用于声明参数,和agent代码块一起

也可以使用web表单中的this project is parameterized,在pipeline中可以引用这些参数,如params.<参数名称>

另一种方法对脚本式和声明式流水线都适用,在流水线开头把参数定义为属性 properties (和pipeline一个级别)
该方式不推荐在生产环境使用

声明式流水线可使用script代码块,代码块中允许使用非声明式语法,其作用域也仅限于此代码块,即在代码块外不能引用代码块中定义的变量
一个变通的方法是,把返回值存储在一个环境变量中  -> env.RESP1=input xxxx   在代码块外引用 ${env.RESP1}

使用input的一个问题是,若没有输入,会阻塞,这时,应当使用timeout来封闭输入调用

流程控制

并发控制

使用lock对资源加锁
阻止多个构建在同一时间试图访问同样的资源
可锁定资源插件 Lockable Resources plugin
lock('worker_node1){//一些步骤}
lock(label:'docker-node',quantity:3){//...} 仅锁定该标签资源的三个实例

使用milestone控制并发
解决资源竞争,一旦一个构建已经通过某个点milestone,就阻止其他构建继续越过该点
后达到的构建在达到milestone时,会自动被取消
注意,如果一个较旧的构建通过了某个milestone,那些还没有通过该milestore的较新的构建不会被中止(启动顺序)
# 示例
sh "'${gradleLoc}/bin/gradle' clean build" }
milestone label:'After build',ordinal:1
stage("NotifyOnFailure"){...}

在多分支流水线中限制并发
限制多分支流水线每次只构建一个分支,排队

并行运行任务

stash和unstash
在流水线的节点间或阶段间保存和获取文件 暂存文件以便在节点间共享
stash name:"<name>" [includes:"<pattern>" excludes:"<pattern>"]
unstash "<name>"

声明式流水线中新的并行语法
不需要建立映射,同时并行操作的输出也是分开的

parallel与fialFast选项
并行的代码块中,任意一个步骤失败,退出所有并行的步骤

条件语句

条件性构建步骤插件 Conditional BuildStep plugin
测试某些条件,并基于执行结果执行一个或多个构建步骤

构建后动作

脚本式流水线构建后处理

依靠 try-catch-finally 机制
无论构建结果如何,总是执行某些动作

catchError
探测异常以及改变整个构建状态,还能继续执行流水线进程
若代码块抛出异常,构建会被标记为失败,但流水线从catchError代码块往后的语句可以继续执行

声明式流水线构建后处理

post可放在阶段结尾或流水线结尾

 

 

 

 

 

 

 

转载请注明:轻风博客 » Jenkins2权威指南-基础知识与流水线执行流程

喜欢 (0)or分享 (0)