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 的快照: 如果打开速度慢,可以尝试快速版:如果想更新或删除快照,可以投诉快照. ...
随机推荐
- 「CometOJ」Contest #11
Link Aeon 显然字典序最大就是把最小的字母放在最后 Business [动态规划] 简单dp dp[i][j]dp[i][j]dp[i][j]表示到第iii天,当前有jjj块钱,最后返还的钱最 ...
- TCP大文件发送案例以及UDP介绍
基于TCP的大文件发送 #server服务端 import struct import json import os import socket server = socket.socket() # ...
- TCP-IP-part7-IP协议相关技术(一)
仅凭IP是无法完成通信的,需要一些IP的辅助技术.这些技术的包格式可能不一样,但它们都是基于IP地址进行的,都是通过匹配路由表来进行的,只是功能不一样.例如DHCP分配IP地址,它只管通知这条信息,具 ...
- 分布式ID生成策略 · fossi
分布式环境下如何保证ID的不重复呢?一般我们可能会想到用UUID来实现嘛.但是UUID一般可以获取当前时间的毫秒数再加点随机数,但是在高并发下仍然可能重复.最重要的是,如果我要用这种UUID来生成分表 ...
- Spring学习笔记(七)模拟实际开发过程的调用过程XML版-Setter方式注入
模拟实际开发过程的调用过程XML版-Setter方式注入 源码获取github [TOC] 1.项目结构 2.jar包跟上个一样 3.重写set方法 UserServiceImpl.java 1234 ...
- 使用 KM 处理 HHKB 方向键
对于上了 HHKB 这条贼船的人来说,刚开始使用起来最大的别扭可能就是没有方向键的问题了. 最早的我使用 Karabiner 来解决,里边有一些内置的组合可以替代方向键,我用 control + hj ...
- #2020.1.26笔记——springdatajpa
2020.1.26笔记--springdatajpa 使用jpa的步骤: 1. 导入maven坐标 <?xml version="1.0" encoding="UT ...
- 目标用户偏好指数Target Group Index分析
目标用户偏好指数Target Group Index分析 TGI指数,全称Target Group Index,可以反映目标群体在特定研究范围内强势或者弱势. TGI指数计算公式 = 目标群体中具有某 ...
- volatile和synchronized到底啥区别?多图文讲解告诉你
你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough ...
- vue 实现 裁切图片 同时有放大、缩小、旋转功能
实现效果: 裁切指定区域内的图片 旋转图片 放大图片 输出bolb 格式数据 提供给 formData 对象 效果图 大概原理: 利用h5 FileReader 对象, 获取 <input ty ...