• Jenkins Pipelin扩展


    image-20220421083433323

    目录

    1、groovy语法

    image-20220421083512143

    1.Groovy简介

    image-20220421083601242

    和python有很多相似的地方;

    dsl:领域特定语言;

    学习下 groovy:数据处理和逻辑判断,条件,函数后,你的jenkinsfile会更加灵活。

    groovy官网

    https://groovy.apache.org/

    groovy语法参考:http://groovy-lang.org/syntax.html

    image-20220423124049983

    2. 实战:《groovy配置开发环境》-泽阳-2022.4.23(测试成功)

    image-20220421084226461

    实际测试过程

    • 实验环境

      jdk版本:openjdk version "1.8.0_322"
      centos7.6虚机
      
    • 实验软件

      链接:https://pan.baidu.com/s/1GKaCvXyU0WF2rTrWffx37A?pwd=7r9p
      提取码:7r9p

      2022.4.23-share-JenkinsPipelineAsCode实验代码

      image-20220423175636767

    • 前置条件

      jdk环境已安装;
      
    • 1️⃣ 下载groovy安装包

    https://groovy.apache.org/

    image-20220421084920233

    image-20220421085004773

    • 2️⃣ 设置环境变量并配置

    将安装包上传到服务器上

    (1)上传
    [root@devops ~]#ll -h apache-groovy-sdk-4.0.1.zip 
    -rw-r--r-- 1 root root 57M Apr 21 08:57 apache-groovy-sdk-4.0.1.zip
    
    (2)解压
    [root@devops ~]#unzip apache-groovy-sdk-4.0.1.zip -d /usr/local/
    [root@devops ~]#cd /usr/local/groovy-4.0.1/
    [root@devops groovy-4.0.1]#ls
    bin  conf  doc  grooid  lib  LICENSE  licenses  NOTICE  src
    [root@devops groovy-4.0.1]#cd bin/
    [root@devops bin]#ls
    grape             groovy.bat          groovy_completion         groovydoc             groovysh             java2groovy.bat
    grape.bat         groovyc             groovyConsole             groovydoc.bat         groovysh.bat         startGroovy
    grape_completion  groovyc.bat         groovyConsole.bat         groovydoc_completion  groovysh_completion  startGroovy.bat
    groovy            groovyc_completion  groovyConsole_completion  groovy.ico            java2groovy
    [root@devops bin]#
    
    (3)设置环境变量
    [root@devops ~]#vim /etc/profile
    ……
    export GROOVY_HOME=/usr/local/groovy-4.0.1
    export PATH=$JAVA_HOME/bin:$GROOVY_HOME/bin:$PATH
    [root@devops groovy-4.0.1]#source /etc/profile
    
    • 3️⃣ 验证
    [root@devops ~]#groovysh
    Apr 21, 2022 11:25:39 AM java.util.prefs.FileSystemPreferences$1 run
    INFO: Created user preferences directory.
    Groovy Shell (4.0.1, JVM: 1.8.0_322)
    Type ':help' or ':h' for help.
    groovy:000> println("hello world")
    hello world
    ===> null
    groovy:000> 
    

    注意:另一种方法,也是可以在jenkins的web终端里进行测试goorvy代码

    1.可以在回放里进行测试(回放里写的代码都是groovy代码)

    image-20220421131040322

    image-20220421131102027

    2.在系统管理-脚本命令行里打开写代码即可

    image-20220421131208009

    image-20220421131235941

    image-20220421131247087

    或者直接在后面加个script即可打开:

    http://172.29.9.101:8080/script

    自己本次如何测试groovy代码呢?

    image-20220421132141757

    在本地winodws笔记本的vscode里编写代码,然后通过sftp插件会实时同步到linux服务器上,然后linux服务器上安装groovy环境,命令测试即可!

    groovy vscode插件

    image-20220423170101714

    但是:这里的波浪线颜色代表什么意思呢?

    image-20220423170140485

    3.注释

    image-20220421130522492

    4.String字符串

    image-20220421132621085

    image-20220421132726001

    image-20220421132738804

    1、字符串的定义与引用

    image-20220421132657232

    groovy不是强类型的。

    关于单引号和双引号的区别

    有变量的话,就必须要使用双引号; 没变量的话,任选其中一个方式就好;

    示例

    image-20220421154159771

    String name = 'jenkins'
    name = 'xyy'
    
    fulllName = "i love you ${name}"
    println(fulllName)
    
    text = """
    a=1,
    b=2
    c=3
    ${name}
    """
    
    println(text)
    

    后面在做流水线的时候,更多的做的事字符串的数据处理。

    2、字符串分割操作

    image-20220423125629449

    示例

    image-20220423130312403

    // 字符串分割操作
    // 业务名称-应用名称-类型_环境
    jobName = "devops-t1-service_DEV"
    buName = jobName.split("-")[0] //list ["devops", "t1", "service_DEV"]
    println(jobName.split("-")[0])
    println(jobName.split("-")[-1])
    

    3、是否包含Release字符串

    image-20220423130500981

    示例

    image-20220423130419142

    // // 分支名称
    branchName = "release-1.1.1"
    containsRelease = branchName.contains("release")
    println(containsRelease)
    

    4、字符串的长度

    image-20220423130556380

    示例

    image-20220423130757862

    // // 字符串长度测试
    branchName = "release-1.1.1"
    strs = branchName.split("-")
    println(strs.size())
    println(strs[0].length())
    
    // 注意:列表是没有length()方法的!
    

    5、使用变量作为值

    image-20220423131148185

    示例

    image-20220423131123202

    // 使用变量作为值
    name = "xyy"
    def message = "hello ${name}"
    println(message)
    println(message.toString())
    

    6、获取字符串元素索引值:indexOf

    image-20220423131305838

    示例

    image-20220423131428362

    // 获取字符串元素索引值:indexOf
    str = "release-1.1.2"
    println(str.indexOf("-"))
    

    7、判断字符串以DEV结尾:endsWith

    image-20220423131456134

    示例

    image-20220423131542081

    // 判断字符串以DEV结尾:endsWith
    jobName = "app-service-dev"
    println(jobName.endsWith("dev"))
    

    8、字符串增添操作

    image-20220423131637713

    示例

    image-20220423131942260

    // 字符串增添操作
    log = "error:xxxxx aa"
    println(log.minus("a"))
    println(log - "a")
    println(log.plus("aa"))
    println(log + "aa")
    

    9、字符串反转

    image-20220423132020269

    示例

    image-20220423132140509

    // 字符串反转
    nums = "1234567"
    println(nums.reverse())
    

    5.list 列表

    image-20220421212504783

    1、列表的定义

    image-20220423133052465

    示例:列表的定义与引用

    image-20220423133126838

    // 列表的定义与引用
    mystatus = ["hg", "xyy", "happy"]
    mystatus = mystatus + "sad"
    println(mystatus)
    mystatus = mystatus - "happy"
    println(mystatus)
    println(mystatus << "k8s")
    

    2、判断列表是否为空

    image-20220423133203963

    示例

    image-20220423133322868

    //判断列表是否为空
    mystatus = ["hg", "xyy", "happy"]
    println(mystatus.isEmpty())
    

    3、列表去重

    image-20220423133533451

    示例

    image-20220423133523472

    // 列表去重
    myList = ["hg", "xyy", "happy", "hg"]
    println(myList.unique())
    

    4、列表反转

    image-20220423133615136

    示例

    image-20220423162255718

    // 列表反转
    myList = ["hg", "xyy", "happy", "hg"]
    println(myList.reverse())
    

    5、列表排序

    image-20220423162523117

    示例

    image-20220423162455242

    // 列表排序
    myList = ["hg", "xyy", "happy", "hg"]
    println(myList.sort())
    

    6、判断列表是否包含元素

    image-20220423162633482

    示例

    image-20220423162753299

    // 判断列表是否包含元素
    myList = ["hg", "xyy", "happy", "hg"]
    println(myList.contains("xyy"))
    

    7、列表的长度

    image-20220423162829285

    示例

    image-20220423162932573

    // 列表的长度
    myList = ["hg", "xyy", "happy", "sad"]
    println(myList.size())
    

    8、扩展列表定义方式

    image-20220423163421874

    示例

    image-20220423163355370

    // 扩展列表定义方式
    listName = ["hg", "xyy", "happy"]
    newListName = [1, 2, 3, 4] as int[]
    println(listName)
    println(newListName)
    

    9、通过索引获取列表元素

    image-20220423163440951

    示例

    // 通过索引获取列表元素
    listName = ["hg", "xyy", "happy"]
    println(listName[1])
    

    10、计算列表中元素出现的次数

    image-20220423163635080

    示例

    image-20220423163824052

    // 计算列表中元素出现的次数
    listName = ["hg", "xyy", "happy", "sad", "sad"]
    println(listName.count("sad"))
    

    6.map映射

    image-20220421212624042

    image-20220422073542240

    image-20220422080406650

    1、定义map

    image-20220423164022594

    示例

    image-20220423164336942

    // 定义map
    mytools = [
    "mvn": "/usr/local/maven",
    "gradle": "/usr/local/gradle"
    ]
    println(mytools)
    

    2、根据key获取value

    image-20220423164430167

    image-20220423165015680

    示例1

    image-20220423164524690

    // 根据key获取value
    mytools = [
    "mvn": "/usr/local/maven",
    "gradle": "/usr/local/gradle"
    ]
    println(mytools["mvn"])
    println(mytools["gradle"])
    

    示例1:get()方法

    image-20220423164948519

    3、根据key重新赋值

    image-20220423164607072

    示例

    image-20220423164726146

    // 根据key重新赋值
    mytools = [
    "mvn": "/usr/local/maven",
    "gradle": "/usr/local/gradle"
    ]
    mytools["mvn"] = "/opt/local/maven"
    println(mytools)
    mytools["gradle"] = "/opt/local/gradle"
    println(mytools)
    

    4、判断map是否包含某个key或者value

    image-20220423165155475

    示例

    image-20220423165129807

    // 判断map是否包含某个key或者value
    mytools = [
    "mvn": "/usr/local/maven",
    "gradle": "/usr/local/gradle"
    ]
    println(mytools.containsKey("gradle"))
    println(mytools.containsValue("/usr/local/gradle"))
    

    5、返回map的key列表

    image-20220423165404982

    示例

    image-20220423165337829

    // 返回map的key列表
    mytools = [
    "mvn": "/usr/local/maven",
    "gradle": "/usr/local/gradle"
    ]
    println(mytools.keySet())
    

    6、根据key删除元素

    image-20220423165528559

    示例

    image-20220423165505908

    // 根据key删除元素
    mytools = [
    "mvn": "/usr/local/maven",
    "gradle": "/usr/local/gradle"
    ]
    println(mytools.remove("mvn"))
    println(mytools)
    

    7.条件语句

    image-20220422074536526

    1、if语句

    image-20220422074555999

    示例

    image-20220422084533514

    image-20220422084543228

    /*
    定义变量参数branchName
    如果branchName 等于dev则打印dev,
    如果branchName 等于test则打印test,
    上面都不匹配则打印skipdeploy
    */
    
    branchName = "dev"
    if (branchName == "dev"){
        println("dev……")
    } else if (branchName == "test"){
        println("test……")
    } else {
        println("skipdeploy……")
    }
    

    2、switch语句

    image-20220422074604654

    示例

    image-20220422085221461

    /*
    定义参数branchName
    匹配develop则打印develop ,跳出。
    匹配release则打印re7ease ,跳出。
    默认匹配,打印error ,退出。
    */
    
    branchName = "release"
    switch(branchName) {
        case "develop":
            println("develop……")
            break
        case "release":
            println("releae……")
            break
        default: 
            println("error……")
    }
    

    8.for循环

    image-20220422074619554

    1、遍历list

    方法1:

    image-20220422123150536

    tools = ["jenkins", "gitlab", "maven", "sonarqube"]
    
    for (tool in tools){
        println(tool)
    }
    

    方法2:

    image-20220422123553776

    tools = ["jenkins", "gitlab", "maven", "sonarqube"]
    tools.size().times{ i ->
        println(i)
    }
    tools.size().times{ i ->
        println(tools[i])
    }
    

    2、循环几次

    image-20220422124551068

    5.times{
        print("love")
    }
    5.times{
        println("love")
    }
    

    3、遍历0-9,打印

    image-20220422124905883

    for (i=1; i<10; i++){
        println(i)
    }
    

    9.while循环

    image-20220422074633853

    代码测试

    image-20220422125312574

    // while循环
    name = "jenkins"
    while (name == "jenkins"){
        println("true……")
        name = "lisi"
    }
    

    10.异常处理

    image-20220422074648277

    image-20220422074654866

    示例

    image-20220422131720152

    /*
    如果println(a,b)失败(肯定失败,因为有语法错误)
    catch捕隶错误,并打印错误。
    finally总是执行。
    */
    
    try {
        println(a, b)
    }
    catch(Exception e){
        println(e)
    }
    finally{
        println("done")
    }
    

    流水线示例

    编写代码:

    image-20220422141757510

    pipeline {
        agent { label "build" }
        stages{
            stage("try"){
                steps{
                    script{
                        try {
                            sh "hello world"
                        }
                        catch(Exception e){
                            println(e)
                        }
                        finally{
                            println("catch error……")
                        }
                    }
                }
            }
        }
    }
    

    构建:

    image-20220422141745134

    示例:agent的另一种写法

    编写代码:

    image-20220422142254182

    pipeline {
        agent {
            node {
                label "build"
                customWorkspace "/opt/love"
            }
        }
        stages{
            stage("demo"){
                steps{
                    script{
                        try {
                            sh "hello world"
                        }
                        catch(Exception e){
                            println(e)
                        }
                        finally{
                            println("catch error……")
                        }
                    }
                }
            }
        }
    }
    

    构建:

    image-20220422142243803

    示例:currentBuild.description全局变量使用

    image-20220422142515210

    编写代码:

    image-20220422142829055

    pipeline {
        agent {
            node {
                label "build"
                customWorkspace "/opt/love"
            }
        }
        stages{
            stage("demo"){
                steps{
                    script{
                        try {
                            sh "mvn cleaner"
                        }
                        catch(Exception e){
                            println(e)
                            currentBuild.description = "mvn error"
                        }
                        finally{
                            println("catch error……")
                        }
                    }
                }
            }
        }
    }
    

    验证:

    image-20220422142707648

    11.函数

    image-20220422074707825

    示例

    编写代码:

    image-20220422144447491

    pipeline {
        agent {
            label "build"
        }
        stages {
            stage("demo") {
                steps {
                    script {
                      PrintMsg("Jenkins")  
                    }
                }
            }
        }
    }
    
    def PrintMsg(value){
        println(value)
    }
    

    构建:

    image-20220422144418178

    2、Jenkins 共享库

    image-20220422074722347

    1.什么是共享库

    image-20220422074820169

    学习jenkins的核心,也就是想学习下jenkins共享库;

    2.共享库目录结构

    image-20220422074900637

    src:存放功能函数

    vars:存放流水线模板

    resorces:存放一些配置文件

    3. 实战:《Jenkins共享库实践》-泽阳-2022.4.22

    image-20220422074915945

    实验环境

    Jenkins 2.332.2(已安装好jenkins环境)
    win10笔记本
    

    实验软件

    链接:https://pan.baidu.com/s/1GKaCvXyU0WF2rTrWffx37A?pwd=7r9p
    提取码:7r9p

    2022.4.23-share-JenkinsPipelineAsCode实验代码

    image-20220423175839045

    老师文档

    image-20220422074946472

    image-20220422075005297

    image-20220422075030705

    image-20220422075045947

    image-20220422075057744

    1.创建共享库

    登录自己github账号,创建一个公有仓库:devops04-library

    image-20220422221950842

    image-20220422222012811

    image-20220422222024652

    2.添加Groovy类文件

    ⚠️ 注意:老师当时测试是直接在github上创建相应目录及文件:Devops04-library/src/org/devops/utils.groovy,然后直接提交的。

    因本人这里win10笔记本已经有了git环境,因此这里在本地将刚才创建的仓库clone到本地,然后创建相应目录及文件,过程如下

    (1)克隆仓库到本地
    hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop
    $ git clone git@github.com:OnlyOnexl/devops04-library.git
    Cloning into 'devops04-library'...
    remote: Enumerating objects: 3, done.
    remote: Counting objects: 100% (3/3), done.
    Receiving objects: 100% (3/3), done.
    remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
    
    hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop
    $ cd devops04-library/
    
    (2)创建相应目录及文件
    hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/devops04-library (main)
    $ mkdir -p src/org/devops
    
    hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/devops04-library (main)
    $ vim src/org/devops/utils.groovy
    package org.devops
    
    def PrintMsg(value){
        println(value)
    }
    
    (3)提交
    hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/devops04-library (main)
    $ git add -A
    warning: LF will be replaced by CRLF in src/org/devops/utils.groovy.
    The file will have its original line endings in your working directory.
    
    hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/devops04-library (main)
    $ git commit -m"create src/org/devops/utils.groovy"
    [main f594076] create src/org/devops/utils.groovy
     1 file changed, 5 insertions(+)
     create mode 100644 src/org/devops/utils.groovy
    
    hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/devops04-library (main)
    $ git push
    Counting objects: 6, done.
    Delta compression using up to 8 threads.
    Compressing objects: 100% (3/3), done.
    Writing objects: 100% (6/6), 466 bytes | 93.00 KiB/s, done.
    Total 6 (delta 0), reused 0 (delta 0)
    To github.com:OnlyOnexl/devops04-library.git
       eb6b8b8..f594076  main -> main
    

    此时,我们再到github仓库界面看下现象:

    image-20220423092642185

    可以看到文件被正常推送上来了。

    3.使用共享库

    点击系统配置

    image-20220422183300381

    往下拉,找到Global Pipeline Libararies,点击新增,添加仓库信息:

    ⚠️ 注意:

    • 这里的Name不一定和刚才创建的仓库名称一样,只是一个别名而已;
    • 这里的Default version填的是仓库的分支名称;

    image-20220423094558346

    填写完成后,点击保存。

    共享库是可以配置多个的!

    接下来,我们编写下jenkinsfile文件:

    编写jenkinsfile代码:

    函数是可以写在pipeline里面,也是可以写在外面的;

    _ 加载到当前jenkinsfile里所有的;

    image-20220423093416164

    @Library("mylib") _
    
    def myutil = new org.devops.utils()
    
    pipeline {
        agent { label "build"}
        stages {
            stage("build") {
                steps {
                    script {
                        myutil.PrintMsg("jenkins")
                    }
                }
    
            }
        }
    }
    

    构建:

    image-20220423094412297

    gitee测试效果

    image-20220423092840775

    image-20220423092855218

    编写jenkinsfile代码:

    image-20220423093416164

    @Library("mylib") _
    
    def myutil = new org.devops.utils()
    
    pipeline {
        agent { label "build"}
        stages {
            stage("build") {
                steps {
                    script {
                        myutil.PrintMsg("jenkins")
                    }
                }
    
            }
        }
    }
    

    构建结果:

    image-20220423093227491

    注意

    image-20220422212302263

    image-20220423094743745

    关于我

    我的博客主旨:我希望每一个人拿着我的博客都可以做出实验现象,先把实验做出来,然后再结合理论知识更深层次去理解技术点,这样学习起来才有乐趣和动力。并且,我的博客内容步骤是很完整的,也分享源码和实验用到的软件,希望能和大家一起共同进步!

    各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人免费帮您解决问题:

    1. 个人微信二维码:x2675263825 (舍得), qq:2675263825。

      image-20211002091450217

    2. 个人微信公众号:云原生架构师实战

      image-20211002141739664

    3. 个人博客地址:www.onlyonexl.cn

      image-20211002092057988

    4. 个人csdn

      https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

      image-20211002092344616

    5. 个人已开源干货

      不服来怼:宇宙中最好用的云笔记 & 其他开源干货:https://www.yuque.com/go/doc/73723298?#

      image-20220423100718009

    最后

    好了,关于Jenkins Pipelin扩展就到这里了,感谢大家阅读,最后贴上我女神的photo,祝大家生活快乐,每天都过的有意义哦,我们下期见!

    image-20220423105754515

  • 相关阅读:
    安卓第四周作业
    安卓作业。
    JSP第七周作业
    jsp第六周作业
    JSP第四周作业
    JSP第二次
    软件测试课堂练习
    JSP第一次
    Android页面
    Android作业
  • 原文地址:https://www.cnblogs.com/520ZXL/p/16183231.html
Copyright © 2020-2023  润新知