将下游/子Jenkins作业的控制台输出包含在触发作业的控制台输出中

时间:2014-04-03 10:03:22

标签: jenkins triggers console

2 Jenkins工作:A和B。

A触发B作为阻止构建步骤("阻止,直到触发的项目完成构建")。有没有办法将B&#t的控制台输出包含在A&#s控制台输出中?

动机:浏览器使用Jenkins A的控制台输出包含指向B&#39控制台输出的链接,这很好。但是当通过命令行工具(jenkins-cli)使用Jenkins时,没有快速简便的方法可以看到B&#39的控制台输出。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

有趣。我试试这样的事情。

来自http://jenkinsurl/job/jobname/lastBuild/api/

  

访问渐进式控制台输出
  您可以通过使用参数重复GET请求来检索正在进行的控制台输出。您基本上会向此URL发送GET请求(如果您希望将HTML放入标记中,则可以发送此URL。)start参数控制您开始的位置的字节偏移量。

     

响应将包含一大块控制台输出,以及表示字节偏移量(原始日志文件)的X-Text-Size标头。这是您要用作下次调用的开始参数的数字。

     

如果响应还包含X-More-Data:true标头,则服务器指示构建正在进行,并且您需要在延迟一段时间后重复该请求。 Jenkins UI在下一次通话之前等待5秒钟。当此标头不存在时,您知道您已检索到所有数据并且构建已完成。

因此,您可以触发下游工作,但不要阻止直到下游完成"。相反,添加一个额外的步骤(可能是execute shell)并编写一个脚本,该脚本将读取上面指示的另一个作业的控制台输出,并将其显示在当前作业的控制台输出中。如上所述,您必须通过查找X-More-Data: true标题来检测子作业的完成时间。

答案 1 :(得分:0)

我知道这是一个老问题,但最近我自己也不得不这样做。我认为这可以帮助其他人寻求同样的事情。这是一个Groovy脚本,它将读取给定作业的progressiveText URL。代码的编写方式应该是即插即用的。确保首先设置jenkinsBase和jobName。这种方法与已经提到的方法没有什么不同。

以下是关于如何使用它的一组简短说明:(1)配置下游作业,以便匿名用户具有读取和ViewStatus权限。 (2)在上游作业中,在将调用下游作业的其他项目步骤上创建触发器/调用构建。 (3)不要检查“在触发的项目完成构建之前阻塞。(4)在该步骤之后,创建一个Execute Groovy脚本步骤并粘贴以下代码:

def jenkinsBase = // Set to Jenkins base URL here
def jobName = // Set to jenkins job name 
def jobNumber = 'lastBuild' // Tail last build
def address = null
def response = null
def start = 0 // Start at offset 0
def cont = true // This semaphore holds the value of X-More-Data header value
try {
    while (cont == true) { // Loop while X-More-Data value is equal to true
    address = "${jenkinsBase}/job/${jobName}/${jobNumber}/logText/progressiveText?start=${start}"
    def urlInfo = address.toURL()
    response = urlInfo.openConnection()
    if (response.getResponseCode() != 200) {
        throw new Exception("Unable to connect to " + address) // Throw an exception to get out of loop if response is anything but 200
    }
    if (start != response.getHeaderField('X-Text-Size')) { // Print content if the starting offset is not equal the value of X-Text-Size header
      response.getInputStream().getText().eachLine { line ->
        println(line)
      }  
    }
    start = response.getHeaderField('X-Text-Size') // Set new start offset to next byte
    cont = response.getHeaderField('X-More-Data') // Set semaphore to value of X-More-Data field. If this is anything but true, we will fall out of    while loop
    sleep(3000) // wait for 3 seconds 
  }
}
catch (Exception ex) {
  println (ex.getMessage()) 
}

通过以编程方式获取下游作业编号,可以进一步改进此脚本。

此方法还有一个Python版本here