Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何手动读取jenkins中/timestaps文件的内容_Jenkins - Fatal编程技术网

如何手动读取jenkins中/timestaps文件的内容

如何手动读取jenkins中/timestaps文件的内容,jenkins,Jenkins,我试图读取为构建生成的/timestamps文件,但我无法理解文件格式,因为当我试图打开它时,它包含一些特殊字符。我想将此文件用于脚本,该脚本将在构建完成后作为批处理命令运行。任何帮助都将不胜感激。感谢像这样依赖插件的内部数据结构被认为是不好的做法。 建议您联系该插件的作者,看看他是否可以为此提供一些API。如果您使用的是时间戳插件 您可以使用插件的API读取日志 http://${JENKINS_IP_PORT}/job/${JOB_NAME}/${JOB_NUMBER}/console 如

我试图读取为构建生成的/timestamps文件,但我无法理解文件格式,因为当我试图打开它时,它包含一些特殊字符。我想将此文件用于脚本,该脚本将在构建完成后作为批处理命令运行。任何帮助都将不胜感激。感谢

像这样依赖插件的内部数据结构被认为是不好的做法。

建议您联系该插件的作者,看看他是否可以为此提供一些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