还在盯着Jenkins页面等构建结果?别傻了!让你的构建结果像外卖订单一样主动飞到手机上来吧!
还记得那些年我们追过的Jenkins构建结果吗?就像守在电视机前追剧一样,每隔几分钟就刷新一次页面,只为了知道那个漫长的构建到底成功了没有。作为一名程序员,你的时间很宝贵,不应该浪费在这种重复性等待上。
想象一下这样的场景:你刚提交了一段代码,舒服地靠在椅子上品尝咖啡,这时手机“叮咚”一声——Jenkins告诉你构建成功了。或者更现实一点——构建失败了,但你立刻知道了这个消息,而不是在半小时后才发现。这就是Jenkins自动化通知的魅力,而其中最直接、最难以忽略的方式,非短信通知莫属。
在众多的通知方式中,短信通知有着独一无二的优势:
几乎100%的到达率:不像邮件可能被归入垃圾箱,也不像Slack需要你保持登录状态,短信总是能到达你的手机。即时性:手机几乎总是在我们身边,短信提醒难以忽视。无需复杂配置:不需要安装额外的企业应用,不需要保持特定应用登录。但短信通知也有其局限性:比如成本问题(商业短信服务通常需要付费)以及内容展示的局限性。不过对于关键构建结果的通知,它无疑是最可靠的方式。
在深入短信通知之前,让我们快速浏览一下Jenkins丰富的通知生态系统:
邮件通知:最传统也是最基础的方式,通过Email Extension Plugin实现Webhook通知:可与GitHub等代码平台集成,实现更灵活的触发机制Slack/Teams通知:适合团队内部沟通环境钉钉/企业微信通知:在国内企业环境中越来越流行短信通知:本文的重点,最直接的个人化通知方式每种方式都有其适用场景,而最成熟的方案往往是根据构建的重要性和紧急程度,组合使用多种通知方式。
邮件通知是Jenkins最基本也是最必不可少的通知方式。几乎所有Jenkins实例都会配置邮件通知,因为它不仅作为一种通知渠道,还是其他通知机制的备用方案。
配置邮件通知的关键步骤:
安装Email Extension Plugin:这是Jenkins官方推荐的插件,功能强大且可定制性强。配置SMTP服务器:在“系统管理” → “系统配置”中找到“Extended E-mail Notification”部分,填写SMTP服务器信息。设置邮件模板:可以自定义邮件的主题和内容,使其包含更多构建信息。邮件通知的最大优势在于它可以携带丰富的构建信息,包括构建日志链接、变更记录等。但缺点也同样明显——大多数人邮件太多,可能会错过重要通知。
对于国内团队来说,钉钉和企业微信往往是比Slack更常用的团队协作工具。幸运的是,Jenkins也有相应的插件支持。
配置钉钉通知的基本步骤:
在钉钉群聊中创建自定义机器人,获取Webhook URL在Jenkins中安装钉钉插件(如“DingTalk Notification Plugin”)在Job配置中添加钉钉通知,填入Webhook URL企业微信的配置类似,可以通过安装“企业微信通知”插件或使用通用的Webhook方式实现。
虽然有很多Jenkins移动端通知方案,但它们都面临一个共同挑战:需要安装特定的移动应用并保持登录状态。例如,有一个名为BuildWatch的Android应用可以与Jenkins集成,通过Google Cloud Messaging(GCM)接收通知。但这类方案的问题在于:
需要安装特定应用可能需要Jenkins服务器能够从公网访问配置流程复杂而短信通知则完美避开了这些问题——它不需要特定应用,不依赖手机网络环境,几乎保证到达。
说了这么多理论,现在让我们进入最激动人心的部分——实际配置Jenkins短信通知。
实现Jenkins短信通知主要有两种方案:
使用专门的通知插件:有些插件如“SMS Notification Plugin”或“Google Cloud Messaging Notification Plugin”可以发送短信。自定义脚本+短信API:通过Shell脚本调用第三方短信服务的API。考虑到第一种方案的插件可能过时或不够灵活,我们重点介绍第二种方案——使用自定义脚本结合市面上成熟的短信服务(如阿里云、腾讯云的短信服务)。
以下是基于阿里云短信服务的完整示例:
#!/bin/bash
# Jenkins短信通知脚本
# 使用方法:在Jenkins的Post-build Actions中添加Execute shell步骤,调用此脚本
# 配置参数
ACCESS_KEY="你的AccessKey"
ACCESS_SECRET="你的AccessSecret"
SIGN_NAME="短信签名"
TEMPLATE_CODE="SMS_123456789" # 在阿里云申请的模板代码
# 构建信息
JOB_NAME="$JOB_NAME"
BUILD_NUMBER="$BUILD_NUMBER"
BUILD_STATUS="$1" # 成功/失败
BUILD_URL="$BUILD_URL"
RECIPIENT_PHONE="13800138000" # 接收短信的手机号
# 准备请求数据
function send_sms() {
local phone_number=$1
local message=$2
# 生成时间戳和签名
timestamp=$(date -u +%Y-%m-%dT%H:%M:%SZ)
nonce=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 8 | head -n 1)
# 构造请求参数
local params="AccessKeyId=$ACCESS_KEY&Action=SendSms&Format=JSON&PhoneNumbers=$phone_number&RegionId=cn-hangzhou&SignName=$SIGN_NAME&SignatureMethod=HMAC-SHA1&SignatureNonce=$nonce&SignatureVersion=1.0&TemplateCode=$TEMPLATE_CODE&TemplateParam={"job_name":"$JOB_NAME","build_number":"$BUILD_NUMBER","build_status":"$BUILD_STATUS"}&Timestamp=$timestamp&Version=2017-05-25"
# 计算签名
local string_to_sign="GET&"$(echo -n "/" | sed 's/////g' | sed 's/+/%20/g')"&"$(echo -n "$params" | sed 's/=/%3D/g' | sed 's/&/%26/g' | sed 's/:/:/g' | sed 's/////g')
local signature=$(echo -n "$string_to_sign" | openssl dgst -sha1 -hmac "$ACCESS_SECRET&" -binary | base64)
local encoded_signature=$(echo -n "$signature" | sed 's/+/%20/g' | sed 's/////g' | sed 's/=/%3D/g')
# 发送请求
local response=$(curl -s "https://dysmsapi.aliyuncs.com/?$params&Signature=$encoded_signature")
echo "短信发送结果: $response"
}
# 根据构建状态构造消息
case $BUILD_STATUS in
"SUCCESS")
status_msg="构建成功!"
;;
"FAILURE")
status_msg="构建失败!"
;;
"UNSTABLE")
status_msg="构建不稳定!"
;;
*)
status_msg="构建状态:$BUILD_STATUS"
;;
esac
message="Jenkins构建通知:项目 $JOB_NAME 第 $BUILD_NUMBER 次构建$status_msg,详情请查看:$BUILD_URL"
# 发送短信
send_sms $RECIPIENT_PHONE "$message"
在Jenkins中的配置步骤:
将上述脚本保存为
jenkins_sms.sh,上传到Jenkins服务器在Job配置中的"构建后操作"部分,添加"Execute shell"在命令框中输入:
bash /path/to/jenkins_sms.sh $BUILD_STATUS
如果你希望在多个Jenkins项目中使用相同的短信通知逻辑,可以将其封装为共享库。以下是使用Groovy实现的示例:
// vars/smsNotifier.groovy
def call(String buildStatus = 'STARTED', String phoneNumber) {
buildStatus = buildStatus ?: 'SUCCESS'
def subject = "${buildStatus}: Job ${env.JOB_NAME} [${env.BUILD_NUMBER}]"
def details = """${buildStatus}: Job ${env.JOB_NAME} [${env.BUILD_NUMBER}]:
检查详细信息: ${env.BUILD_URL}"""
// 使用curl调用短信API
def smsCmd = """
curl -X POST https://api.sms-service.com/send
-H "Content-Type: application/json"
-d '{
"phone": "${phoneNumber}",
"message": "${details}",
"key": "your_sms_api_key"
}'
"""
try {
sh smsCmd
echo "短信通知已发送至 ${phoneNumber}"
} catch (Exception e) {
echo "短信发送失败: ${e.toString()}"
}
}
在Pipeline中的使用方法:
@Library('jenkins-shared-lib') _
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'make'
}
}
}
post {
always {
smsNotifier(currentBuild.result, '13800138000')
}
}
}
为了避免“狼来了”效应,我们应该只为重要的构建事件发送短信通知。以下是一些建议:
仅对关键分支的构建失败发送短信:比如main或release分支的构建失败应立即通知,而功能分支的失败可能只需要邮件通知。设置合理的时间限制:非工作时间只发送紧急通知。合并重复通知:如果同一个Job在短时间内多次失败,应该合并通知。示例代码实现智能通知逻辑:
def shouldSendSms() {
// 只对main或release分支的失败发送短信
if (env.BRANCH_NAME != 'main' && !env.BRANCH_NAME.startsWith('release')) {
return false
}
// 只对失败构建发送短信
if (currentBuild.result != 'FAILURE') {
return false
}
// 在工作时间外只发送一次短信(避免深夜骚扰)
def hour = new Date().getHours()
if (hour < 8 || hour > 22) {
def lastSmsTime = getLastSmsTime()
if (lastSmsTime > System.currentTimeMillis() - 6 * 60 * 60 * 1000) {
return false // 6小时内已发送过短信
}
}
return true
}
短信通知由于字数限制,需要精心设计内容。一个好的Jenkins短信通知应该包含:
项目名称(缩写或易于识别的名称)构建结果(成功/失败/不稳定)构建编号简短的原因分析(如果可能)示例短信模板:
【Jenkins】${PROJECT}构建${RESULT}
版本:${BUILD_NUMBER}
提交者:${COMMITTER}
原因:${FAILURE_REASON}
详情:${SHORT_URL}
在使用第三方短信服务时,需要注意以下安全问题:
保护API密钥:不要将短信API密钥硬编码在脚本中,而应该使用Jenkins的Credentials管理。限制接收人:只向相关责任人发送通知,避免无关人员接收。设置频率限制:防止恶意触发导致短信费用暴增。虽然短信通知很强大,但一个成熟的通知体系应该结合多种通知方式,形成梯度化的通知策略:
| 事件重要性 | 工作时间 | 非工作时间 |
| 高紧急度 | 短信+钉钉+邮件 | 短信+电话 |
| 中紧急度 | 钉钉+邮件 | 邮件(次日) |
| 低紧急度 | 邮件 | 邮件 |
将Jenkins与Prometheus、Grafana等监控系统集成,可以实现更智能的告警:
# Prometheus告警规则示例
groups:
- name: JenkinsBuildFailures
rules:
- alert: JenkinsHighFailureRate
expr: increase(jenkins_builds_failed_total[1h]) > 5
for: 5m
labels:
severity: critical
annotations:
summary: "Jenkins构建失败率过高"
description: "过去一小时内Jenkins构建失败次数超过5次"
对于有特殊需求的企业,可以基于共享库实现自定义通知器。这样的通知器可以:
统一从多个来源收集信息(构建结果、代码变更、测试报告等)应用业务特定的逻辑决定通知方式和内容支持多种通知渠道并实现故障转移Jenkins通知机制,特别是短信通知,能够极大地提高开发团队的响应速度和协作效率。通过本文的介绍,你应该已经掌握了:
Jenkins通知的基本原理和多种实现方式短信通知的完整实现方案,包括代码示例高级技巧和最佳实践,让你的通知更加智能和有效如何构建完整的通知体系,而不仅仅是单一渠道记住,一个好的通知系统就像是团队中的贴心助手,它会在合适的时间、通过合适的渠道、向合适的人发送合适的信息。不要再让你的构建结果孤零零地待在Jenkins服务器里——让它主动“跳”到你的手机上来吧!
温馨提示:在实际使用短信通知时,请务必注意成本和接收人体验,避免过度通知造成“通知疲劳”。建议先在小范围内试点,根据反馈调整通知策略和频率。