jenkins 提取上次提交活动信息

kx1ctssn  于 2023-03-07  发布在  Jenkins
关注(0)|答案(1)|浏览(140)

我在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)   
}

据我所知,这个哈德逊.model.User模块不包含任何“上次提交活动”,如这里的asynchpeople API页面所示-https://JenkinsURL/asynchPeople/
如果查看Jenkins示例的asynchPeople URL,它包含用户ID、名称、上次提交活动以及提交所在的管道。我希望从脚本/插件/管道提取所有这些信息,而不是导航到URL进行手动提取
我已经浏览了文档,但没有找到任何对“上次提交活动”的引用,因此我不确定Jenkins. https://javadoc.jenkins-ci.org/hudson/model/User.html是如何生成此活动的
有人知道如何提取这些信息吗?谢谢!

daolsyd0

daolsyd01#

是的,你的观察是正确的,提交活动总是绑定到一个构建/运行,因此它不是在User对象中维护的。当你进入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() + " ,ProjectName: " + val.getJob().getFullDisplayName() + " ,URL: " + val.getJob().getUrl()
}

上面就是Jenkins得到这些数据的方法。看看这个。

相关问题