1.介绍
Groovy是构建在JVM上的一个轻量级却强大的动态语言, 它结合了Python、Ruby和Smalltalk的许多强大的特性.
Groovy就是用Java写的 , Groovy语法与Java语法类似, Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码, 相对于Java, 它在编写代码的灵活性上有非常明显的提升,Groovy 可以使用其他 Java 语言编写的库
def
关键字定义的变量类型都是Object, 任何变量, 方法都能用def
定义/声明 , 在 Groovy 中 “一切都是对象 "- 不需要分号
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
- 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