Skip to content

官方文档,http://groovy-lang.org/

1.介绍

Groovy是构建在JVM上的一个轻量级却强大的动态语言, 它结合了Python、Ruby和Smalltalk的许多强大的特性.

Groovy就是用Java写的 , Groovy语法与Java语法类似, Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码, 相对于Java, 它在编写代码的灵活性上有非常明显的提升,Groovy 可以使用其他 Java 语言编写的库

  1. def关键字定义的变量类型都是Object, 任何变量, 方法都能用def定义/声明 , 在 Groovy 中 “一切都是对象 "
  2. 不需要分号
  3. return关键字可省略, 方法的最后一句表达式可作为返回值返回

1.安装

依赖jdk

2.语法

2.0注释

shell
//  单行注释   
  
/*
    多行注释
*/
//  单行注释   
  
/*
    多行注释
*/

2.1数据类型string

官方文档,http://groovy-lang.org/syntax.html

  • 字符串表示,单引号、双引号、三引号
  • 三双引号和三单引号都支持换行,==只有三双引号支持插值==
方法说明
contains()是否包含特定内容,返回true false
size()字符串数量大小长度
length()字符串数量大小长度
toString()转换成string类型
indexOf()元素的索引
endsWith()/startsWith是否指定字符结尾/开始
minus()/plus()去掉、增加字符串
reverse()反向排序
substring(1,2)字符串的指定索引开始的子字符串
toUpperCase()字符串转换大写
toLowerCase()字符串转换小写
split()字符串分割 默认空格分割 返回列表

contains

groovy
groovy> "helladmin".contains("admin") 
 
Result: true
groovy> "helladmin".contains("admin") 
 
Result: true
groovy
script{
                    name = "yuanyuan-gao"
                    String Version = "release-1.2.3"
                    println(Version.contains("release"))
}
script{
                    name = "yuanyuan-gao"
                    String Version = "release-1.2.3"
                    println(Version.contains("release"))
}

endsWith

groovy
groovy> "hellkill".endsWith("kill") 
 
Result: true
groovy> "hellkill".endsWith("kill") 
 
Result: true

startWith

groovy
//判断字符串以DEV结尾/test开头

String jobName = "test-service_DEV"
println(jobName.endsWith("DEV"))
println(jobName.startsWith("test"))
//判断字符串以DEV结尾/test开头

String jobName = "test-service_DEV"
println(jobName.endsWith("DEV"))
println(jobName.startsWith("test"))

size

groovy
groovy> "hellkill".size() 
 
Result: 8

//字符串的长度
println(branchName.size()) 
println(branchName.length())
groovy> "hellkill".size() 
 
Result: 8

//字符串的长度
println(branchName.size()) 
println(branchName.length())

+/-

groovy
groovy> "hellokill" - "hello" 
 
Result: kill
groovy> "hellokill" - "hello" 
 
Result: kill
groovy
//字符串增添操作拼接
String log = "error: xxxxxx aa"
println(log.minus("a"))
println(log - "a")
println(log.plus("aa"))
println(log + "aa")
//字符串增添操作拼接
String log = "error: xxxxxx aa"
println(log.minus("a"))
println(log - "a")
println(log.plus("aa"))
println(log + "aa")

split

groovy
groovy> host = "host01,host02,host03".split(',') 
groovy> println(host) 
 
[host01, host02, host03]



//案例
String branchName = "release-1.1.1" println(branchName.split("-")[1])
效果:
[release, 1.1.1]
 
String branchName = "release-1.1.1"
println(branchName.split("-")[0])
效果:
[release]
 
-1就是从最后一个开始
println(branchName.split("-")[-1])
效果:
[release]
 
println("${env.JOB_NAME}".split("-")[0])
groovy> host = "host01,host02,host03".split(',') 
groovy> println(host) 
 
[host01, host02, host03]



//案例
String branchName = "release-1.1.1" println(branchName.split("-")[1])
效果:
[release, 1.1.1]
 
String branchName = "release-1.1.1"
println(branchName.split("-")[0])
效果:
[release]
 
-1就是从最后一个开始
println(branchName.split("-")[-1])
效果:
[release]
 
println("${env.JOB_NAME}".split("-")[0])

indexOf

groovy
println(branchName.indexOf("-"))
println(branchName.indexOf("-"))

2.2数据类型list

Groovy同样支持java.util.List类型,在Groovy中同样允许向列表中增加或者删除对象,允许在运行时改变列表的大小,保存在列表中的对象不受类型的限制;此外还可以通过超出列表范围的数来索引列表

列表符号,[]

