Jenkins 詹金斯:查看最后的X版本
我想查看几个Jenkins作业最近的X版本 因此,如果我想展示jobs 1-5的最后5个构建,它看起来是这样的:Jenkins 詹金斯:查看最后的X版本,jenkins,jenkins-plugins,Jenkins,Jenkins Plugins,我想查看几个Jenkins作业最近的X版本 因此,如果我想展示jobs 1-5的最后5个构建,它看起来是这样的: status build time ------------------------- pass job1#3 13:54 fail job1#2 13:05 fail job1#1 13:01 pass job5#1 12:17 pass job3#1 11:03 我怎样才能做到这一点
status build time
-------------------------
pass job1#3 13:54
fail job1#2 13:05
fail job1#1 13:01
pass job5#1 12:17
pass job3#1 11:03
我怎样才能做到这一点
请注意,作业的生成是交织在一起的,因此如果一个作业最近运行了多个生成,它将显示比其他没有运行那么多的作业更多的内容。在脚本控制台(Manage Jenkins->script Console)中执行以下脚本:
您可能需要更改
numHoursBack
常量,它控制返回以查找构建的小时数。以及决定构建列列宽的buildNameWidth
(如果您有很长的作业和构建名称,您可能需要扩展它)。这里是Jon Groovy脚本的一个清理版本。还显示最差的构建信息
import hudson.model.*;
import java.text.SimpleDateFormat;
//
// Settings
//
def numHoursBack = 24;
def dateFormat = new SimpleDateFormat("HH:mm");
def cutOfTime = System.currentTimeMillis() - numHoursBack * 3600 * 1000;
/**
* Basic build information.
*/
def printBuildInfo(finalizedBuild) {
String level = "INFO";
String result = finalizedBuild.getResult().toString();
switch (result) {
case "UNSTABLE":
level = "WARNING";
break;
case "FAILURE":
level = "ERROR";
break;
}
// basic info and URL
println(String.format(
"[%s] Build %s result is: %s.",
level,
finalizedBuild.getFullDisplayName(),
result
));
// pipe description from downstream
def description = finalizedBuild.getDescription();
if (description != null && !description.isEmpty()) {
println(description.replaceAll("<br>", ""));
}
return finalizedBuild;
}
/**
* Get recent build items.
*/
def getRencentBuilds(cutOfTime) {
SortedMap res = new TreeMap();
for (job in Jenkins.instance.getAllItems(BuildableItem.class)) {
for (build in job.getBuilds()) {
if (build.getTimeInMillis() < cutOfTime) {
break;
}
res.put(build.getTimeInMillis(), build);
}
}
return res;
}
/**
* Print build items.
*
* minResult - minimum to print
*/
def printBuilds(builds, minResult, dateFormat) {
def format = "%-10s %-8s %s";
Result worstResult = Result.SUCCESS;
def worstBuild = null;
// header
println(String.format(format, "status", "Time", "build"));
// list
for (entry in builds.descendingMap().entrySet()) {
def build = entry.getValue();
Result result = build.getResult();
if (result.isWorseThan(worstResult)) {
worstResult = result;
worstBuild = build;
}
if (result.isWorseOrEqualTo(minResult)) {
println(String.format(
format, build.getResult(), dateFormat.format(build.getTime()), build.getFullDisplayName()
));
}
}
return worstBuild;
}
def builds = getRencentBuilds(cutOfTime);
println ("\n\n----------------------\n Failed builds:\n");
def worstBuild = printBuilds(builds, Result.FAILURE, dateFormat);
println ("\n\n----------------------\n Worst build:\n");
if (worstBuild != null) {
printBuildInfo(worstBuild);
}
println ("\n\n----------------------\n All builds:\n");
printBuilds(builds, Result.SUCCESS, dateFormat);
导入hudson.model.*;
导入java.text.simpleDataFormat;
//
//背景
//
def numHoursBack=24;
def dateFormat=新的SimpleDataFormat(“HH:mm”);
def cutOfTime=System.currentTimeMillis()-numHoursBack*3600*1000;
/**
*基本构建信息。
*/
def printBuildInfo(已完成构建){
String level=“INFO”;
字符串结果=finalizedBuild.getResult().toString();
开关(结果){
“不稳定”案例:
level=“警告”;
打破
案例“失败”:
level=“ERROR”;
打破
}
//基本信息和网址
println(String.format)(
“[%s]生成%s的结果是:%s.”,
水平,
finalizedBuild.getFullDisplayName(),
结果
));
//下游管道说明
def description=finalizedBuild.getDescription();
if(description!=null&!description.isEmpty()){
println(description.replaceAll(“
”,”);
}
返回finalizedBuild;
}
/**
*获取最近的生成项。
*/
def getRencentBuilds(削减时间){
SortedMap res=新树映射();
for(Jenkins.instance.getAllItems(BuildableItem.class)中的作业){
for(内置作业。getBuilds()){
if(build.getTimeInMillis()
您是Jenkins实例的管理员吗?因为如果你是,那么在脚本控制台中编写脚本应该是相当容易的…我有管理员权限,但我对Jenkins是相当陌生的,从来没有使用过脚本控制台。我去看看。你能给我举几个例子说明我是如何做到这一点的吗?
status build Time
SUCCESS xxx #107393 17:53
SUCCESS xxx #107392 17:48
SUCCESS xxx #107391 17:43
null yyy #3030 17:38
SUCCESS xxx #107390 17:38
FAILURE zzz #3248 17:37
...
import hudson.model.*;
import java.text.SimpleDateFormat;
//
// Settings
//
def numHoursBack = 24;
def dateFormat = new SimpleDateFormat("HH:mm");
def cutOfTime = System.currentTimeMillis() - numHoursBack * 3600 * 1000;
/**
* Basic build information.
*/
def printBuildInfo(finalizedBuild) {
String level = "INFO";
String result = finalizedBuild.getResult().toString();
switch (result) {
case "UNSTABLE":
level = "WARNING";
break;
case "FAILURE":
level = "ERROR";
break;
}
// basic info and URL
println(String.format(
"[%s] Build %s result is: %s.",
level,
finalizedBuild.getFullDisplayName(),
result
));
// pipe description from downstream
def description = finalizedBuild.getDescription();
if (description != null && !description.isEmpty()) {
println(description.replaceAll("<br>", ""));
}
return finalizedBuild;
}
/**
* Get recent build items.
*/
def getRencentBuilds(cutOfTime) {
SortedMap res = new TreeMap();
for (job in Jenkins.instance.getAllItems(BuildableItem.class)) {
for (build in job.getBuilds()) {
if (build.getTimeInMillis() < cutOfTime) {
break;
}
res.put(build.getTimeInMillis(), build);
}
}
return res;
}
/**
* Print build items.
*
* minResult - minimum to print
*/
def printBuilds(builds, minResult, dateFormat) {
def format = "%-10s %-8s %s";
Result worstResult = Result.SUCCESS;
def worstBuild = null;
// header
println(String.format(format, "status", "Time", "build"));
// list
for (entry in builds.descendingMap().entrySet()) {
def build = entry.getValue();
Result result = build.getResult();
if (result.isWorseThan(worstResult)) {
worstResult = result;
worstBuild = build;
}
if (result.isWorseOrEqualTo(minResult)) {
println(String.format(
format, build.getResult(), dateFormat.format(build.getTime()), build.getFullDisplayName()
));
}
}
return worstBuild;
}
def builds = getRencentBuilds(cutOfTime);
println ("\n\n----------------------\n Failed builds:\n");
def worstBuild = printBuilds(builds, Result.FAILURE, dateFormat);
println ("\n\n----------------------\n Worst build:\n");
if (worstBuild != null) {
printBuildInfo(worstBuild);
}
println ("\n\n----------------------\n All builds:\n");
printBuilds(builds, Result.SUCCESS, dateFormat);