jenkins高级篇 pipeline 系列之-—07 实现钉钉机器人插件效果

一. 知识点补充

知识点1. Jenkins Pipeline 中使用全局变量

jenkins 中可用的全局变量见如下链接: http://jenkinsServer/jenkins/pipeline-syntax/globals#en
使用方式:
echo "${currentBuild.displayName},${currentBuild.result}"

知识点2. Jenkins Pipeline 中获取构建当前任务的构建人

pipeline中的全局变量,默认不支持获取当前构建任务的构建人,要想获取构建人的信息,只能通过插件

插件:build-user-vars-plugin 下载地址

# 下载插件的源码
wget https://github.com/jenkinsci/build-user-vars-plugin/archive/build-user-vars-plugin-1.5.zip

# 进入到解压后的插件目录中, 执行mvn打包命令
mvn clean package

# 完成后,在target目录中会生成一个build-user-vars-plugin.hpi文件
# 将.hpi结尾的文件,jenkins上手动上传插件即可

#Pipeline Examples
node {
  wrap([$class: 'BuildUser']) {
    def user = env.BUILD_USER_ID
  }
}

知识点3. Jenkins Pipeline 中获取shell命令的标准输出或者状态

shell中获取标准输出或者状态参考

//获取标准输出
//第一种
result = sh returnStdout: true ,script: "<shell command>"
result = result.trim()
//第二种
result = sh (script: "<shell command>", returnStdout: true).trim()
//第三种
sh "<shell command> > commandResult"
result = readFile('commandResult').trim()

//获取执行状态
//第一种
result = sh returnStatus: true ,script: "<shell command>"
result = result.trim()
//第二种
result = sh (script: "<shell command>", returnStatus: true).trim()
//第三种
sh '<shell command>; echo $? > status'
def r = readFile('status').trim()

在pipeline 中的应用

//如果命令执行没报错,exitValue为0,报错则为非0
  def exitValue = sh(script: '"$ANT_HOME/bin/ant" -f svn/build.xml', returnStatus: true)
  if (exitValue != 0) {
    echo "return exitValue :${exitValue}"
    currentBuild.result = 'FAILURE'
  }	

注意: jenkins 的 全局变量中有两个result参数,currentBuild.result 和 currentBuild.currentResult, 测试发现:在脚本currentResult不能修改,result是可以的。所以这样处理

二. 最终的pip脚本

// vars/buildAndDeploy.groovy
def call(Map config) {

    node {
......	
        try {

......
       } finally {
			wrap([$class: 'BuildUser']) {
			def user = env.BUILD_USER_ID
				if (currentBuild.result == 'SUCCESS') {
					dingtalk (
							robot: "${dingMap.accessToken}",
							type: 'ACTION_CARD',
							title: "${env.JOB_NAME} ${currentBuild.displayName}构建成功",
							text: [
								"### [${env.JOB_NAME}](${env.JOB_URL}) ",
								'---',
								"- 任务:[${currentBuild.displayName}](${env.BUILD_URL})",
								'- 状态:<font color=#00CD00 >成功</font>',
								"- 持续时间:${currentBuild.durationString}".split("and counting")[0],
								"- 执行人:${user}",
							],
						)
				} else if (currentBuild.result == 'FAILURE') {
					dingtalk (
							robot: "${dingMap.accessToken}",
							type: 'ACTION_CARD',
							title: "${env.JOB_NAME} ${currentBuild.displayName}构建失败",
							text: [
								"### [${env.JOB_NAME}](${env.JOB_URL}) ",
								'---',
								"- 任务:[${currentBuild.displayName}](${env.BUILD_URL})",
								'- 状态:<font color=#EE0000 >失败</font>',
								"- 持续时间:${currentBuild.durationString}".split("and counting")[0],
								"- 执行人:${user}",
							],
						)
				} else {
					echo "${env.JOB_NAME} ${currentBuild.displayName} ${currentBuild.result}"
				}
			}
			withEnv(["QA_EMAIL=${config.QA_EMAIL}"]) {
				emailext body: '''${DEFAULT_CONTENT}''', subject: '''${DEFAULT_SUBJECT}''', to: "$QA_EMAIL"
			}
        }
    }
}

效果如下:

注意:

如果在Pipeline stage 中运行shell命令,且命令执行失败了,这时 Pipeline 的执行状态还是成功,间接导致邮件或者钉钉消息显示成功,误导消息接收人。例如我通过调用shell 中 ant命令执行sql,脚本有问题执行失败了,通知消息还是成功。
这里用知识点3,根据shell的状态修改 currentBuild.result 的值,问题得到解决。

posted @ 2021-02-04 17:24  雨 燕  阅读(1524)  评论(0编辑  收藏  举报