提取上次提交活动信息

问题描述 投票:0回答:1

我在 Jenkins 控制台中使用以下代码来提取 Jenkins 已知的所有用户的列表

import hudson.model.User
def users = User.getAll()
for (User u : users) {   
    def userid = u.getId()
    def fullname = u.getFullName()
    println("User ID - " + userid + ", Full Name - " + fullname)   
} 

据我所知,这个 hudson.model.User 模块不包含此处 asynchpeople API 页面上显示的任何“最后提交活动” - https://JenkinsURL/asynchPeople/

如果您查看 Jenkins 实例的 asynchPeople URL,它包含用户 ID、名称、上次提交活动以及提交所在的管道。我希望从脚本/插件/管道中提取所有这些信息,而不是导航到 URL 进行手动提取

我查看了文档,但找不到任何对“上次提交活动”的引用,所以我不确定 Jenkins 是如何生成的。 https://javadoc.jenkins-ci.org/hudson/model/User.html

有人知道如何提取这些信息吗?谢谢!

jenkins jenkins-plugins jenkins-groovy jenkins-cli
1个回答
0
投票

是的,您的观察是正确的,提交活动始终绑定到构建/运行,因此它不在用户对象中维护。当您转到

asynchPeople
页面时,数据会动态地一起处理。所以没有直接的方法(除非你调用API http://localhost:8080/asynchPeople/api/xml)因此你可以使用下面的代码来获取这些数据。

import hudson.model.View.UserInfo;
import hudson.util.RunList;
import jenkins.scm.RunWithSCM;
import hudson.scm.ChangeLogSet;

def jen = Jenkins.instance

Collection<TopLevelItem> items = jen.items;

Map<User, UserInfo> users = new HashMap<>();
Set<User> modified = new HashSet<>();

for (Item item : items) {
    for (Job<?, ?> job : item.getAllJobs()) {
        RunList<? extends Run<?, ?>> builds = job.getBuilds();
        int buildCount = 0;
        for (Run<?, ?> r : builds) {
            if (!(r instanceof RunWithSCM)) {
                continue;
            }

            RunWithSCM<?, ?> runWithSCM = (RunWithSCM<?, ?>) r;
            for (ChangeLogSet<? extends ChangeLogSet.Entry> c : runWithSCM.getChangeSets()) {
                for (ChangeLogSet.Entry entry : c) {
                    User user = entry.getAuthor();
                    UserInfo info = users.get(user);
                    if (info == null) {
                        UserInfo userInfo = new UserInfo(user, job, r.getTimestamp());
                        users.put(user, userInfo);
                        modified.add(user);

                    } else if (info.getLastChange().before(r.getTimestamp())) {
                        info.project = job;
                        info.lastChange = r.getTimestamp();
                        modified.add(user);

                    }
                }
            }
        }
    }
}


users.each { key, val ->
    println "UserName : " + val.getUser() + " CommitActivity: " + val.getLastChangeTimeString()
}

以上正是 Jenkins 获取这些数据所做的工作。看看this.

© www.soinside.com 2019 - 2024. All rights reserved.