![图片上传中…]
一、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