簡體   English   中英

如何手動讀取jenkins中/timestamps文件的內容

[英]How to read the contents of /timestamps file in jenkins manually

我正在嘗試讀取為構建生成的 /timestamps 文件,但我無法理解文件格式,因為當我嘗試打開它時,它包含一些特殊字符。 我想將此文件用於腳本,該腳本將在構建完成后作為批處理命令運行。 任何幫助,將不勝感激。 謝謝

像這樣依賴插件的內部數據結構被認為是不好的做法。
建議您聯系該插件的作者,看看他是否可以為此提供一些API。

如果您使用時間戳插件https://plugins.jenkins.io/timestamper/

您可以使用插件的 API 讀取日志。

http://${JENKINS_IP_PORT}/job/${JOB_NAME}/${JOB_NUMBER}/console

如果插件被啟用或沒有它,如果插件被禁用,將返回帶有時間戳的控制台視圖。

http://${JENKINS_IP_PORT}/job/${JOB_NAME}/${JOB_NUMBER}/consoleText

將以純文本形式返回日志


時間戳插件 API

但是,當為作業啟用插件時,您可以使用此處“腳本”部分下可用的 API。 響應是純文本格式。

您可以將返回的時間戳格式化為日期、時間、日期 + 時間、經過時間(作業開始后的時間)等。

例子

http://${JENKINS_IP_PORT}/job/${JOB_NAME}/${JOB_NUMBER}/timestamps/?time=yyyy-MM-dd%20HH:mm:ss&appendLog

2020-03-19 13:16:47  Jenkins did something here
2020-03-19 13:16:47  and this is something else that happend
2020-03-19 13:16:47  This line shows some output
2020-03-19 13:16:47  etc.
2020-03-19 13:16:47  etc.
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 16:30:23”

使用 M 而不是 MM 將返回沒有前面 0 的月份。

使用 MMM 會將月份返回為 3 個字母的月份,例如“MAR”

http://${JENKINS_IP_PORT}/job/${JOB_NAME}/${JOB_NUMBER}/timestamps

2.667
2.670
2.768
32.778
32.778
32.820

將返回沒有日志行的時間戳。 自構建開始以來的秒數的簡單純文本列表。

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 對我來說不是一個選擇,因為我的網絡服務器阻止了向其他網絡服務器發送 HTTP 請求。 所以我需要能夠直接從時間戳文件中提取時間戳信息,該文件通過磁盤安裝在我的服務器上可用。

請注意,我將 Jenkins 2.190.1 與 Timestamper 1.10 一起使用。 你的旅費可能會改變。

簡要說明:

基本上,時間戳文件給出了日志之間經過的時間,以毫秒為單位。 數據以 base-128(varint)格式列出。 所以你需要一次讀取一個字節的文件。 如果有任何字節大於0x7F(127),則需要取最低7位,左移7位,然后讀取下一個字節; 重復直到讀取的字節大於 0x7F。

詳細說明(包括Perl代碼):

例如,給定以下字節(從真實時間戳文件的開頭讀取):

08 01 2c 04 0c 04 25 01 04 02 00 02 fe 47 11 ...

第一個字節 0x08 小於 0x7f,因此第一個日志發生在構建開始后 8 毫秒。 第二個字節 0x01 表示第二個日志發生在第一個日志之后 1 毫秒。 第三個日志發生在第二個日志之后 0x2C 毫秒(44 毫秒)。 等等。

第 13 個日志(字節 0xfe)的情況略有不同。 由於 0xfe > 0x7f,我們只需要最低的 7 位。

0xfe & 0x7f = 1111 1110 & 0111 1111 == 0111 1110 = 0x7e == 126

然后我們將結果左移 7 位(即乘以 128):

0x7e << 7 == 0x3f00 == 16128

然后我們讀取下一個字節(0x47),它小於 0x7F,所以它是這個(第 13 個)日志的最后一個字節。 所以我們只需將此值添加到上面的左移值中:

0x3f00 + 0x47 = 0x3f47 = 16128 + 71 = 16199

所以第 13 個日志發生在第 12 個日志之后 16199 毫秒(或 16.199 秒)。

對時間戳文件中的每個字節重復此過程。

這給出了文件中每個日志之間經過的時間(以毫秒為單位)。 要找到實際的紀元時間戳,請使用時間戳文件的最后修改時間,然后向后工作。 然后以您想要的任何日期/時間格式顯示每個日志的紀元時間。

Perl 代碼示例:

以下 Perl 函數有效(Perl 5.22)。 它基於 [ https://github.com/danaj/BitStream/blob/master/lib/Data/BitStream/Code/Varint.pm][1] 中的 get_varint() 函數,但 Varint.pm 模塊不是' t 在我的服務器上可用(並且讓 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM