1 基本概述

Groovy是一种功能强大,可选类型和动态语言,支持Java平台。

旨在提高开发人员的生产力得益于简洁,熟悉且简单易学的语法。

可以与任何Java程序顺利集成,并立即为您的应用程序提供强大的功能,包括脚本编写功能,特定领域语言编写,运行时和编译时元编程以及函数式编程。

Groovy基础语法_java

2 下载安装

https://groovy.apache.org/download.html

下载安装包(先安装JDK)
解压安装包 
获取安装包bin目录
设置环境变量写入/etc/profile文件

Groovy基础语法_java_02

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)
}

Groovy基础语法_maven_03

3 注释

  • 单行注释 //
  • 多行注释 /**/

4 Groovy数据类型

4.1 String

Groovy基础语法_java_04

字符串表示方式: 单引号、双引号、三单双引号。(涉及到变量的时候使用双引号)
//定义一个字符串类型变量
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

Groovy基础语法_字符串_05

//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

Groovy基础语法_maven_06

//定义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