问题描述
我们想分析 Jenkins 作业中的构建历史记录。我们不想批准任何危险的签名,因此该逻辑应该作为 Jenkins 共享库中的一个步骤来实现。我们使用文件夹和多分支作业,因此该机制必须递归分析项目。
如何实施?
解决方法
要收集所有构建,可以使用以下代码。
import hudson.model.Job
import hudson.model.Run
import jenkins.model.Jenkins
List<Map<String,Object>> call() {
def builds = []
for (def job in findAllJobs()) {
for (def build in job.builds) {
builds << [
name: build.parent.name,fullName: build.parent.fullName,result: build.result?.toString(),number: build.number as String,date: build.time,timestamp: build.timeInMillis,url: "${build.parent.absoluteUrl}${build.number}/"
]
}
}
return builds
}
List<Job> findAllJobs() {
def jobs = []
jobs.addAll(jenkins.getItems(Job))
def folderClass = loadClass('com.cloudbees.hudson.plugins.folder.AbstractFolder')
for (def folder in jenkins.getItems(folderClass)) {
jobs.addAll(findNestedJobs(folder,folderClass))
}
return jobs
}
List<Job> findNestedJobs(def folder,Class<?> folderClass) {
def jobs = []
for (def item in folder.items) {
if (folderClass.isAssignableFrom(item.class)) {
jobs.addAll(findNestedJobs(item,folderClass))
} else if (item instanceof Job) {
jobs << item
}
}
return jobs
}
Class<?> loadClass(String className) {
return Class.forName(className,true,jenkins.pluginManager.uberClassLoader)
}
Jenkins getJenkins() {
return Jenkins.get()
}
每次构建都会返回:
- 全名(例如
<folder>/<job>/<branch name|PR number>
) - 姓名(例如
branch name|PR number
) - 结果(
SUCCESS
、FAILURE
等) - 数量
- date - 执行日期 (
java.util.Date
) - 时间戳 - 执行日期 (
long
) - url - 构建页面的绝对 URL
例如,如果必须执行仅在 24 小时内执行的构建,则可以使用两种方法:
- 执行步骤和下一个过滤结果
- 修改 Jenkins 共享库步骤,以在日期较旧时停止收集作业
第二个选项更好,因为它不会强制逻辑遍历旧版本。