获取Jenkins构建启动时间(支持未完成构建场景)
当然有靠谱的解决方案!不管目标构建是还在运行,还是已经完成,我们都能通过两种常用路径拿到它的启动时间——要么直接在Jenkins服务器上跑脚本查询,要么通过Jenkins的REST API远程调用。下面给你拆解每种方法的具体操作:
方法一:在Jenkins服务器本地查询(适合有权限访问服务器的场景)
1. Groovy脚本(Jenkins原生支持,推荐)
Jenkins本身基于Groovy,用Groovy脚本可以直接访问Jenkins内部对象,准确性最高。你可以在Jenkins的脚本控制台(路径:Manage Jenkins -> Script Console)直接运行,或者写成脚本文件在服务器上执行。
示例代码:
def jobName = "你的构建名称" def buildNumber = 123 // 替换成目标构建编号 try { def job = Jenkins.instance.getItemByFullName(jobName) if (!job) { println "找不到名为${jobName}的构建任务" return } def build = job.getBuildByNumber(buildNumber) if (!build) { println "构建任务${jobName}不存在编号为${buildNumber}的构建" return } // 获取启动时间(毫秒级时间戳) def startTimeMillis = build.getStartTimeInMillis() // 转换为可读时间格式 def startTime = new Date(startTimeMillis) println "构建${jobName} #${buildNumber}的启动时间:" println "时间戳(毫秒):${startTimeMillis}" println "可读格式:${startTime}" } catch (Exception e) { println "查询出错:${e.getMessage()}" }
注意:不管构建是否完成,startTimeInMillis在构建启动时就会被Jenkins记录,所以正在运行的构建也能正常返回结果。
2. Shell脚本(适合Linux服务器,直接读取Jenkins存储文件)
如果服务器是Linux系统,你可以直接读取Jenkins存储构建数据的XML文件,从中提取启动时间。Jenkins的构建数据默认存在$JENKINS_HOME/jobs/目录下。
示例命令:
# 替换为你的实际值 JENKINS_HOME="/var/lib/jenkins" JOB_NAME="你的构建名称" BUILD_NUMBER=123 # 构建文件路径(如果是文件夹中的任务,路径为${JENKINS_HOME}/jobs/文件夹名称/jobs/${JOB_NAME}/builds/${BUILD_NUMBER}/build.xml) BUILD_FILE="${JENKINS_HOME}/jobs/${JOB_NAME}/builds/${BUILD_NUMBER}/build.xml" if [ -f "$BUILD_FILE" ]; then # 提取startTime字段(毫秒时间戳) START_TIME_MILLIS=$(grep -oP '<startTime>\K\d+' "$BUILD_FILE") # 转换为可读时间 START_TIME=$(date -d "@$((START_TIME_MILLIS/1000))" "+%Y-%m-%d %H:%M:%S") echo "构建${JOB_NAME} #${BUILD_NUMBER}的启动时间:" echo "时间戳(毫秒):${START_TIME_MILLIS}" echo "可读格式:${START_TIME}" else echo "找不到构建文件,请检查任务名称和构建编号是否正确" fi
方法二:通过Jenkins REST API调用(适合远程访问或集成到其他系统)
Jenkins提供了完善的REST API,不管你在本地还是远程,只要能访问Jenkins服务,就能通过API获取构建信息,包括启动时间。
1. 基础API调用示例
API的基本路径为:http://你的Jenkins地址/job/<任务名称>/<构建编号>/api/json(如果是文件夹中的任务,路径为http://你的Jenkins地址/job/<文件夹名称>/job/<任务名称>/<构建编号>/api/json)。
你可以用curl结合jq(JSON处理工具)来提取启动时间:
# 替换为你的实际值 JENKINS_URL="http://jenkins.example.com" JOB_NAME="你的构建名称" BUILD_NUMBER=123 USERNAME="你的Jenkins用户名" API_TOKEN="你的Jenkins API令牌" # 在用户设置中生成 # 调用API并提取timestamp字段(毫秒时间戳) START_TIME_MILLIS=$(curl -s -u "${USERNAME}:${API_TOKEN}" "${JENKINS_URL}/job/${JOB_NAME}/${BUILD_NUMBER}/api/json" | jq '.timestamp') # 转换为可读时间 START_TIME=$(date -d "@$((START_TIME_MILLIS/1000))" "+%Y-%m-%d %H:%M:%S") echo "构建${JOB_NAME} #${BUILD_NUMBER}的启动时间:" echo "时间戳(毫秒):${START_TIME_MILLIS}" echo "可读格式:${START_TIME}"
注意:API返回的timestamp字段就是构建的启动时间戳(毫秒级),同样不管构建是否完成,这个字段都会存在。如果构建不存在,API会返回404状态码,你可以在脚本中添加状态码判断来处理这种情况。
2. 无jq的替代方案
如果服务器没有安装jq,可以用grep和sed来提取:
START_TIME_MILLIS=$(curl -s -u "${USERNAME}:${API_TOKEN}" "${JENKINS_URL}/job/${JOB_NAME}/${BUILD_NUMBER}/api/json" | grep -oP '"timestamp":\K\d+')
内容的提问来源于stack exchange,提问作者The Governor

