我在 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
有人知道如何提取这些信息吗?谢谢!
是的,您的观察是正确的,提交活动始终绑定到构建/运行,因此它不在用户对象中维护。当您转到
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.