jenkins流水线基础(CICD 03)
https://github.com/zeyangli
目录:
1、Jenkinsfile基础(声明式)
2、声明式流水线基本语法
3、JenkinsShareLibrary
4、Groovy基础--jenkinsfile中常用的
1、Jenkinsfile基础(声明式)
以下面一个简单模板为例讲解。这里只是框架讲解,不是代表全部,比如post中条件块不止只有alawys、success、failure、abort这四个,还有changed等。
String workspace = "/opt/jenkins/worksapce" //pipeline pipeline{ agent{ node { label "master" //指定运行节点的标签或者名称 customWorkspace "${workspace}" //指定运行工作目录(可选) } } options{ timestamps() //日志会有时间 skipDefaultCheckout() //删除隐式checkout scm语句 disableConcurrentBuilds() //禁止并行 timeout(time:1, unit:'HOURS') //流水线超时设置1h } stages{ // 下载代码 stage("GetCode"){ // 阶段名称 steps{ //步骤 timeout(time:5, unit:'MINUTES'){ //步骤超时时间限制 script{ //填写运行代码 println("获取代码") } } } } //构建 stage("Build"){ steps{ timeout(time:20, unit:'MINUTES'){ script{ println("应用打包") } } } } //代码扫描 stage("CodeScan"){ steps{ timeout(time:20, unit:'MINUTES'){ script{ println("代码扫描") } } } } } //构建后操作 post{ always{ // always{}总是执行脚本片段 script{ println("always") } } success{ // success{}执行成功后执行 script{ currentBuild.description += "\n 构建成功!" //currentBuild是一个全局变量,description构建描述 } } failure{ // failure{}执行失败后执行 script{ currentBuild.description += "\n 构建失败!" } } aborted{ // aborted{}执行被取消后执行 script{ currentBuild.description += "\n 构建取消!" } } } }
Jenkinsfile组成:
- pipeline:代表整条流水线,包含整条流水线的逻辑;
- agent部分:指定流水线的执行位置(Jenkins agent)。流水线种的每个阶段都必须在某个地方(物理机、虚机或Docker容器)执行,agent部分即指定具体在哪里执行;
- options部分:指定运行时所需要的选项;
- stages部分:流水线中多个stage的容器。stages至少包含一个stage。stage表示流水线的阶段;在一个stage中有且只有一个steps,steps中至少包含一个步骤内容。
- post部分:构建后的操作。
2、声明式流水线基本语法
2.1 agent(代理)
agent 指定流水线的执行节点;
参数:
- any 在任何可用的节点上执行pipeline
- none没有指定agent的时候默认
- label在指定标签上的节点上运行pipeline
- node允许额外的选项
//这两种是一样的 agent { node {label ‘master’}} agent { label ‘master’}
2.2 post
post部分包含的是整个pipeline或阶段完成后的一些附加的步骤。post部分是可选,所以并不包含在pipeline最简结构中。post与stages并级。post部分分为多种条件块,包括:
- always 无论流水线或者阶段的完成状态是什么,都执行;
- changed 只有当前完成状态与上一次完成状态不同时执行;
- fixed 上一次完成状态为失败或不稳定(unstable),当前完成状态为成功时执行;
- regression 上一次完成状态为成功,当前完成状态为失败、不稳定或中止(aborted)时执行;
- aborted 中止状态执行。例如:手动取消
- failure
- success
- unstable 当前完成状态为不稳定时执行。比如:测试失败
- cleanup 清理条件块。不论当前完成状态是什么,在其他所有条件块执行完成后都执行。
2.3 stages(阶段)
包含一系列一个或者多个stage指令;
2.4 指令
指令(directive)可以理解为对Jenkins pipeline基本结构的补充。在使用指令是,需要注意的是每个指令都有自己的”作用域“。如果指令使用的位置不正确,可能会报错。Jenkins pipeline支持的指令有:
- environment :用于设置环境变量,可定义在stage或pipeline部分;
- options:用于配置Jenkins pipeline本身的选项,可定义在stage或pipeline部分;
- parameters:执行pipeline前传入的一些参数;
- triggers:用于定义执行pipeline的触发器;比如定时去执行、gitlab提交触发。
- tool :它会自动下载并安装我们指定的工具,并将其假如PATH变量中。可定义在stage或pipeline部分;
- input:定义在stage部分,会暂停pipeline,提示你输入内容。
- when:当满足when定义的条件时,阶段才执行;一般写在steps前,stage中;
- parallel:并行执行多个step;
parameters在pipeline流水线中传参等同于Jenkins web界面”参数化构建过程“传参数一样。
可以在Jenkins界面,选择”流水线语法“-”input等待式交互输入“,然后设置生成语法。将生成的语法插入Jenkinsfile中。
2.5 steps步骤
其中script:在script{}中可以执行脚本式语法。
3、JenkinsShareLibrary
jenkins pipeline提供了“共享库”(Share Library)技术,可以将重复代码定义在一个独立的代码控制仓库中,其他的Jenkins pipeline加载使用它。说白了,就是方便模块复用。
3.1 概述
共享库项目的目录结构中主要有src与vars(可去除)、resource(可去除);
以自己的码云gitee为例,创建一个JenkinsSshareLibrary。
Step1:新建一个仓库;新建src/org/org/devops/tools.groovy文件,新建vars/hello.groovy文件
git操作不会参考:https://blog.csdn.net/weixin_44831109/article/details/106359180
创建后:
Step2:Jenkins上配置一下:系统配置--Global Pipeline Libraries填写:
1 @Library('JenkinsLib')_ 2 3 def tools = new org.devops.tools() 4 5 String workspace = "/opt/jenkins/worksapce" 6 7 //pipeline 8 pipeline{ 9 agent{ 10 node { 11 label "master" //指定运行节点的标签或者名称 12 customWorkspace "${workspace}" //指定运行工作目录(可选) 13 } 14 } 15 16 17 options{ 18 timestamps() //日志会有时间 19 skipDefaultCheckout() //删除隐式checkout scm语句 20 disableConcurrentBuilds() //禁止并行 21 timeout(time:1, unit:'HOURS') //流水线超时设置1h 22 } 23 24 25 stages{ 26 // 下载代码 27 stage("GetCode"){ // 阶段名称 28 steps{ //步骤 29 timeout(time:5, unit:'MINUTES'){ //步骤超时时间限制 30 script{ //填写运行代码 31 println("获取代码") 32 } 33 } 34 } 35 } 36 37 //构建 38 stage("Build"){ 39 steps{ 40 timeout(time:20, unit:'MINUTES'){ 41 script{ 42 println("应用打包") 43 } 44 } 45 } 46 } 47 48 //代码扫描 49 stage("CodeScan"){ 50 steps{ 51 timeout(time:20, unit:'MINUTES'){ 52 script{ 53 println("代码扫描") 54 tools.PrintMes("调用JenkinsShareLibrary打印函数") 55 } 56 } 57 } 58 } 59 } 60 61 62 //构建后操作 63 post{ 64 always{ // always{}总是执行脚本片段 65 script{ 66 println("always") 67 } 68 } 69 70 success{ // success{}执行成功后执行 71 script{ 72 currentBuild.description += "\n 构建成功!" //currentBuild是一个全局变量,description构建描述 73 } 74 } 75 76 failure{ // failure{}执行失败后执行 77 script{ 78 currentBuild.description += "\n 构建失败!" 79 } 80 } 81 82 aborted{ // aborted{}执行被取消后执行 83 script{ 84 currentBuild.description += "\n 构建取消!" 85 } 86 } 87 } 88 }
插曲:一开始报错如下:
是git原因。安装git插件后,Jenkins虚机上依然要安装git。修改错误后,调用ShareLibrary结果如下:
步骤总结:
创建远程仓库,存放复用模板,只不过目录有一定的规范;Jenkins页面配置一下,Jenkinsfile即可以调用,文件开头@Library("配置时Library Name"),定义函数即可以调用;
当然@Library还有更多用法,比如指定分支。
最好将Jenkinsfile也放在远程仓库,做版本控制;
3.2 小例子--给日志输出赋予颜色
将原tool.groovy改为如下:
package org.devops //格式化输出 def PrintMes(value,color){ colors = ['red' : "\033[40;31m >>>>>>>>>>>${value}<<<<<<<<<<< \033[0m", 'blue' : "\033[47;34m ${value} \033[0m", 'green' : "[1;32m>>>>>>>>>>${value}>>>>>>>>>>[m", 'green1' : "\033[40;32m >>>>>>>>>>>${value}<<<<<<<<<<< \033[0m" ] ansiColor('xterm') { println(colors[color]) } }
安装插件AnsiColor(给控制台输出增加颜色),同步修改Jenkinsfile
运行结果:
4、Groovy基础--jenkinsfile中常用的
4.1 安装(以Linux为例)
前提:已经安装了java得运行环境,可以java -version看一下
1)下载二进制安装文件apache-groovy-binary-4.0.0-rc-2.zip,解压到/opt文件下,配置环境变量:
# source /etc/profile
2)使用 # groovysh
windows环境安装groovy类似,注意要先安装java环境,不然闪退无法使用。
4.2 数据类型
4.2.1 字符串String
字符串表示:单引号(引号中有变量时不可以使用单引号)、双引号、三引号
常用方法:
- contains() 是否包含特定内容,返回true/false
- size()、length() 字符串数量大小长度
- toString() 转换成string类型
- indexOf() 元素的索引
- endsWith() 是否指定字符结尾
- minus()、plus() 去掉、增加字符串
- reverse() 反向排序
- substring(1,2) 字符串的指定索引开始的子字符串
- toUpperCase()、toLowerCase() 字符串大小写转换
- split() 字符串分割,默认空格分割,返回列表
- toList() 转换成列表
4.2.2 list
列表表示:[ ]
常用方法:
- + - += -=元素增加减少
- add() << 添加元素
- isEmpty() 判断是否为空
- intersect([2,3]) 取交集
- disjoint([1]) 判断是否有交集
- flatten() 合并嵌套的列表
- unique() 去重
- reverse() sort() 反转 升序
- count() 元素个数
- join() 将匀速按照参数连接
- sum() min() max() 求和 最小值 最大值
- contains() 包含特定元素
- remove(2) removeAll()
- each{} 遍历
4.2.3 字典map
字典表示:[ : ]
常用方法:
- size() map大小
- ['key'].key get() 获取value
- isEmpty() 是否为空
- containKey() 是否包含key
- containValue() 是否包含指定的value
- keySet() 生成key的列表
- each{} 遍历map
- remove('a') 删除元素(k-v)
4.2.4 语法
4.3 常用的pipeline DSL方法
Jenkins 流水线语法 常用的DSL方法总结_小楼一夜听春雨,深巷明朝卖杏花-CSDN博客
DSL代表领域特定语言(Domain-Specific Language),可以理解未一种适合于Jenkins的“编程语言”。DSL基于Groovy实现,并通过概念和结构封装了Jenkins的特定功能。
附录:
1、本文中使用的非常规插件
AnsiColor---给控制台输出增加颜色,方便查看日志。