Jenkins - 在构建步骤中检索完整的控制台输出

时间:2013-07-22 15:53:21

标签: jenkins continuous-integration hudson jenkins-plugins

我在互联网上搜索了好几天,我遇到了与this类似的问题。

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

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

  • /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获取内容。我不熟悉这种语言,所以我不确定如何能够获得我想要的内容。插件无济于事,因为我想在构建步骤中将此内容作为脚本的一部分进行检索

3 个答案:

答案 0 :(得分:19)

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

  

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

所以看起来你的问题没有直接的解决方案。我可以看到以下选项:

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

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

  

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

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

<强> 2。修改Jenkins代码

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

第3。模仿/控制台行为

示例中的代码用于从Jenkins服务器请求更新。正如您所料,服务器端可以从一些偏移开始返回一条信息。让我来表示。


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

enter image description here


参数很简单:

enter image description here


响应是要添加的一大块信息:

enter image description here


另一个请求更新了偏移(开始)值

enter image description here


您可以通过分析内容长度

轻松了解没有数据

enter image description here


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

答案 1 :(得分:1)

添加一些见解:当Jenkins构建正在进行时,... / consoleText URL的响应完全超过10000行。 我在Python中使用'requests()'包。我用curl尝试了相同的URL,并且只收到了前10K行。 只有在构建完成后,两个方法都返回完整的日志(在我的情况下大于22K行)。

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

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

答案 2 :(得分:1)

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

首次尝试:http请求。
感觉就像是一个黑客,它大部分都能奏效,但是当我们锁定对Jenkins服务器的访问权限时,却遇到了问题,而且我的构建节点无法再在页面上执行非http获取

第二次尝试:使用API​​枚举日志行。
感觉上做对了,但是由于我的节点要花费30分钟才能读取100个兆的日志文件,所以这失败了。我的推测是Jenkins服务器没有缓存文件,因此每个请求都涉及重新读取整个文件,直到最后一次读取为止。

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

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

它快速,可靠,并且日志文件的大小无关紧要。

是的,这需要Jenkins管理员的信任和Jenkins服务器上目录路径的知识-但是由于我是管理员,所以我相信自己可以做正确的事。您的里程可能会有所不同。