Jenkins Pipelin扩展
目录
1、groovy语法
1.Groovy简介
和python有很多相似的地方;
dsl:领域特定语言;
学习下 groovy:数据处理和逻辑判断,条件,函数后,你的jenkinsfile会更加灵活。
🍀 groovy官网
groovy语法参考:http://groovy-lang.org/syntax.html
2.💘 实战:《groovy配置开发环境》-泽阳-2022.4.23(测试成功)
🍀 实际测试过程
-
实验环境
jdk版本:openjdk version "1.8.0_322" centos7.6虚机
-
实验软件
链接:https://pan.baidu.com/s/1GKaCvXyU0WF2rTrWffx37A?pwd=7r9p
提取码:7r9p2022.4.23-share-JenkinsPipelineAsCode实验代码
-
前置条件
jdk环境已安装;
-
1️⃣ 下载groovy安装包
- 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代码)
2.在系统管理-脚本命令行
里打开写代码即可
或者直接在后面加个script
即可打开:
http://172.29.9.101:8080/script
🍀 自己本次如何测试groovy代码呢?
在本地winodws笔记本的vscode里编写代码,然后通过sftp插件会实时同步到linux服务器上,然后linux服务器上安装groovy环境,命令测试即可!😋
🍀 groovy vscode插件
但是:这里的波浪线颜色代表什么意思呢?😥
3.注释
4.String字符串
1、字符串的定义与引用
groovy不是强类型的。
关于单引号和双引号的区别:
有变量的话,就必须要使用双引号; 没变量的话,任选其中一个方式就好;
🍀 示例
String name = 'jenkins'
name = 'xyy'
fulllName = "i love you ${name}"
println(fulllName)
text = """
a=1,
b=2
c=3
${name}
"""
println(text)
后面在做流水线的时候,更多的做的事字符串的数据处理。
2、字符串分割操作
🍀 示例
// 字符串分割操作
// 业务名称-应用名称-类型_环境
jobName = "devops-t1-service_DEV"
buName = jobName.split("-")[0] //list ["devops", "t1", "service_DEV"]
println(jobName.split("-")[0])
println(jobName.split("-")[-1])
3、是否包含Release字符串
🍀 示例
// // 分支名称
branchName = "release-1.1.1"
containsRelease = branchName.contains("release")
println(containsRelease)
4、字符串的长度
🍀 示例
// // 字符串长度测试
branchName = "release-1.1.1"
strs = branchName.split("-")
println(strs.size())
println(strs[0].length())
// 注意:列表是没有length()方法的!
5、使用变量作为值
🍀 示例
// 使用变量作为值
name = "xyy"
def message = "hello ${name}"
println(message)
println(message.toString())
6、获取字符串元素索引值:indexOf
🍀 示例
// 获取字符串元素索引值:indexOf
str = "release-1.1.2"
println(str.indexOf("-"))
7、判断字符串以DEV结尾:endsWith
🍀 示例
// 判断字符串以DEV结尾:endsWith
jobName = "app-service-dev"
println(jobName.endsWith("dev"))
8、字符串增添操作
🍀 示例
// 字符串增添操作
log = "error:xxxxx aa"
println(log.minus("a"))
println(log - "a")
println(log.plus("aa"))
println(log + "aa")
9、字符串反转
🍀 示例
// 字符串反转
nums = "1234567"
println(nums.reverse())
5.list 列表
1、列表的定义
🍀 示例:列表的定义与引用
// 列表的定义与引用
mystatus = ["hg", "xyy", "happy"]
mystatus = mystatus + "sad"
println(mystatus)
mystatus = mystatus - "happy"
println(mystatus)
println(mystatus << "k8s")
2、判断列表是否为空
🍀 示例
//判断列表是否为空
mystatus = ["hg", "xyy", "happy"]
println(mystatus.isEmpty())
3、列表去重
🍀 示例
// 列表去重
myList = ["hg", "xyy", "happy", "hg"]
println(myList.unique())
4、列表反转
🍀 示例
// 列表反转
myList = ["hg", "xyy", "happy", "hg"]
println(myList.reverse())
5、列表排序
🍀 示例
// 列表排序
myList = ["hg", "xyy", "happy", "hg"]
println(myList.sort())
6、判断列表是否包含元素
🍀 示例
// 判断列表是否包含元素
myList = ["hg", "xyy", "happy", "hg"]
println(myList.contains("xyy"))
7、列表的长度
🍀 示例
// 列表的长度
myList = ["hg", "xyy", "happy", "sad"]
println(myList.size())
8、扩展列表定义方式
🍀 示例
// 扩展列表定义方式
listName = ["hg", "xyy", "happy"]
newListName = [1, 2, 3, 4] as int[]
println(listName)
println(newListName)
9、通过索引获取列表元素
🍀 示例
// 通过索引获取列表元素
listName = ["hg", "xyy", "happy"]
println(listName[1])
10、计算列表中元素出现的次数
🍀 示例
// 计算列表中元素出现的次数
listName = ["hg", "xyy", "happy", "sad", "sad"]
println(listName.count("sad"))
6.map映射
1、定义map
🍀 示例
// 定义map
mytools = [
"mvn": "/usr/local/maven",
"gradle": "/usr/local/gradle"
]
println(mytools)
2、根据key获取value
🍀 示例1
// 根据key获取value
mytools = [
"mvn": "/usr/local/maven",
"gradle": "/usr/local/gradle"
]
println(mytools["mvn"])
println(mytools["gradle"])
🍀 示例1:get()方法
3、根据key重新赋值
🍀 示例
// 根据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
🍀 示例
// 判断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列表
🍀 示例
// 返回map的key列表
mytools = [
"mvn": "/usr/local/maven",
"gradle": "/usr/local/gradle"
]
println(mytools.keySet())
6、根据key删除元素
🍀 示例
// 根据key删除元素
mytools = [
"mvn": "/usr/local/maven",
"gradle": "/usr/local/gradle"
]
println(mytools.remove("mvn"))
println(mytools)
7.条件语句
1、if语句
🍀 示例
/*
定义变量参数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语句
🍀 示例
/*
定义参数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循环
1、遍历list
🍀 方法1:
tools = ["jenkins", "gitlab", "maven", "sonarqube"]
for (tool in tools){
println(tool)
}
🍀 方法2:
tools = ["jenkins", "gitlab", "maven", "sonarqube"]
tools.size().times{ i ->
println(i)
}
tools.size().times{ i ->
println(tools[i])
}
2、循环几次
5.times{
print("love")
}
5.times{
println("love")
}
3、遍历0-9,打印
for (i=1; i<10; i++){
println(i)
}
9.while循环
🍀 代码测试
// while循环
name = "jenkins"
while (name == "jenkins"){
println("true……")
name = "lisi"
}
10.异常处理
🍀 示例
/*
如果println(a,b)失败(肯定失败,因为有语法错误)
catch捕隶错误,并打印错误。
finally总是执行。
*/
try {
println(a, b)
}
catch(Exception e){
println(e)
}
finally{
println("done")
}
🍀 流水线示例
编写代码:
pipeline {
agent { label "build" }
stages{
stage("try"){
steps{
script{
try {
sh "hello world"
}
catch(Exception e){
println(e)
}
finally{
println("catch error……")
}
}
}
}
}
}
构建:
🍀 示例:agent的另一种写法
编写代码:
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……")
}
}
}
}
}
}
构建:
🍀 示例:currentBuild.description全局变量使用
编写代码:
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……")
}
}
}
}
}
}
验证:
11.函数
🍀 示例
编写代码:
pipeline {
agent {
label "build"
}
stages {
stage("demo") {
steps {
script {
PrintMsg("Jenkins")
}
}
}
}
}
def PrintMsg(value){
println(value)
}
构建:
2、Jenkins 共享库
1.什么是共享库
学习jenkins的核心,也就是想学习下jenkins共享库;
2.共享库目录结构
src:存放功能函数
vars:存放流水线模板
resorces:存放一些配置文件
3.💘 实战:《Jenkins共享库实践》-泽阳-2022.4.22
实验环境
Jenkins 2.332.2(已安装好jenkins环境)
win10笔记本
实验软件
链接:https://pan.baidu.com/s/1GKaCvXyU0WF2rTrWffx37A?pwd=7r9p
提取码:7r9p
2022.4.23-share-JenkinsPipelineAsCode实验代码
老师文档
1.创建共享库
登录自己github账号,创建一个公有仓库:devops04-library
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仓库界面看下现象:
可以看到文件被正常推送上来了。
3.使用共享库
点击系统配置
:
往下拉,找到Global Pipeline Libararies
,点击新增,添加仓库信息:
⚠️ 注意:
- 这里的Name不一定和刚才创建的仓库名称一样,只是一个别名而已;
- 这里的Default version填的是仓库的分支名称;
填写完成后,点击保存。
共享库是可以配置多个的!
接下来,我们编写下jenkinsfile文件:
编写jenkinsfile代码:
函数是可以写在pipeline里面,也是可以写在外面的;
_ 加载到当前jenkinsfile里所有的
;😥
@Library("mylib") _
def myutil = new org.devops.utils()
pipeline {
agent { label "build"}
stages {
stage("build") {
steps {
script {
myutil.PrintMsg("jenkins")
}
}
}
}
}
构建:
🍀 gitee测试效果
编写jenkinsfile代码:
@Library("mylib") _
def myutil = new org.devops.utils()
pipeline {
agent { label "build"}
stages {
stage("build") {
steps {
script {
myutil.PrintMsg("jenkins")
}
}
}
}
}
构建结果:
注意
🍀
关于我
我的博客主旨:我希望每一个人拿着我的博客都可以做出实验现象,先把实验做出来,然后再结合理论知识更深层次去理解技术点,这样学习起来才有乐趣和动力。并且,我的博客内容步骤是很完整的,也分享源码和实验用到的软件,希望能和大家一起共同进步!
各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人免费帮您解决问题:
-
个人微信二维码:x2675263825 (舍得), qq:2675263825。
-
个人微信公众号:云原生架构师实战
-
个人博客地址:www.onlyonexl.cn
-
个人csdn
https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421
-
个人已开源干货😘
不服来怼:宇宙中最好用的云笔记 & 其他开源干货:https://www.yuque.com/go/doc/73723298?#
最后
好了,关于Jenkins Pipelin扩展就到这里了,感谢大家阅读,最后贴上我女神的photo,祝大家生活快乐,每天都过的有意义哦,我们下期见!