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 的快照: 如果打开速度慢,可以尝试快速版:如果想更新或删除快照,可以投诉快照. ...
随机推荐
- Python野生库
https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
- SCSS 与 Sass 异同
SCSS 是 Sass 3 引入新的语法,其语法完全兼容 CSS3,并且继承了 Sass 的强大功能.也就是说,任何标准的 CSS3 样式表都是具有相同语义的有效的 SCSS 文件.另外,SCSS 还 ...
- Face Recognition 人脸识别该如何测试
猪圈子,一个有个性的订阅号 01 测量人脸识别的主要性能指标有 1.误识率(False;Accept;Rate;FAR):这是将其他人误作指定人员的概率; 2.拒识率(False;RejectRate ...
- 公司更需要会哪种语言的工程师?IEEE Spectrum榜单发布
IEEE Spectrum 杂志发布了一年一度的编程语言排行榜,这也是他们发布的第四届编程语言 Top 榜. 据介绍,IEEE Spectrum 的排序是来自 10 个重要线上数据源的综合,例如 St ...
- vagrant 虚拟机配置最佳实践
Mac VirtualBox Vagrant 管理虚拟机 这篇文章定位是在理解了 vagrant 相关概念之后,教你如何灵活玩转自己的虚拟机配置 本文为 @favoorr 常用的 Mac Virtua ...
- Java里观察者模式(订阅发布模式)
创建主题(Subject)接口 创建订阅者(Observer)接口 实现主题 实现观察者 测试 总结 在公司开发项目,如果碰到一些在特定条件下触发某些逻辑操作的功能的实现基本上都是用的定时器 比如用户 ...
- MVC04
1. 从页面到action 讲述controller与View之间的具体运作关系 在上次添加的名为Movie的Model内添加 下面我们尝试为该model内的属性添加attribute 具体修改如下: ...
- vuex源码阅读分析
这几天忙啊,有绝地求生要上分,英雄联盟新赛季需要上分,就懒着什么也没写,很惭愧.这个vuex,vue-router,vue的源码我半个月前就看的差不多了,但是懒,哈哈.下面是vuex的源码分析在分析源 ...
- 【MySQL】:事务四大特性与隔离级别
目录 一.事务的概念 二.事务的四大特性 1.原子性 2.一致性 3.隔离性 4.持续性 三.事务语句 1.开启事务:start transaction 2.事务回滚:rollback 指定回滚点 3 ...
- position:absolute和width的关系
碰到如下问题: 如图,我设置了宽高和绝对定位 ,但实际上我图片显示宽度为0: 然后我就查了一下,发现是因为我设了公共img宽度有个max-width:100%:屏蔽掉就有正常宽了,这点暂时没明白为啥 ...