起因
:因为最近公司线上问题出现,没有及时回复业务部门,所以就安排了技术部门人员的排期,这就存在一个问题,当人员过多,每个值班的人只排一天,总会忘记,就想到了自动化企业微信提醒的方案!
达到目的Jenkins设置只需要解决2个问题:
- 定时任务
- 大小周的轮循
配置Jenkins的定时任务(只启动本地,电脑关闭任务结束)
构建触发器
Build periodically
在日程表里面写公式
30 9,13 * * 1-6
我在项目中设置的意思是每周的星期一到星期六每天早上9点半
和14点半
去触发,使用的是Cron表达式
1、定时任务表达式:Jenkins使用一种特定的表达式来定义定时任务的执行时间和频率。这个表达式被称为Cron表达式,它由5个或6个字段组成,分别表示分钟、小时、日期、月份和星期几。通过设置这些字段的值,可以实现各种不同的定时任务调度。
2、Cron表达式格式:Cron表达式的格式如下:
日期(1-31)
月份(1-12)
星期几(0-7,其中0和7都表示星期日)
3、特殊字符和符号:在Cron表达式中,还可以使用一些特殊字符和符号来表示特定的含义,例如:
*:表示匹配任意值
,:表示列举多个值
-:表示范围
/:表示步长
4、示例:以下是一些示例的Cron表达式:
每天上午10点和下午4点各执行一次:0 10,16 * * *
每隔5分钟执行一次:*/5 * * * *
判断大小周的逻辑,以及发送到企业微信的逻辑都在groovy脚本中(Groovy Postbuild插件
)
import groovy.json.JsonSlurper
import java.text.SimpleDateFormat
import groovy.json.JsonOutput
def filePath = 'D:\\/jenkins\\/taskLocal.json'
def wxWebHook = manager.getEnvVariable("wx_web_hook")
def wxWebDesc = manager.getEnvVariable("wx_web_desc")
manager.listener.logger.println("wxWebHook:" + wxWebHook)
manager.listener.logger.println("wxWebDesc:" + wxWebDesc)
def file = new File(filePath)
if (file.exists()) {
def jsonContent = file.text
def jsonSlurper = new JsonSlurper()
def jsonObject = jsonSlurper.parseText(jsonContent)
def dataArray = jsonObject.data
// 输出当前字段
manager.listener.logger.println("当前 index: ${jsonObject.index}, isBigWeek: ${jsonObject.isBigWeek}")
def currentIndex = jsonObject.index.toInteger()
def isBigWeek = jsonObject.isBigWeek
if (isSaturday()) {
if (isBigWeek) {
// 执行任务
executeTask("${dataArray[currentIndex]}", wxWebDesc, wxWebHook)
upData(file, dataArray, currentIndex, jsonObject, false, true)
} else {
upData(file, dataArray, currentIndex, jsonObject, true, false)
}
} else {
executeTask("${dataArray[currentIndex]}", wxWebDesc, wxWebHook)
upData(file, dataArray, currentIndex, jsonObject, isBigWeek, true)
}
} else {
manager.listener.logger.println("文件不存在: ${filePath}")
}
def executeTask(userId, wxWebDesc, wxWebHook) {
manager.listener.logger.println("用户:${userId} 描述:${wxWebDesc}")
def p_content = "### <font color=\"info\">永远在线,在企业微信</font> <font color=\"warning\">《线上问题支持》</font> <font color=\"info\">群召唤值班人员</font>" +
"\n>各位同事,今日值班安排如下:" +
"\n>值班人员:"+"<@"+userId+">" +
"\n>紧急事情请电话联系对应值班人员!" +
"\n\n ~感谢配合! "
def json = new groovy.json.JsonBuilder()
json {
msgtype "markdown"
markdown {
content p_content
}
}
manager.listener.logger.println("发送企业微信数据:" + json)
def connection = new URL(wxWebHook).openConnection()
connection.setRequestMethod('POST')
connection.doOutput = true
connection.setRequestProperty('Content-Type', 'application/json')
def writer = new OutputStreamWriter(connection.outputStream)
writer.write(json.toString());
writer.flush()
writer.close()
connection.connect()
def respText = connection.content.text
manager.listener.logger.println("企业微信返回结果:" + respText)
}
def upData(file, dataArray, currentIndex, jsonObject, isBigWeek, isChangeWeek) {
if (getCurrentHour().toInteger() >= 14) {
if (isChangeWeek) {
// 更新索引
currentIndex = (dataArray.size() - 1) == currentIndex ? 0 : currentIndex + 1
// 修改字段
jsonObject.index = currentIndex // 修改 index 字段
}
jsonObject.isBigWeek = isBigWeek// 修改 isBigWeek 字段
// 将修改后的对象转换为JSON字符串
def updatedJsonContent = JsonOutput.toJson(jsonObject)
// 保存回文件
file.write(updatedJsonContent)
manager.listener.logger.println("更新后的内容: ${updatedJsonContent}")
}
}
// 获取当前小时
def getCurrentHour() {
SimpleDateFormat sdf = new SimpleDateFormat("HH")
Calendar now = Calendar.getInstance()
return sdf.format(now.getTime())
}
def isSaturday() {
Calendar now = Calendar.getInstance()
return now.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY
}
使用本地保存的2个字段来更改大小周以及轮询的数据idnex
如果想不停机发送提醒只能部署到服务器上,服务器不关闭,就可以一直提醒了