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

posted @ 2022-04-23 18:35  一念一生,One  阅读(266)  评论(0编辑  收藏  举报