1 基本概述
Groovy是一种功能强大,可选类型和动态语言,支持Java平台。
旨在提高开发人员的生产力得益于简洁,熟悉且简单易学的语法。
可以与任何Java程序顺利集成,并立即为您的应用程序提供强大的功能,包括脚本编写功能,特定领域语言编写,运行时和编译时元编程以及函数式编程。
2 下载安装
https://groovy.apache.org/download.html
下载安装包(先安装JDK)
解压安装包
获取安装包bin目录
设置环境变量写入/etc/profile文件
Jenkins里面就带了groovy命令练习的地方
系统管理-->脚本命令行
String branchName = 'release-1.1.1'
println(branchName.split('-'))
println(branchName.split('-')[-1])
String test='1.1-1.2-1.3'
for ( i in test.split('-') ){
println(i)
}
3 注释
- 单行注释 //
- 多行注释 /**/
4 Groovy数据类型
4.1 String
字符串表示方式: 单引号、双引号、三单双引号。(涉及到变量的时候使用双引号)
//定义一个字符串类型变量
String name='qingchen'
//定义一个变量包含多行内容
String multiline='''
hello
word
'''
//字符串分割操作,变为列表
String branchName="release-1.1.1"
println(branchName.split('-')) //[release, 1.1.1]
//是否包含release字符串
println(branchName.contains("release")) //true
//字符串的长度
println(branchName.size()) //13
println(branchName.length()) //13
//使用变量作为值
def message="hello ${name}" //hello qingchen
//判断字符串以DEV结尾
String jobName="test-service.DEV"
println(jobName.endsWith("DEV")) //true
//字符串增删操作
String log="error: XXXXXX aa"
println(log.minus("a")) //error: XXXXXX a
println(log - "a") //error: XXXXXX a
println(log.plus("a")) //error: XXXXXX aaa
println(log + "a") //error: XXXXXX aaa
//字符串反转
String nums='123456'
println(nums.reverse()) //654321
//类型转换
Integer age=11
println(age.getClass()) //class java.lang.Integer
println(age.toString().getClass()) //class java.lang.String
4.2 List
//list
def mylist=[1,1,'java','maven']
println(mylist) //[1, 1, java, maven]
//list元素增删
println(mylist + "nodejs") //[1, 1, java, maven, nodejs]
println(mylist - 'java') //[1, 1, maven]
println(mylist << 'java') //[1, 1, java, maven, java]
def newlist=mylist.add("java")
println(newlist) //true
//判断元素是否为空
println(mylist.isEmpty()) //false
//列表去重
println(mylist.unique()) //[1, java, maven]
//列表反转
println(mylist.reverse()) //[maven, java, 1]
//列表排序
println(mylist.sort()) //[1, java, maven]
//判断列表是否包含元素
println(mylist.contains('java')) //true
//列表的长度
println(mylist.size()) //3
//扩展列表定义方式
String[] stu_name=['zhangsan','lisi','wangwu'] //[zhangsan, lisi, wangwu]
def numlist=[1,2,3,4,4] as int[] //[1, 2, 3, 4, 4]
//通过索引获取列表元素
println(mylist[1]) //java
//计算列表中元素出现的次数
println(numlist.count(4)) //2
//遍历列表
for (i in stu_name)
println('hello '+i)
//使用each遍历列表,值为变量it
stu_name.each{
println('hello '+it)
}
4.3 map
//定义map
def mytools=['mvn': '/usr/local/maven',
'gradle': '/usr/local/gradle']
//根据key获取value
println(mytools['mvn']) ///usr/local/maven
println(mytools['gradle']) ///usr/local/gradle
//根据key重新赋值value
mytools['mvn']='/opt/local/maven'
println(mytools['mvn']) ///opt/local/maven
//获取key的value
println(mytools.get('mvn')) ///opt/local/maven
//判断map是否包含某个key或者value
println(mytools.containsKey('mvn')) //true
println(mytools.containsValue('/var/local/gradle')) //false
//返回map的key列表
println(mytools.keySet()) //[mvn, gradle]
//根据key删除元素
println(mytools.remove('mvn')) ///opt/local/maven
println(mytools) //[gradle:/usr/local/gradle]
map的put用法
def maptest=[:]
maptest.put('name','zhangsan')
maptest.put('age',14)
maptest.put('like','book')
println(maptest.name) //zhangsan
5 异常处理
在流水线里面一定要做异常处理,如果不做异常处理就会导致流水线直接报错,有些报错可以容忍,那么就可以去捕获异常,避免它报错。
/*
如果println(a,b)失败(肯定失败,因为有语法错误)
catch捕获错误,并打印错误。
finally 总是执行。
*/
try {
println(a,b)
}
catch(Exception e) {
println(e) //groovy.lang.MissingPropertyException: No such property: a for class: Script1
}
finally {
println("done") //done
}
6 条件语句
6.1 if
buildType='maven'
//this is a maven project
if (buildType=="maven") {
println("this is a maven project")
} else if (buildType=="gradle") {
println("this is a gradle project")
} else {
println("this is a error type")
}
6.2 switch
写switch语句的时候记得跳出break,如果不跳出就会继续往下执行
buildType='maven'
switch("${buildType}"){
case 'maven':
println("this is a maven project")
break
;;
case 'gradle':
println("this is a gradle project")
break
;;
default:
println("project type error")
;;
}
7 循环语句
7.1 for
//遍历1-9
for (i=1;i<10;i++) {
println(i)
}
//循环5次
5.times {
println("hello world")
}
//5.times就是循环5次。类似于c语言的for循环格式,还有一个就是自己的循环。最后还有一个遍历的就是for循环。
//遍历0-4
5.times { i ->
println(i)
}
//遍历list
langs=['java','python','groovy']
for (i in langs){
if ( i=='java' ){
println("lang error in java")
}else{
println("lang is ${i}")
}
}
//使用each遍历map
def stus=['name': 'zhangsan','age': 20]
stus.each{ k,v ->
println(k+" == "+v) //name == zhangsan age == 20
}
//使用for遍历map
for ( k in stus.keySet() ){
println(k+" === "+stus[k]) //name === zhangsan age === 20
}
7.2 while
while循环语句(就是一个死循环,在pipeline场景里面一般使用不到,while就是一直去运行,直到条件被改变)
while (true){
println('...')
}
8 函数
def printMes(value){
println(value)
return "hello "+value
}
response=printMes('Devops') //会输出Devops
println(response) //hello Devops
9 正则表达式
String getBranch(String branchName){
def matcher=(branchName =~ "RELEASE-[0-9]{4}")
if (matcher.find()){
newBranchName=matcher[0]
}else{
newBranchName=branchName
}
newBranchName
}
newBranchName=getBranch('RELEASE-20240726')
println("新分支名---> ${newBranchName}") //新分支名---> RELEASE-2024