Jenkinsfile里定义对象和函数,获取git提交人, 发送钉钉通知
自从开始使用Jenkinsfile作为Jenkins配置后就一发不可收,因为开发者自定义CI脚本实在太方便了。
比如,最近开发的以一个项目涉及多人,提交冲突挺多的,有的人自己没编译通过就提交了,导致后面的人被阻塞,所以我们需要告诉他: 提交失败了。
首先,Jenkinsfile应该怎么用呢, 参见: https://www.cnblogs.com/woshimrf/p/gitlab-with-jenkins.html
定义Jenkinsfile的时候想要钉钉通知,首先获取git提交人:
最外层:
class MyChange {
String author;
String msg;
}
@NonCPS
def getChanges()
{
def changeLogSets = currentBuild.changeSets
for (int i = 0; i < changeLogSets.size(); i++)
{
def entries = changeLogSets[0].items
for (int j = 0; j < entries.length; j++)
{
def entry = entries[0]
def change = new MyChange()
change.author = entry.author
change.msg = entry.msg
return change
}
}
}
然后在node节点里定义变量
ding_group_access_token = "c20d35654da77a99d8869e04xxxxxxxd1a81aasssa2"
ding_jenkinsUrl = "http://jenkins.ryan.com/view/我的view名称/"
最后在失败的时候通知:
stage('Compile And UnitTest') {
echo "2.Compile the code"
try {
sh "mvn clean install"
} catch (Exception ex) {
updateGitlabCommitStatus name: 'build', state: 'failed'
def change = getChanges()
dingTalk accessToken: "${ding_group_access_token}", imageUrl: '', jenkinsUrl: "${ding_jenkinsUrl}", message: "@所有人 构建失败@$change.author $change.msg" , notifyPeople: "$change.author"
throw ex;
} finally {
}
updateGitlabCommitStatus name: 'build', state: 'success'
}
最终Jenkinsfile可能是这个样子的
文件位置
my-project
- .deploy
- Jenkinsfile
- src
在jenkins里创建pipeline job, 并指定Jenkinsfile

