【发布时间】:2021-07-25 22:36:31
【问题描述】:
我们想分析 Jenkins 作业中的构建历史。我们不想批准任何危险的签名,因此逻辑应该作为 Jenkins 共享库中的一个步骤来实现。我们使用文件夹和多分支作业,因此该机制必须递归分析项目。
如何实现?
【问题讨论】:
标签: jenkins jenkins-shared-libraries
我们想分析 Jenkins 作业中的构建历史。我们不想批准任何危险的签名,因此逻辑应该作为 Jenkins 共享库中的一个步骤来实现。我们使用文件夹和多分支作业,因此该机制必须递归分析项目。
如何实现?
【问题讨论】:
标签: jenkins jenkins-shared-libraries
要收集所有构建,可以使用以下代码。
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 等)java.util.Date)long)例如,如果必须执行在 24 小时内执行的构建,则可以使用两种方法:
第二个选项更好,因为它不会强制逻辑遍历旧版本。
【讨论】: