求每月首个周五过后首个周日运行的Jenkins Cron自动化配置
实现Jenkins测试任务自动触发的方案
完全可以实现自动化,无需每月手动更新日期配置。由于纯Cron表达式无法直接描述「每月首个周五过后的首个周日」这种相对日期逻辑,推荐采用Jenkins Pipeline脚本+Cron定时触发的组合方案,具体实现如下:
1. 基础Cron触发配置
先给Jenkins任务设置一个覆盖所有周日的Cron表达式,比如固定每周日上午9点触发任务(时间可根据需求调整):
0 9 * * 0
这个表达式会让任务每周日9点尝试启动,但我们会通过脚本判断当日是否为目标周日,只有符合条件才执行测试逻辑。
2. Pipeline脚本中的日期判断逻辑
在Jenkinsfile中添加Groovy脚本,计算当月首个周五的日期,再验证当前运行的周日是否是该周五之后的第一个周日:
pipeline { agent any triggers { cron('0 9 * * 0') // 每周日9点触发任务 } stages { stage('校验目标日期') { steps { script { def today = new Date() def cal = Calendar.getInstance() cal.setTime(today) // 双重校验:确保当日是周日 if (cal.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) { echo "今日非周日,终止任务" currentBuild.result = 'ABORTED' return } // 计算当月首个周五的日期 def firstDayOfMonth = new Date(today.getYear(), today.getMonth(), 1) def firstFriCal = Calendar.getInstance() firstFriCal.setTime(firstDayOfMonth) while (firstFriCal.get(Calendar.DAY_OF_WEEK) != Calendar.FRIDAY) { firstFriCal.add(Calendar.DATE, 1) } def firstFri = firstFriCal.getTime() // 计算首个周五之后的首个周日(周五+2天) def targetSunCal = Calendar.getInstance() targetSunCal.setTime(firstFri) targetSunCal.add(Calendar.DATE, 2) def targetSun = targetSunCal.getTime() // 判断当日是否为目标周日 if (today.format('yyyy-MM-dd') == targetSun.format('yyyy-MM-dd')) { echo "今日是首个周五后的目标周日,开始执行测试" } else { echo "今日非目标周日,终止任务" currentBuild.result = 'ABORTED' return } } } } stage('执行测试用例') { steps { // 此处编写你的测试执行逻辑,例如调用测试脚本、运行自动化套件等 echo "启动补丁测试用例..." // sh './run-patch-tests.sh' } } } }
3. 额外优化方向
- 可将日期判断逻辑封装为Jenkins共享库,方便多个任务复用。
- 如果需要更精准的触发时机(比如补丁部署完成后立即触发,而非固定周日),可结合Jenkins的下游构建触发器:让月度首周五的补丁部署任务成功后,主动触发测试任务,同时在部署任务中添加标记(如环境变量),测试任务仅在收到该标记时执行。
内容的提问来源于stack exchange,提问作者saurav
相关产品推荐
相关产品推荐

