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

创建后:

 Step2Jenkins上配置一下:系统配置--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 }
上面案例加Library

插曲:一开始报错如下:

 

 是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' : ">>>>>>>>>>${value}>>>>>>>>>>",
              'green1' : "\033[40;32m >>>>>>>>>>>${value}<<<<<<<<<<< \033[0m" ]
    ansiColor('xterm') {
        println(colors[color])
    }
}
View Code

安装插件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---给控制台输出增加颜色,方便查看日志。

 

posted @ 2022-01-05 11:38  maxiaonong  阅读(637)  评论(0编辑  收藏  举报