Jenkins学习笔记之基础语法-声明式

![图片上传中…]

一、jenkinsfile通用模板

#!groovy

@Library('jenkinslib') _

def tools = new org.devops.tools()



String workspace = "/opt/jenkins/workspace"

//Pipeline
pipeline {
    agent { node {  label "master"   //指定运行节点的标签或者名称
                    customWorkspace "${workspace}"   //指定运行工作目录(可选)
            }
    }

    options {
        timestamps()  //日志会有时间
        skipDefaultCheckout()  //删除隐式checkout scm语句
        disableConcurrentBuilds() //禁止并行
        timeout(time: 1, unit: 'HOURS')  //流水线超时设置1h
    }

    stages {
        //下载代码
        stage("GetCode"){ //阶段名称
            when { environment name: 'test', value: 'abcd' }
            steps{  //步骤
                timeout(time:5, unit:"MINUTES"){   //步骤超时时间
                    script{ //填写运行代码
                        println('获取代码')
                        tools.PrintMes("获取代码",'green')
                        println("${test}")
                        input id: 'Test', message: '我们是否要继续?', ok: '是,继续吧!', parameters: [choice(choices: ['a', 'b'], description: '', name: 'test1')], submitter: 'lizeyang,admin'
                    }
                }
            }
        }

        stage("01"){
            failFast true
            parallel {
                //构建
                stage("Build"){
                    steps{
                        timeout(time:20, unit:"MINUTES"){
                            script{
                                println('应用打包')
                                tools.PrintMes("应用打包",'green')
                                mvnHome = tool "m2"
                                println(mvnHome)
                                sh "${mvnHome}/bin/mvn --version"
                            }
                        }
                    }
                }
                //代码扫描
                stage("CodeScan"){
                    steps{
                        timeout(time:30, unit:"MINUTES"){
                            script{
                                print("代码扫描")
                                tools.PrintMes("代码扫描",'green')
                            }
                        }
                    }
                }
            }
        }
    }

    //构建后操作
    post {
        always {
            script{
                println("always")
            }
        }

        success {
            script{
                currentBuild.description = "n 构建成功!"
            }
        }

        failure {
            script{
                currentBuild.description = "n 构建失败!"
            }
        }

        aborted {
            script{
                currentBuild.description = "n 构建取消!"
            }
        }
    }
}

流水线集成各种工具maven、npm、gradle、ant:

npm声明环境变量时有些不一样,需要在jenkinsfile里定义一下。

stage("npmBuild"){
    steps{
        script{
            npmHome = tool "NPM"
            sh """
               export NODE_HOME=${npmHome}
               export PATH=\${NODE_HOME}/bin:\$PATH
               ${npmHome}/bin/npm -v
            """
        }
    }
}

二、jenkins Generic Webhook Trigger

转自:https://www.cnblogs.com/wang-kai-1994/p/12105890.html

在生产环境中因为代码仓库迁移导致Jenkins设置的触发器失效,在调试的过程gitlab触发事件响应状态码为200,但是响应消息一直为{“status”:”ok”,”data”:{…”triggered”:false,”url”:””}}}} 。

此篇文章的描述主要针对该问题,且面向对Jenkins和Gitlab有一定经验的小伙伴。

截图配置说明


debbuild-.* 为分支名称

关键的部分在于value filter和Optional filter 下的 Expression 的组合

两者需要能够组合成完整的分支名称,即 refs/heads/branch

否则在gitlab的触发事件返回详情中,就会出现如下消息:
{"status":"ok","data":{..."triggered":false,"url":""}}}}
"triggered":false 表示触发构建失败,false为true是表示成功。
两者的差别在jenkins的console output输出有描述:
debbuild-.* 为分支名称
使用如上写法的输出:
使用完整写法^(refs/heads/debbuild-.*)$的输出(ref,sourceBranch都为变量):
针对该问题已经解决完毕,其他相关配置不再赘述。

三、groovy基础语法

字符串string

contains() 是否包含特定内容  返回true false
size() length() 字符串数量大小长度
toString() 转换成string类型
indexOf() 元素的索引
endsWith()  是否指定字符结尾
minus() plus()  去掉、增加字符串
reverse()  反向排序
substring(1,2) 字符串的指定索引开始的子字符串
toUpperCase() toLowerCase()  字符串大小写转换
split() 字符串分割 默认空格分割  返回列表
//判断字符串是否包含字符或以什么字符结尾(输出布尔值)
groovy:000> "devopstestops".contains("ops")
===> true
groovy:000> "devopstestops".contains("user")
===> false
groovy:000> "devopstestops".endsWith("tops")
===> true
groovy:000> "devopstestops".endsWith("user")
===> false