Jenkinsfile
class MyChange {
String author;
String msg;
}
@NonCPS
def getChanges()
{
def changeLogSets = currentBuild.changeSets
for (int i = 0; i < changeLogSets.size(); i++)
{
def entries = changeLogSets[0].items
for (int j = 0; j < entries.length; j++)
{
def entry = entries[0]
def change = new MyChange()
change.author = entry.author
change.msg = entry.msg
return change
}
}
}
node {
properties([gitLabConnection('gitlab-bigdata')])
stage('Prepare') {
echo "1.Prepare Stage"
checkout scm
updateGitlabCommitStatus name: 'build', state: 'pending'
mvn_module = '多模块项目mvn子模块'
pom = readMavenPom file: "${mvn_module}/pom.xml"
k8s_label = "项目在k8s集群中的名称"
docker_host = "自己的docker私服"
ding_group_access_token = "c20d35654da77a99d8869e041xxxac7d6699xxxxxx"
ding_jenkinsUrl = "http://jenkins.ryan.com/view/job所在的view/"
//要部署的k8s集群, 默认是杭州(config-hangzhou), 可选上海(config-shanghai)
k8s_cluster_node = "config-hangzhou"
//部署环境
profile=""
if(env.BRANCH_NAME == 'dev') {
profile = "dev"
k8s_cluster_node = "config-dev"
}
if(env.BRANCH_NAME == 'test') {
profile = "test"
k8s_cluster_node = "config-shanghai"
}
if(env.BRANCH_NAME == 'master') {
profile = "prod"
k8s_cluster_node = "config-hangzhou"
}
img_name = "${pom.groupId}-${pom.artifactId}"
docker_img_name = "${docker_host}/${img_name}"
echo "group: ${pom.groupId}, artifactId: ${pom.artifactId}, version: ${pom.version}"
echo "docker-img-name: ${docker_img_name}"
script {
build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
build_tag = "${env.BRANCH_NAME}-${build_tag}"
currentBuild.displayName = BUILD_NUMBER + "_" +build_tag
}
}
stage('Compile And UnitTest') {
echo "2.Compile the code"
try {
sh "mvn clean install"
} catch (Exception ex) {
updateGitlabCommitStatus name: 'build', state: 'failed'
def change = getChanges()
dingTalk accessToken: "${ding_group_access_token}", imageUrl: '', jenkinsUrl: "${ding_jenkinsUrl}", message: "@所有人 构建失败@$change.author $change.msg" , notifyPeople: "$change.author"
throw ex;
} finally {
}
updateGitlabCommitStatus name: 'build', state: 'success'
}
if (env.BRANCH_NAME == 'dev' ||env.BRANCH_NAME == 'test' || env.BRANCH_NAME == 'master') {
stage('Build Docker Image') {
echo "4.Build Docker Image Stage"
sh "docker build -t ${docker_img_name}:${build_tag} " +
" --build-arg JAR_FILE=target/${mvn_module}.jar " +
" --build-arg profile=${profile} " +
" -f ${mvn_module}/.deploy/Dockerfile ./${mvn_module}"
}
stage('Push Docker Image') {
echo "5.Push Docker Image Stage"
//sh "mvn deploy -Dmaven.test.skip=true"
sh "docker tag ${docker_img_name}:${build_tag} ${docker_img_name}:latest"
sh "docker tag ${docker_img_name}:${build_tag} ${docker_img_name}:${pom.version}"
withCredentials([usernamePassword(credentialsId: 'docker-register-sz-shuwei', passwordVariable: 'dockerPassword', usernameVariable: 'dockerUser')]) {
sh "docker login -u ${dockerUser} -p ${dockerPassword} ${docker_host}"
sh "docker push ${docker_img_name}:latest"
sh "docker push ${docker_img_name}:${pom.version}"
sh "docker push ${docker_img_name}:${build_tag}"
}
}
stage("Deploy to k8s - ${profile}") {
echo "6. Deploy Stage"
updateGitlabCommitStatus name: 'deploy', state: 'pending'
sh "sed -i 's/<IMG_NAME>/${img_name}/g;s/<IMG_TAG>/${build_tag}/g;s/<k8s-label>/${k8s_label}/g' ${WORKSPACE}/${mvn_module}/.deploy/${profile}-k8s.yaml"
sh "kubectl --kubeconfig /home/jenkins/.kube/${k8s_cluster_node} " +
"apply -f ${WORKSPACE}/${mvn_module}/.deploy/${profile}-k8s.yaml --record"
sh "sleep 5"
echo "创建的实例:"
sh "kubectl --kubeconfig /home/jenkins/.kube/${k8s_cluster_node} get po -o wide | grep ${k8s_label}"
echo "您的应用svc: "
sh "kubectl --kubeconfig /home/jenkins/.kube/${k8s_cluster_node} get svc | grep ${k8s_label}"
updateGitlabCommitStatus name: 'deploy', state: 'success'
}
}
}
Jenkinsfile里定义对象和函数,获取git提交人, 发送钉钉通知的更多相关文章
- 【转】C++里定义全局变量和函数常用方法
http://blog.csdn.net/niying/article/details/637084 1:在头文件是声明变量,然后在使用的文件中用exten标识. ".h": in ...
- JDE函数--获取当前登录人的描述
业务描述:当前登录人ID为数字,中文姓名保存在描述1字段中 方式: 根据系统变量获取用户的地址号,根据TableIO获取用户描述1.如下图所示: 由于使用AN8时,变量类型不一致,所以使用函数将cha ...
- Javascript我学之六对象工厂函数与构造函数
本文是金旭亮老师网易云课堂的课程笔记,记录下来,以供备忘. 概述 使用对象字面量,或者向空对象中动态地添加新成员,是最简单易用的对象创建方法. 然而,除了这两种常用的对象创建方式,JavaScript ...
- js对象工厂函数与构造函数
转自:http://www.cnblogs.com/Jener/p/5920963.html ★概述: 使用对象字面量,或者向空对象中动态地添加新成员,是最简单易用的对象创建方法.然而 ...
- JavaScript中定义对象的四种方式
最近在阅读< JavaScript 高级程序设计>,未免遗忘读过的内容,就打算以博客的形式做些读书笔记.今天介绍的是 JavaScript 中的四种定义对象的方法,除了这四种方法,还有工厂 ...
- Git学习-->关于Jenkins编译时候,如何获取Git分支的当前分支名?
一.背景 因为代码都迁移到了Gitlab,所以Jenkins编译的时候我们都需要将之前的SVN信息换成现在的Git信息.最近编译一个Lib库的时候,因为团队规定上传Release版本的AAR到Mave ...
- jQuery1.11源码分析(9)-----初始化jQuery对象的函数和关联节点获取函数
这篇也没什么好说的,初始化jQuery对象的函数要处理多种情况,已经被寒冬吐槽烂了.关联节点获取函数主要基于两个工具函数dir和sibling,前者基于指定的方向遍历,后者则遍历兄弟节点(真的不能合并 ...
- 第4天:function对象(案例:获取当前日期属于当年第几天、arguments对象、函数类型、参数、返回值、自身调用)
获取当前日期输入当年第几天 //输入,年月日,获取这个日期是这一年的第几天 //年-月--日:20171月31日 function getDay(year,month,day){ //定义变量存储对应 ...
- 基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同 but------> 可以返回派生类对象的引用或指针
您查询的关键词是:c++primer习题15.25 以下是该网页在北京时间 2016年07月15日 02:57:08 的快照: 如果打开速度慢,可以尝试快速版:如果想更新或删除快照,可以投诉快照. ...
随机推荐
- 在MySql中如何定义像Java中类型的Boolean类型
在MySql中如何定义像Java中类型的Boolean类型数据..其实,mysql中 是没有直接定义成Boolean这种数据类型.它只能定义成 tinyint(1) ;如果长度是1,tinyint(1 ...
- 项目搭建到Linux--实用笔记
项目搭建到Linux--实用笔记 1.启动redis 目录 /usr/local/redis/bin (我自己的目录) 启动 ./redis-server redis. ...
- 测试用例设计经典面试题之电梯、杯子、笔、桌子、洗衣机、椅子、ATM等
测试用例设计经典面试题之电梯.杯子.笔.桌子.洗衣机.椅子.ATM等 1.测试项目:电梯 需求测试:查看电梯使用说明书.安全说明书等 界面测试:查看电梯外观 功能测试:测试电梯能否实现正常的上升和下降 ...
- Gre 隧道与 Keepalived
这一篇文章是做了不少功课的. 什么是 Gre 隧道 什么是 Vrrp KeepAlived 是什么 用Keepalived 怎么玩 附录 什么是 Gre 隧道 GRE 隧道是一种 IP-2-IP 的隧 ...
- pyteeseract使用报错Error: one input ui-file must be specified解决
Python在图像识别有天然的优势,今天使用pytesseract模块时遇到一个报错:“Error: one input ui-file must be specified”. 环境:windows ...
- 前后端分离下的跨域CAS请求
最重要的两点: ajax请求跨域的时候,默认不会携带cookie. 请求分为普通请求(HttpRequest)和Ajax请求(XMLHttpRequest) 先屡一下跨域CAS认证的流程: 前端发起a ...
- 前端每日实战:34# 视频演示如何用纯 CSS 创作在文本前后穿梭的边框
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/qYepNv 可交互视频教程 此视频 ...
- day06可变与不可变类型,if判断,运算符
1:可变不可变类型 2.什么是条件?什么可以当做条件?为何要要用条件? 显式布尔值:True.False 隐式布尔值:所有数据类型,其中0.None.空为假 3:逻辑运算符:用来 # not. and ...
- java算法--稀疏数组
数据结构必要知识 线性结构 线性结构是最常用的数据结构,数据元素之间存在一对一的线性关系. 线性结构有两种不同的存储结构,即顺序存储结构和链式存储结构.顺序存储的线性表称为顺序表,顺序表中的存储元素是 ...
- 李宏毅深度学习与人类语言处理-introduction
深度学习与人类语言处理(Deep learning for Human Language Processing) 李宏毅老师深度学习与人类语言处理课程笔记,请看正文 这门课会学到什么? 为什么叫人类语 ...