如何手动读取jenkins中/timestaps文件的内容
我试图读取为构建生成的/timestamps文件,但我无法理解文件格式,因为当我试图打开它时,它包含一些特殊字符。我想将此文件用于脚本,该脚本将在构建完成后作为批处理命令运行。任何帮助都将不胜感激。感谢像这样依赖插件的内部数据结构被认为是不好的做法。如何手动读取jenkins中/timestaps文件的内容,jenkins,Jenkins,我试图读取为构建生成的/timestamps文件,但我无法理解文件格式,因为当我试图打开它时,它包含一些特殊字符。我想将此文件用于脚本,该脚本将在构建完成后作为批处理命令运行。任何帮助都将不胜感激。感谢像这样依赖插件的内部数据结构被认为是不好的做法。 建议您联系该插件的作者,看看他是否可以为此提供一些API。如果您使用的是时间戳插件 您可以使用插件的API读取日志 http://${JENKINS_IP_PORT}/job/${JOB_NAME}/${JOB_NUMBER}/console 如
建议您联系该插件的作者,看看他是否可以为此提供一些API。如果您使用的是时间戳插件 您可以使用插件的API读取日志
http://${JENKINS_IP_PORT}/job/${JOB_NAME}/${JOB_NUMBER}/console
如果插件已启用,则返回带有时间戳的控制台视图;如果插件已禁用,则返回不带时间戳的控制台视图
http://${JENKINS_IP_PORT}/job/${JOB_NAME}/${JOB_NUMBER}/consoleText
将以纯文本形式返回日志
时间戳插件API 但是,当插件为作业启用时,您可以使用“脚本”部分中提供的API。 响应是纯文本格式 您可以将返回的时间戳格式化为日期、时间、日期+时间、经过的时间(作业启动后的时间)等 例子 返回时间戳并附加日志。日期格式为“2020-03-19 16:30:23” 使用M而不是MM将返回没有前面0的月份 使用MMM将以3个字母的月份返回月份,例如“MAR” 将返回不带日志行的时间戳。生成启动后秒数的简单纯文本列表
http://${JENKINS_IP_PORT}/job/${JOB_NAME}/${JOB_NUMBER}/timestamps/?time=yyyy-MM-dd%20HH:mm:ss
2020-03-19 13:16:47
2020-03-19 13:16:47
2020-03-19 13:16:47
2020-03-19 13:16:47
2020-03-19 13:16:47
2020-03-19 13:16:47
2020-03-19 13:16:47
2020-03-19 13:16:47
2020-03-19 13:16:47
将返回时间戳的格式化列表
警告
只有当作业启用了插件时,时间戳API才可用。在其他情况下访问API url将返回空响应。六年后。。。我也有同样的问题,找不到答案。因此,我根据互联网上的小道消息和自己的实验拼凑出了自己的解决方案 我正在编写一个web脚本来生成实时报告,它需要带有时间戳的Jenkins日志。使用时间戳URL/API对我来说不是一个选项,因为我的Web服务器阻止了向其他Web服务器发送HTTP请求。因此,我需要能够直接从时间戳文件中提取时间戳信息,该文件可通过磁盘挂载在我的服务器上 请注意,我使用的是带有时间戳1.10的Jenkins 2.190.1。您的里程可能会有所不同 简要说明: 基本上,时间戳文件给出了日志之间经过的时间,以毫秒为单位。数据以base-128(varint)格式列出。因此,您需要一次读取一个字节的文件。如果任何字节大于0x7F(127),则需要取最低的7位,左移7位,然后读取下一个字节;重复此操作,直到读取字节大于0x7F 详细解释(包括Perl代码): 例如,给定以下字节(从实际时间戳文件的开头读取): 第一个字节0x08小于0x7f,因此第一个日志发生在生成开始8毫秒后。第二个字节0x01表示第二个日志发生在第一个日志之后1ms。第三个日志在第二个日志之后发生0x2C毫秒(44毫秒)。等等 对于第13个日志(字节0xfe),情况略有不同。由于0xfe>0x7f,我们只需要最低的7位
0xfe & 0x7f = 1111 1110 & 0111 1111 == 0111 1110 = 0x7e == 126
然后我们将结果左移7位(即乘以128):
因此,第13次记录发生在第12次记录之后16199ms(或16.199s)
对时间戳文件中的每个字节重复此过程
这将给出文件中每个日志之间的运行时间(毫秒)。要查找实际的历元时间戳,请使用时间戳文件的上次修改时间,然后向后操作。然后以所需的日期/时间格式显示每个日志的纪元时间
Perl代码示例:
以下Perl函数起作用(Perl 5.22)。它基于[中的get_varint()函数,但varint.pm模块在我的服务器上不可用(让It人员安装它实际上比我编写和测试以下代码所花费的时间要长得多)。它可能不漂亮,但可以工作
我希望有帮助
my @Timestamps = ();
my $path = "/full/path/to/timestamps";
if(open(TS, '<:raw', $path))
{
my($byte, $ok, $shift);
my $elapsed = 0;
my $ms = 0;
while()
{
$ok = read(TS, $byte, 1);
if(!defined($ok) || $ok <= 0)
{ last; }
$byte = sprintf("%d", ord($byte));
$shift = 7;
$ms = $byte & 0x7F;
while($byte > 127)
{
$ok = read(TS, $byte, 1);
if(!defined($ok) || $ok <= 0)
{ last; }
$byte = sprintf("%d", ord($byte));
$ms |= ($byte & 0x7F) << $shift;
$shift += 7;
} # end while byte
$elapsed += $ms;
push(@Timestamps, $elapsed);
} # end while
close(TS);
} # end if open
my@Timestamps=();
my$path=“/full/path/to/timestamps”;
如果(open,TS,'谢谢Gonen,我找到了一种通过使用标准URL的HTTP GET请求来访问信息的替代方法,谢谢,这是关于这个主题的最好解释。
08 01 2c 04 0c 04 25 01 04 02 00 02 fe 47 11 ...
0xfe & 0x7f = 1111 1110 & 0111 1111 == 0111 1110 = 0x7e == 126
0x7e << 7 == 0x3f00 == 16128
0x3f00 + 0x47 = 0x3f47 = 16128 + 71 = 16199
my @Timestamps = ();
my $path = "/full/path/to/timestamps";
if(open(TS, '<:raw', $path))
{
my($byte, $ok, $shift);
my $elapsed = 0;
my $ms = 0;
while()
{
$ok = read(TS, $byte, 1);
if(!defined($ok) || $ok <= 0)
{ last; }
$byte = sprintf("%d", ord($byte));
$shift = 7;
$ms = $byte & 0x7F;
while($byte > 127)
{
$ok = read(TS, $byte, 1);
if(!defined($ok) || $ok <= 0)
{ last; }
$byte = sprintf("%d", ord($byte));
$ms |= ($byte & 0x7F) << $shift;
$shift += 7;
} # end while byte
$elapsed += $ms;
push(@Timestamps, $elapsed);
} # end while
close(TS);
} # end if open