方法参数
+ - += -=元素增加减少
add() 或者 <<<<添加元素
isEmpty()判断是否为空
intersect([2,3])取交集
disjoint([1])判断是否有交集
flatten()合并嵌套的列表
unique()去重
reverse()反转
sort()升序
count()元素个数
join()将元素按照参数链接
sum()求和
min()最小值
max()最大值
contains()包含特定元素
remove(2) removeAll()
each{}遍历

+

groovy
groovy> [1,2,3,4] + 4 
 
Result: [1, 2, 3, 4, 4]
groovy> [1,2,3,4] + 4 
 
Result: [1, 2, 3, 4, 4]

<<

groovy
groovy> [1,2,3,4] << 14 
 
Result: [1, 2, 3, 4, 14
groovy> [1,2,3,4] << 14 
 
Result: [1, 2, 3, 4, 14

add

groovy
groovy> [1,2,3,4].add(14) 
 
Result: true
groovy> [1,2,3,4].add(14) 
 
Result: true

unique

groovy
groovy> [1,2,3,4,56,3,2,1].unique() 
 
Result: [1, 2, 3, 4, 56]
groovy> [1,2,3,4,56,3,2,1].unique() 
 
Result: [1, 2, 3, 4, 56]

each

groovy
groovy> [1,2,3,4,56,3,2,1].each{ println it } 
 
1
2
3
4
56
3
2
1
Result: [1, 2, 3, 4, 56, 3, 2, 1]
groovy> [1,2,3,4,56,3,2,1].each{ println it } 
 
1
2
3
4
56
3
2
1
Result: [1, 2, 3, 4, 56, 3, 2, 1]
groovy
// 定义一个list并打印
 
			script{
                def mylist = ["a","b",1,2,"devops"]
                println(mylist)
			}
 
// list的元素增删
 
			script{
                def mylist = ["a","b",1,2,"devops"]
                println(mylist + "jenkins")
                println(mylist - "devops")
			}
 
 
// 判断元素是否为空
println(mylist.isEmpty())
 
// 列表去重
println(mylist.unique())
 
// 列表反转
println(mylist.reverse())
 
// 列表排序
println(mylist.sort())
 
// 判断列表是否包含元素
println(mylist.contains("devops"))
 
// 列表的长度
println(mylist.size())
 
//扩展列表定义方式
String[] stus = ["zhangsan", "lisi","wangwu"]
def numList = [1,2,3,4,4,4] as int[]
 
// 通过索引获取列表元素
println(numList[2])
 
// 计算列表中元素出现的次数
println(numList.count(4))
// 定义一个list并打印
 
			script{
                def mylist = ["a","b",1,2,"devops"]
                println(mylist)
			}
 
// list的元素增删
 
			script{
                def mylist = ["a","b",1,2,"devops"]
                println(mylist + "jenkins")
                println(mylist - "devops")
			}
 
 
// 判断元素是否为空
println(mylist.isEmpty())
 
// 列表去重
println(mylist.unique())
 
// 列表反转
println(mylist.reverse())
 
// 列表排序
println(mylist.sort())
 
// 判断列表是否包含元素
println(mylist.contains("devops"))
 
// 列表的长度
println(mylist.size())
 
//扩展列表定义方式
String[] stus = ["zhangsan", "lisi","wangwu"]
def numList = [1,2,3,4,4,4] as int[]
 
// 通过索引获取列表元素
println(numList[2])
 
// 计算列表中元素出现的次数
println(numList.count(4))

2.3数据类型map-字典

Map是“键-值”对的集合,在Groovy中键key不一定是String,可以是任何对象

表示:[:]

types = [“maven”:“mvn”]

方法说明
size() 或 map大小
['key'] .key get()获取value
isEmpty()是否为空
containKey()是否包含key
containValue()是否包含指定的value
keySet()生成key的列表
each{}遍历map
remove('a')删除元素(k-v)
groovy
// 定义map并打印出value值
 
			script{
                def mydef = ["mvn":"/usr/local/maven","jar":"/usr/local/jar"]
                println(mydef.mvn)
                println(mydef.jar)
			}
 
 
// 根据key给map重新赋值
 
			script{
                def mydef = ["mvn":"/usr/local/maven","jar":"/usr/local/jar"]
                mydef["mvn"] = "new maven"
                println(mydef.mvn)
			}
 
// 判断map是否包含某个key或者value
 
			script{
                def mydef = ["mvn":"/usr/local/maven","jar":"/usr/local/jar"]
                println(mydef.containsKey("mvn"))
			}
 
// 返回map的key 列表
 
			script{
                def mydef = ["mvn":"/usr/local/maven","jar":"/usr/local/jar"]
                println(mydef.keySet())
			}
// 定义map并打印出value值
 
			script{
                def mydef = ["mvn":"/usr/local/maven","jar":"/usr/local/jar"]
                println(mydef.mvn)
                println(mydef.jar)
			}
 
 
// 根据key给map重新赋值
 
			script{
                def mydef = ["mvn":"/usr/local/maven","jar":"/usr/local/jar"]
                mydef["mvn"] = "new maven"
                println(mydef.mvn)
			}
 
// 判断map是否包含某个key或者value
 
			script{
                def mydef = ["mvn":"/usr/local/maven","jar":"/usr/local/jar"]
                println(mydef.containsKey("mvn"))
			}
 
// 返回map的key 列表
 
			script{
                def mydef = ["mvn":"/usr/local/maven","jar":"/usr/local/jar"]
                println(mydef.keySet())
			}

2.4函数

def 定义函数

语法:

groovy
def PrintMes(value){
    println(value)
    return value
}
def PrintMes(value){
    println(value)
    return value
}

列子:

groovy
def PrintMes(info){
    if (info == "DevOps"){
      return info
    }
}
response = PrintMes("DevOps")
println(response)



//
/*
def关键字 定义函数名为PrintMes, 带有一个参数msg,语句块内容是打印msg参数的值,返回msg值。
将PrintMsg函数的执行结果返回给response变量。
打印response
*/
 
def PrintMsg(msg){
	println(msg)
	return msg
}
 
response = PrintMsg("jenkins ok okok!")
println(response)
 
也是可以在spript 中直接用
PrintMag("xx")
def PrintMes(info){
    if (info == "DevOps"){
      return info
    }
}
response = PrintMes("DevOps")
println(response)



//
/*
def关键字 定义函数名为PrintMes, 带有一个参数msg,语句块内容是打印msg参数的值,返回msg值。
将PrintMsg函数的执行结果返回给response变量。
打印response
*/
 
def PrintMsg(msg){
	println(msg)
	return msg
}
 
response = PrintMsg("jenkins ok okok!")
println(response)
 
也是可以在spript 中直接用
PrintMag("xx")

传参

groovy

def PrintMes(info){
	println(info)
}
PrintMes("hello")

//结果输出
groovy> def PrintMes(info){ 
groovy>     println(info) 
groovy> } 
groovy> PrintMes("hello") 
 
hello

def PrintMes(info){
	println(info)
}
PrintMes("hello")

//结果输出
groovy> def PrintMes(info){ 
groovy>     println(info) 
groovy> } 
groovy> PrintMes("hello") 
 
hello

2.5正则表达

语法:
@NonCPS
语法:
@NonCPS

2.6条件语句

if语句

语法:

groovy
if (表达式) {
   //xxxx
} else if(表达式2) {
   //xxxxx
} else {
   //
}
if (表达式) {
   //xxxx
} else if(表达式2) {
   //xxxxx
} else {
   //
}
  • 案例
groovy
stage('Send script') {
    def exists = fileExists './deploy/install.sh'
    if (exists) {
        sh("tar -zcvf deploy.tgz deploy/")
        sh("curl -v -u qloudinstall:qloudinstall123 -X POST 'http://qloudnexus.mart.service.sd/service/rest/v1/components?repository=qloudinstall' -H 'accept: application/json' -H 'Content-Type: multipart/form-data' -F 'raw.directory=${script_dir}' -F 'raw.asset1=@deploy.tgz;type=application/x-compressed-tar' -F 'raw.asset1.filename=deploy.tgz'")
    } else {
        println "File doesn't exist"
    }
}
stage('Send script') {
    def exists = fileExists './deploy/install.sh'
    if (exists) {
        sh("tar -zcvf deploy.tgz deploy/")
        sh("curl -v -u qloudinstall:qloudinstall123 -X POST 'http://qloudnexus.mart.service.sd/service/rest/v1/components?repository=qloudinstall' -H 'accept: application/json' -H 'Content-Type: multipart/form-data' -F 'raw.directory=${script_dir}' -F 'raw.asset1=@deploy.tgz;type=application/x-compressed-tar' -F 'raw.asset1.filename=deploy.tgz'")
    } else {
        println "File doesn't exist"
    }
}
groovy
/*
定义变量参数name
如果name 等于dev则打印dev,
如果name 等于test则打印test,
上面都不匹配则打印skipdeploy
*/
 
pipeline {
	agent { label  "master" }
	stages {
		stage("build"){
			steps{
				script{
                 	String name = "hhh"
                 	if ( name == "dev"){
                 		println("dev……")    
                 	} else if ( name == "test"){
                     	println(test……)
                 	} else {
                     	println("skipdeploy……")
                 	}
				}
			}
		}
	}
}
/*
定义变量参数name
如果name 等于dev则打印dev,
如果name 等于test则打印test,
上面都不匹配则打印skipdeploy
*/
 
pipeline {
	agent { label  "master" }
	stages {
		stage("build"){
			steps{
				script{
                 	String name = "hhh"
                 	if ( name == "dev"){
                 		println("dev……")    
                 	} else if ( name == "test"){
                     	println(test……)
                 	} else {
                     	println("skipdeploy……")
                 	}
				}
			}
		}
	}
}

switch语句

语法:

groovy
switch("${buildType}"){
    case ”maven":
    //xxxx
        break;
    case ”ant":
    //xxxx
        break;
    default:
    //xxxx
}
switch("${buildType}"){
    case ”maven":
    //xxxx
        break;
    case ”ant":
    //xxxx
        break;
    default:
    //xxxx
}
groovy
/*
定义参数branchName
匹配 develop  则打印develop ,跳出。
匹配 release  则打印release ,跳出。
默认匹配, 打印 error ,退出。
*/
 
String branchName = "release"
 
switch(branchName) {
	case "develop":
	    println("develop .....")
		break
	case "release":
		println("release.....")
		break
	default:
	    println("error。。。。。。")
}
/*
定义参数branchName
匹配 develop  则打印develop ,跳出。
匹配 release  则打印release ,跳出。
默认匹配, 打印 error ,退出。
*/
 
String branchName = "release"
 
switch(branchName) {
	case "develop":
	    println("develop .....")
		break
	case "release":
		println("release.....")
		break
	default:
	    println("error。。。。。。")
}

for循环语句

groovy
//语法
test = [1,2,3]
for ( i in test){
    ///xxxxxx
    break;
}

//代码
langs = ['java','python','groovy']

for ( lang in langs ){
    if (lang == "java"){
        println("lang error in java")
    }else {
        println("lang is ${lang}")
    }
}
//语法
test = [1,2,3]
for ( i in test){
    ///xxxxxx
    break;
}

//代码
langs = ['java','python','groovy']

for ( lang in langs ){
    if (lang == "java"){
        println("lang error in java")
    }else {
        println("lang is ${lang}")
    }
}
groovy
// 遍历0-9,打印
				script{
				    for (i=1; i<10; i++ ){
                    	println(i)
                    }
// 循环5次
5.times { 
	println("hello")
}
 
// 遍历 0-4
5.times { i ->
   println(i)
}
 
// 遍历List
def serverList = ["server-1", "server-2", "server-3"]
for ( i in serverList){
	println(i)
}
 
// 使用each遍历map
def stus = ["zeyang":"177", "jenkins":"199"]
stus.each { k, v ->
	println(k+"="+v)
}
 
// 使用for遍历map
for (k in stus.keySet()){
	println(k+"="+stus[k])
}
// 遍历0-9,打印
				script{
				    for (i=1; i<10; i++ ){
                    	println(i)
                    }
// 循环5次
5.times { 
	println("hello")
}
 
// 遍历 0-4
5.times { i ->
   println(i)
}
 
// 遍历List
def serverList = ["server-1", "server-2", "server-3"]
for ( i in serverList){
	println(i)
}
 
// 使用each遍历map
def stus = ["zeyang":"177", "jenkins":"199"]
stus.each { k, v ->
	println(k+"="+v)
}
 
// 使用for遍历map
for (k in stus.keySet()){
	println(k+"="+stus[k])
}

while语句

groovy
while(true){
    //xxxx
}



// while 循环
String name = "jenkins"
while (name == "jenkins"){
	println("true....")
	name = "lisi"
}
while(true){
    //xxxx
}



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

异常处理

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

3.调出终端

  • groovyConsole

gr

  • groovysh

4.常用DSL

4.1json数据格式化输出

groovy
def response = readJSON text: "${scanResult}"
println(scanResult)



//原生方法
import groovy.json.*
    def GetJson(text){
        def prettyJson = JsonOutput.prettyPrint(text)
        new JsonSlurperClassic().parseText(prettyJson)
    }
def response = readJSON text: "${scanResult}"
println(scanResult)



//原生方法
import groovy.json.*
    def GetJson(text){
        def prettyJson = JsonOutput.prettyPrint(text)
        new JsonSlurperClassic().parseText(prettyJson)
    }

4.2httpRequest

4.3凭据

4.4checkout

4.5publishHTML

报告

4.6Builduser

warp

4.7email