//长度输出
groovy:000> "devopstestops".size()
===> 13
groovy:000> "devopstestops".length()
===> 13

//字符串拼接
groovy:000> "dev" + "ops"
===> devops
groovy:000> "devops" - "ops"
===> dev

//大小写转换
groovy:000> "devops".toUpperCase()
===> DEVOPS
groovy:000> "DEVOPS".toLowerCase()
===> devops

#分隔字符串
groovy:000> "host1,host2,host3".split(',')
===> [host1, host2, host3]
groovy:000> host = "host1,host2,host3".split(',')
===> [host1, host2, host3]
groovy:000> for( i in host ){
groovy:001>     println(i)
groovy:002> }
host1
host2
host3
===> null

列表list

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

//去重复
groovy:000> [1,2,3,4,4,5,5,68,66,66].unique()
===> [1, 2, 3, 4, 5, 68, 66]

//遍历 赋值it
groovy:000> [1,2,3,4,4,5,5,68,66,66].each{
groovy:001> println it
groovy:002> }
1
2
3
4
4
5
5
68
66
66
===> [1, 2, 3, 4, 4, 5, 5, 68, 66, 66]

映射map

size() map大小
[’key’]  .key get()  获取value
isEmpty() 是否为空
containKey() 是否包含key
containValue() 是否包含指定的value
keySet() 生成key的列表
each{} 遍历map
remove(‘a‘)  删除元素(k-v)
#map取值与赋值
groovy:000> [:]
===> [:]
groovy:000> [1:2,2:3,3:4]
===> [1:2, 2:3, 3:4]
groovy:000> [1:2,2:3,3:4].keySet()
===> [1, 2, 3]
groovy:000> [1:2,2:3,3:4].values()
===> [2, 3, 4]
groovy:000> [1:2,2:3,3:4][1]
===> 2
groovy:000> [1:2,2:3,3:4][2]
===> 3

条件语句

if语句:

if (表达式) {
   //xxxx
} else if(表达式2) {
   //xxxxx
} else {
   //
}

groovy:000> buildType = "maven"
===> maven
groovy:000> if ( buildType == "maven" ){
groovy:001>     println("This is maven job")
groovy:002> } else if ( buildType == "gradle" ){
groovy:003>     println("This is gradle job")
groovy:004> } else{
groovy:005>     println("This job Error")
groovy:006> }
This is maven job
===> null

switch语句

break语句跳出判断很重要,如果不加跳出,默认default步骤也会执行

switch("${buildType}"){
    case ”maven":
    //xxxx
        break;
    case ”ant":
    //xxxx
        break;
    default:
    //xxxx
}

//示例
groovy:000> buildType = "gradle"
===> gradle
groovy:000> switch("$buildType"){
groovy:001>     case "maven":
groovy:002>         println("This is maven job")
groovy:003>         ;;
groovy:004>     case "gradle":
groovy:005>         println("This is gradle job")
groovy:006>         break
groovy:007>     ;;
groovy:008>     default:
groovy:009>         println("This job Error")
groovy:010> }
This is gradle job
===> null

循环语句

for循环语句

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

while循环语句

while(true){
    //xxxx
}

函数

//定义一个函数,并调用
def printMes(){
    println("hello world!!!")
}
printMes()
//显示如下
hello world!!!

//两种不同的赋值,编辑器有问题时推出重新进入
groovy:000> def printMes(info){
groovy:001>     println(info)
groovy:002> }
===> true
groovy:000> printMes("DevOps")
DevOps
===> null

groovy:000> name = "devops"
===> devops
groovy:000> def printMes(info){
groovy:001>     println(info)
groovy:002> }
===> true
groovy:000> printMes("${name}")
devops
===> null

//加返回值
groovy:000> def printMes(info){
groovy:001>     println(info)
groovy:002>     return info
groovy:003> }
===> true
groovy:000> response = printMes("DevOps")
DevOps
===> DevOps
groovy:000> println(response)
DevOps
===> null