搜索Jenkins作业的控制台输出

22

我有一个包含100多个构建的Jenkins作业。我需要查找该作业所有构建的控制台输出中包含特定字符串的构建。是否有适用于此功能的插件?如何实现?

8个回答

22

我经常使用Jenkins脚本控制台来完成这样的任务。 Groovy插件提供了脚本控制台,但如果您想要将脚本控制台用于定期维护,则还需要Scriptler插件,它允许您管理运行的脚本。

管理Jenkins -> 脚本控制台,您可以编写一个Groovy脚本,该脚本遍历作业构建并查找匹配的字符串:

JOB_NAME = "My Job"
BUILD_STRING = "Hello, world"

def job = Jenkins.instance.items.find { it.name == JOB_NAME }
for (build in job.builds) {
  def log = build.log
  if (log.contains(BUILD_STRING)) {
    println "${job.name}: ${build.id}"
  }
}

1
顺便说一句,要搜索所有作业,请使用 def job = Jenkins.instance.items.find {true} - Alexander Klimetschek
2
@dave bacher 我得到了一个错误:groovy.lang.MissingPropertyException: java.lang.Boolean类中没有名为builds的属性。你有什么想法吗? - DenCowboy
2
我认为如果你的工作在子文件夹中,这将失败(我遇到了与@DenCowboy相同的错误)。 - Chris Weiss
1
@rcorre 已在编辑中修复(应在同行审查后可见)。简而言之:请使用 allItems 而不是 items - sm4rk0
1
我的编辑被拒绝了,这是脚本的改进版本:Jenkins.instance.allItems.find { job -> job.name == JOB_NAME }.builds.findAll { build -> build.log.find(FIND_REGEX) } - sm4rk0
显示剩余4条评论

11

如果没有额外要求,我会在shell中简单完成它,例如:

find $JENKINS_HOME/jobs/haystack -name log -exec grep -l needle {} \; \
    | sed 's|.*/\(.*\)/log|\1|'

9
虽然这是一个不错的答案,但如果我的开发人员要求访问我们的Jenkins服务器以便对任务目录运行shell命令,我会非常害怕。 :) - Dave Bacher
1
如果你担心这个问题,@Dave,你可以创建一个 Jenkins 任务,然后在 shell 步骤中运行它。关于你自己的答案,我认为在控制台中运行 Groovy 脚本并不比授予 shell 访问权限更安全 :) - jil
@jil,谢谢。现在我使用NEEDLE运行参数化构建;bash脚本搜索所有日志(除了搜索作业本身),并通过以下方式排除提交消息:find $JENKINS_HOME/jobs -type f -name log | grep -v "$JOB_BASE_NAME" | xargs grep "$NEEDLE" | grep -v 'Commit message:' - Generic Ratzlaugh

6

要搜索所有作业的日志:

我增强了 @DaveBacher 的代码,以在 Jenkins 脚本控制台中运行。 帮助我定位多个作业中偶发出现的错误。

NEEDLE = "string_i_am_looking_for"

for (job in Jenkins.instance.getAllItems(Job.class)) {
  for (build in job.builds) {
    def log = build.log
    if (log.contains(NEEDLE)) {
      println "${job.name}: ${build.id}"
    }
  }
}

3

1

这里有一个日志解析插件,它可以:

在日志中突出显示感兴趣的行(错误、警告、信息)

将日志分成部分,并显示日志及其各个部分中错误、警告和信息行数的摘要。

将错误和警告的摘要与完整日志的上下文链接起来,使查找感兴趣的行变得容易。

在构建页面上显示错误和警告的摘要。

如果是旧日志,则假设您使用的是Linux,@jil 有答案。


不需要假设使用Linux。只需使用_bash_,_find_,_grep_和_sed_。它们可以轻松安装在Windows上(例如从cygwin或mingw),而且很有可能您已经拥有它们,即使您正在使用Git。 - jil

1

我想再推荐一个插件,这篇博客文章向我介绍了TextFinder 插件,它允许你在工作区文件或控制台输出中搜索文本,并在找到文本时覆盖构建状态为成功/失败。

原帖作者没有说明找到文本后应该发生什么,但正是寻找此功能将我带到了这里。


0
要在所有 Jenkins 构建的控制台输出中搜索正则表达式文本,请在 `https://{jenkins url}/manage/script` 中运行以下脚本。它将打印作业和构建编号以及找到的第一行匹配内容。
def regex="any text or regular expression"

for (job in Jenkins.instance.items) {
  for (build in job.builds) {
    try {
      def log = build.log
      def match = log =~ "\n(.*${regex}.*)\n"
      if (match) {
        println "Job [${job.name}] - Build [${build.id}]: ${match[0][0]}"
      }
    }
    catch (Exception e) {
      println e
    }
  }
}

例如,使用regex = "(TLS|Build).*timeout"在我的构建中进行搜索,我找到了以下内容:

任务[OSP-AWS] - 构建[83]:构建超时:拨号tcp [::1]:6443:连接被拒绝

任务[OSP-GCP] - 构建[21]:无法连接到服务器:net/http:TLS握手超时


-2

只需在Jenkins的标准搜索框(右上角)中使用关键词“console”即可:

console:"whatever you are looking for"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接