19

我在网上搜索了几天,我遇到了类似的问题

我需要以原始(纯)文本检索控制台输出。但是,如果我能用 HTML 得到它也很好,我总是可以解析它。唯一的问题是我需要在构建步骤中获取它,这是一个问题,因为它应该可用的位置被截断了......

我尝试从以下 URL(相对于作业)检索控制台输出:

  • /consoleText
  • /logText/progressiveText
  • /logText/progressiveHTML

这两个文本是纯文本,如果不是截断,那将是完美的,HTML 也是如此......正是我需要的 - 只有它被截断......

我确信有可能以某种方式检索此信息,因为在查看/consoleFull时控制台会实时更新,而不会截断或缓冲。

然而,在检查那个网页时,我没有找到我想要的内容,而是找到了它应该在的地方(我没有包括完整的页面代码,因为它几乎是不相关的,我相信那些回答能够找出并知道自己应该有什么)

      new Ajax.Request(href,{
          method: "post",
          parameters: {"start":e.fetchedBytes},
        requestHeaders: headers,
          onComplete: function(rsp,_) {

          var stickToBottom = scroller.isSticking();
          var text = rsp.responseText;
          if(text!="") {
            var p = document.createElement("DIV");
            e.appendChild(p); // Needs to be first for IE
            // Use "outerHTML" for IE; workaround for:
            // http://www.quirksmode.org/bugreports/archives/2004/11/innerhtml_and_t.html
            if (p.outerHTML) {
              p.outerHTML = '<pre>'+text+'</pre>';
              p = e.lastChild;
            }
            else p.innerHTML = text;
            Behaviour.applySubtree(p);
            if(stickToBottom) scroller.scrollToBottom();
          }

          e.fetchedBytes     = rsp.getResponseHeader("X-Text-Size");
          e.consoleAnnotator = rsp.getResponseHeader("X-ConsoleAnnotator");
            if(rsp.getResponseHeader("X-More-Data")=="true")
              setTimeout(function(){fetchNext(e,href);},1000);
          else
              $("spinner").style.display = "none";
          }
      });

具体来说,我希望有一种方法可以让我从text任何可能的内容中获取内容。我不熟悉这种语言,因此不确定如何获得我想要的内容。插件无济于事,因为我想在构建步骤中检索此内容作为脚本的一部分

4

3 回答 3

23

你已经做了很好的调查。我只能添加以下内容:我知道的所有与控制台相关的插件都被设计为构建后操作。

Log Trigger插件提供构建后操作,允许 Hudson 构建搜索其控制台日志以查找给定的正则表达式,如果找到,则触发其他下游作业。

因此,您的问题似乎没有直接的解决方案。我可以看到以下选项:

1. 使用tee或类似的东西(仅适用于 shell 构建步骤)

该解决方案远非通用,但它可以提供对由命令或命令集生成的最新控制台输出的快速访问。

tee - 从标准输入读取并写入标准输出和文件

在系统级别使用同义词可以修改其他 Jenkins 构建步骤以产生控制台输出。可以通过 Jenkins 或使用任何其他方式引用带有控制台输出的文件。

2.修改Jenkins代码

您可以快速修复内部使用或提供引入特定系统范围设置的补丁。

3.模仿/控制台行为

您示例中的代码用于从 Jenkins 服务器请求更新。正如您可能期望的那样,服务器端可以返回以某个偏移量开头的信息。让我展示。


定期控制台页面向服务器发送请求:

在此处输入图像描述


参数很简单:

在此处输入图像描述


响应是要添加的大量信息:

在此处输入图像描述


具有更新的偏移(开始)值的另一个请求

在此处输入图像描述


通过分析 Content-Length 可以很容易地理解没有数据

在此处输入图像描述


所以答案是:使用url/job-name/build-number/logText/progressiveHtml,指定起始偏移量,发送请求并接收控制台更新。

于 2013-07-29T14:30:30.853 回答
3

我有一个类似的问题,我的 Jenkinsfile 构建脚本的最后一部分需要解析 ConsoleLog 以获取特定的错误消息以放入电子邮件构建报告中。

第一次尝试:http请求。
感觉就像一个 hack,它大部分工作,但是当我们锁定对 Jenkins 服务器的访问并且我的构建节点无法再在页面上执行 annon http 获取时遇到了问题

第二次尝试:使用 API 枚举日志行。
这感觉是正确的做法,但它失败了,因为我的节点需要 30 分钟才能通过 100 meg 的日志文件。我的假设是 Jenkins 服务器没有缓存文件,所以每个请求都涉及重新读取整个文件,直到最后一次读取。

第三个也是最成功的解决方案:在服务器上运行 grep。

node('master') {  
  sh 'grep some_criteria $JENKINS_HOME/workspace/path/to/job/console.log'  
}

它快速、可靠,而且无论日志文件有多大。

是的,这需要 Jenkins 管理员的信任和 Jenkins 服务器上目录路径的知识 - 但由于我是管理员,我相信自己会做正确的事。你的旅费可能会改变。

于 2018-12-27T01:04:22.377 回答
1

补充一些见解:当 Jenkins 构建正在进行时,对 .../consoleText URL 的响应最多达到 10000 行。我在 Python 中使用了“requests()”包。我用 curl 尝试了相同的 URL,但又只收到了前 10K 行。只有在构建完成后,这两种方法才会返回完整的日志(在我的例子中是 >22K 行)。

我会进一步研究并希望报告回来。

[2015-08-18] 更新:这似乎是一个已知问题(见此处),它已在 Jenkins 1.618 及更高版本中修复。我仍在运行 1.615,因此无法验证。阿米尔

于 2014-11-24T15:58:28.397 回答