zoukankan      html  css  js  c++  java
  • 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---给控制台输出增加颜色,方便查看日志。

  • 相关阅读:
    记录优雅的pythonic代码
    记录python学习过程中的一些小心得
    关于理解python类的小题
    CSS3之属性选择器
    CSS3之初始
    HTML5+CSS3之离线web应用
    HTML5+CSS3之响应式视频以及iFrame下插入响应式视频的解决方案
    HTML5+CSS3之播放视频以及在IE8及以下的解决方案
    HTML5+CSS3响应式设计(二)
    HTML5+CSS3响应式设计(一)
  • 原文地址:https://www.cnblogs.com/maxiaonong/p/15766162.html
Copyright © 2011-2022 走看看