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 的快照: 如果打开速度慢,可以尝试快速版:如果想更新或删除快照,可以投诉快照. ...
随机推荐
- 在中国实现自我价值的英国研究员——微软亚洲研究院英国籍研究员Darren的7年之路
"我和妻子在这儿已经待了7年了,这里的一切都很棒,无论是微软亚洲研究院还是北京."Darren笑着说,似乎他和中国,和北京,和研究院一直停留在"蜜月期",并未曾 ...
- js new 与 return
前置: 默认情况下, 函数的返回值是 undefined (即没有定义返回值). new 操作符 js 中的 new 操作符,可以是我们像 java 一样,获得一个新的对象,例如: function ...
- 在dataframe添加1行(首行,或者尾部),且不覆盖
如果直接用下面的代码添加第1行,则会覆盖掉原来的第1行. #指定位置增加一行: df.loc[0]={'a':1,'b':2} 正确方法: 新建一个同样的 dataframe, 然后合并两个dataf ...
- mysql中tinyint、smallint、int和bigint类型的用法区别
mysql中tinyint.smallint.int和bigint类型的用法区别: 在MySQL的数据类型中,Tinyint的取值范围是:带符号的范围是-128到127.无符号的范围是0到255(见官 ...
- Linux命令alias - 设置命令的别名
用途说明设置命令的别名.在linux系统中如果命令太长又不符合用户的习惯,那么我们可以为它指定一个别名.虽然可以为命令建立“链接”解决长文件名的问题,但对于带命令行参数的命令,链接就无能为力了.而指定 ...
- Network Saboteur (DFS)
题目: A university network is composed of N computers. System administrators gathered information on t ...
- Archlinux 自动挂载移动硬盘,开机自动启动smb服务
Archlinux + Raspberry 打造NAS: samba篇 树莓派自动挂载硬盘,并开启smb服务. 开机自动挂在移动硬盘ntfs 安装ntfs-3g sudo pacman -S ntfs ...
- JavaWeb中遇到的字符编码问题
一.常见的编码方式 1.UTF-8 2.ISO-8859-1 二.Tomcat的编码问题 Tomcat8和7的编码方式 Tomcat7对URI默认编码是ISO-8859-1 Tomcat8对URI默认 ...
- [Python之路] object类中的特殊方法
一.object类的源码 python版本:3.8 class object: """ The most base type """ # d ...
- Python 存储数据到json文件
1 前言 很多程序都要求用户输入某种信息,程序一般将信息存储在列表和字典等数据结构中. 用户关闭程序时,就需要将信息进行保存,一种简单的方式是使用模块json来存储数据. 模块json让你能够将简单的 ...