如何在Jenkins Pipeline中获取上一次构建完成时间并直接用于下一次构建?
嘿,这两个问题在Jenkins Pipeline里都有非常直接的解决方案,我给你一步步拆解清楚:
1. 获取Jenkins上一次构建的完成/结束时间
Jenkins的每个构建都会自动记录关键元数据,包括开始时间和持续时长,我们可以通过这两个值计算出结束时间,或者直接通过构建对象的属性来获取。在Pipeline里,你可以借助currentBuild.previousBuild这个内置对象来访问上一次构建的所有信息:
pipeline { agent any stages { stage('Fetch Last Build End Time') { steps { script { def lastCompletedBuild = currentBuild.previousBuild // 先判断上一次构建是否存在且已完成 if (lastCompletedBuild && lastCompletedBuild.result) { // 计算结束时间戳(毫秒级) def endTimeMillis = lastCompletedBuild.startTimeInMillis + lastCompletedBuild.duration // 转成你需要的可读格式,这里可以自定义时区 def dateFormatter = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss z") dateFormatter.timeZone = TimeZone.getTimeZone("Asia/Shanghai") def formattedEndTime = dateFormatter.format(new Date(endTimeMillis)) echo "上一次构建结束时间(毫秒戳): ${endTimeMillis}" echo "上一次构建结束时间(格式化后): ${formattedEndTime}" } else { echo "这是该项目的第一次构建,没有历史完成记录" } } } } } }
这里额外加了lastCompletedBuild.result的判断,是为了确保我们获取的是已经完成的构建(避免拿到还在运行中的构建,导致时长数据不准确)。
2. 在Pipeline中直接复用该时间,无需文件存储
完全不需要通过文件来中转!Jenkins会持久化存储所有构建的元数据,下一次构建时你直接读取上一次构建的信息就可以了,全程不需要读写磁盘文件。
举个实际的例子,比如你想在本次构建中用上一次的结束时间做逻辑判断,或者传递给后续步骤:
pipeline { agent any environment { // 提前声明环境变量,方便跨阶段使用 LAST_BUILD_END = "" } stages { stage('Get Last Build Time') { steps { script { def lastCompletedBuild = currentBuild.previousBuild if (lastCompletedBuild && lastCompletedBuild.result) { def endTimeMillis = lastCompletedBuild.startTimeInMillis + lastCompletedBuild.duration env.LAST_BUILD_END = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(endTimeMillis)) } else { env.LAST_BUILD_END = "无历史构建" } } } } stage('Use the Time for Logic') { steps { echo "基于上一次构建结束时间执行操作:${env.LAST_BUILD_END}" // 这里可以写任何业务逻辑,比如判断距离上次构建是否超过N小时,触发特定任务等 sh """ # 也可以传递给shell脚本使用 echo "上次构建结束时间:${env.LAST_BUILD_END}" """ } } } }
核心逻辑就是:每次构建时,直接通过currentBuild.previousBuild拉取上一次完成构建的元数据,计算出结束时间后,要么存在Pipeline变量里,要么存入环境变量供后续步骤使用——全程不需要生成任何文件,既高效又避免了文件读写可能带来的问题。
内容的提问来源于stack exchange,提问作者Abhaya Ghatkar
相关产品推荐
相关产品推荐

