如何使用 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
  • 结果(SUCCESSFAILURE等)
  • 人数
  • date - 执行日期 (java.util.Date)
  • timestamp - 执行日期 (long)
  • url - 绝对 URL 到构建页面

例如,如果必须执行仅在 24 小时内执行的构建,则可以使用两种方法:

  1. 执行步骤和下一个过滤结果
  2. 修改 Jenkins 共享库步骤,以在日期较早时停止收集作业

第二个选项更好,因为它不会强制逻辑遍历旧版本。