如何使用 Jenkins 共享库收集构建历史
How to collect build history by using Jenkins Shared Libraries
我们想分析 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()
}
每个构建 returns:
- 全名(例如
<folder>/<job>/<branch name|PR number>
)
- 姓名(例如
branch name|PR number
)
- 结果(
SUCCESS
、FAILURE
等)
- 人数
- date - 执行日期 (
java.util.Date
)
- timestamp - 执行日期 (
long
)
- url - 绝对 URL 到构建页面
例如,如果必须执行仅在 24 小时内执行的构建,则可以使用两种方法:
- 执行步骤和下一个过滤结果
- 修改 Jenkins 共享库步骤,以在日期较早时停止收集作业
第二个选项更好,因为它不会强制逻辑遍历旧版本。
我们想分析 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()
}
每个构建 returns:
- 全名(例如
<folder>/<job>/<branch name|PR number>
) - 姓名(例如
branch name|PR number
) - 结果(
SUCCESS
、FAILURE
等) - 人数
- date - 执行日期 (
java.util.Date
) - timestamp - 执行日期 (
long
) - url - 绝对 URL 到构建页面
例如,如果必须执行仅在 24 小时内执行的构建,则可以使用两种方法:
- 执行步骤和下一个过滤结果
- 修改 Jenkins 共享库步骤,以在日期较早时停止收集作业
第二个选项更好,因为它不会强制逻辑遍历旧版本。