如何确定Jenkins中的作业是否正在使用插件

56

Jenkins有600多个插件,在真实的系统中,我们通常安装很多插件。

有时,我们想要删除一些插件,以使系统更清洁或用另一个成熟的插件替换它(名称不同)。

需要确保没有人/作业使用这些插件,或者我需要通知他们。

在Jenkins系统的配置或其他地方,是否有任何方法可以知道插件是否被任何作业使用?

更新2013年根据下面的答案,我维护简单的“插件:关键字”映射,例如

plugin_keys = {
    "git":'scm class="hudson.plugins.git.GitSCM"',
    "copyartifact":"hudson.plugins.copyartifact.CopyArtifact",
        # and more      
}

config.xml中搜索插件关键字,所有信息(插件、任务、配置)都可以通过Jenkins远程API获取。

对我很有效。

更新于2014.04.26 在较新的Jenkins版本中,似乎直接在config.xml中提供了插件名称。

例如:

<com.coravy.hudson.plugins.github.GithubProjectProperty plugin="github@1.4">
<hudson.plugins.throttleconcurrents.ThrottleJobProperty plugin="throttle-concurrents@1.7.2">
<hudson.plugins.disk__usage.DiskUsageProperty plugin="disk-usage@0.18"/>
<scm class="hudson.plugins.git.GitSCM" plugin="git@1.4.1-SNAPSHOT">
因此,我只需检查config.xml中的plugin="<plugin name>"插件,它会再次起作用。
更新2014.05.05
在gist jenkins-stats.py中查看完整脚本。
更新2018.6.7
现在有一个插件使用插件支持此功能(尚无REST API)。

1
请查看我的Gist获取完整的脚本,祝您使用愉快。 - Larry Cai
非常感谢您。感激您的帮助。 - user1164061
嗨Larry,你能解释一下你是如何获取使用的系统插件列表(例如Active Directory)的完整列表吗?我从你的脚本中没有理解。如果我查看系统的config.xml文件,其中有一些插件,但这不是一个完整的列表。还有一些在外部列出的插件,例如hudson.plugins.timestamper.TimestamperConfig.xml等。我们如何确定这些插件是否被使用? - user1164061
检查每个作业的config.xml中的plugin=对于几乎所有插件都有效,但是有一些插件(例如Mask Password)只有这一行。 <com.michelin.cio.hudson.plugins.maskpasswords.MaskPasswordsBuildWrapper/> - vikas027
感谢提供这个信息,可能我们需要向Jenkins社区提出建议以更好的方式实现。 - Larry Cai
显示剩余4条评论
4个回答

21

这里有两种方法可以查找这些信息。

最简单的方法可能是在作业配置文件中使用grep命令:

例如,当你知道插件的类名(或包名)时(例如org.jenkinsci.plugins.unity3d.Unity3dBuilder):

find $JENKINS_HOME/jobs/ -name config.xml -maxdepth 2 | xargs grep Unity3dBuilder

另一种方法是使用类似脚本插件的工具,但这需要更多有关插件在构建中使用的信息。

import hudson.model.*
import hudson.maven.*
import hudson.tasks.*

for(item in Hudson.instance.items) {
    //println("JOB : "+item.name);
    for (builder in item.builders){
      if (builder instanceof org.jenkinsci.plugins.unity3d.Unity3dBuilder) {
        println(">>" + item.name.padRight(50, " ") + "\t UNITY3D BUILDER with " + builder.unity3dName);
      }
    }
  }
}

更新:这里有一个小的脚本可以帮助你找到相关的类名。它肯定可以改进:

import jenkins.model.*;
import hudson.ExtensionFinder;

List<ExtensionFinder> finders = Jenkins.instance.getExtensionList(ExtensionFinder.class);

for (finder in finders) {
  println(">>> " + finder);
  if (finder instanceof hudson.ExtensionFinder.GuiceFinder) {
    println(finder.annotations.size());
    for (key in finder.annotations.keySet()) {
       println(key);
    }
  } else if (finder instanceof ruby.RubyExtensionFinder) {
    println(finder.parsedPlugins.size());
    for (plugin in finder.parsedPlugins) {
      for (extension in plugin.extensions) {
        println("ruby wrapper for " + extension.instance.clazz);
      }
    }
  } else if (finder instanceof hudson.cli.declarative.CLIRegisterer) {
    println(finder.discover(Jenkins.instance));
    for (extension in finder.discover(Jenkins.instance)) {
      println("CLI wrapper for " + extension.instance.class);
      // not sure what to do with those      
    }
  } else {
    println("UNKNOWN FINDER TYPE"); 
  }
}

(来自我最初列表JenkinsExtensions提交的内联脚本,提交到http://scriptlerweb.appspot.com,该网站似乎已经无法访问)

不要忘记备份!


很好的信息,而且获取类名似乎也很棘手。 - Larry Cai
很遗憾,答案中最新的URL已经失效。 - Vitalii Elenhaupt
你可以直接使用 grep 命令,而不是使用 find-xargs-grep 命令: grep Unity3dBuilder $JENKINS_HOME/jobs/*/config.xml - msa
3
这取决于您在磁盘上拥有的配置文件数量。如果您有很多作业,可能会遇到“grep: arg list too long”的错误。 - coffeebreaks
grep命令的另一个补充,我认为最有用的是:find . -maxdepth 4 -name config.xml | xargs -d '\n' grep Unity3dBuildermaxdepth 4,因为您可能有文件夹类型的作业-例如Jenkins _Pipeline Multibranch Plugin_作业。xargs -d'\n'用于处理目录包含空格的情况。 - Kutzi
你可以使用 grep -q 来忽略错误,使用 grep -i 来忽略大小写,使用 grep -iq 来忽略错误和大小写。 - Eduardo Cuomo

14

截至2018年初,有一个名为“插件使用插件”的插件可以给你一个很好的插件列表以及它们被使用的位置。我们注意到根据不同的系统,有时它似乎不能捕获所有的插件,但它提供了一个可扩展的插件列表,并列出了与特定插件相关的所有作业。

https://plugins.jenkins.io/plugin-usage-plugin

在流水线脚本中使用的插件通常不会被列出为作业使用的插件,因为它们是在Jenkinsfile中动态使用的。


1
很好,如果它支持REST API会更好。 - Larry Cai
5
插件使用我认为插件使用插件并不是很有用,因为它不能检测管道作业中的插件使用情况。我几个月前安装了这个插件,但是该插件仅报告我已安装插件中有 4/100 被使用,而我知道这是不正确的。后来我发现他们自己的文档也承认了这一点:"在管道脚本中使用的插件通常不会被列为作业所使用的插件,因为它们在 Jenkinsfiles 中动态使用。" - timblaktu
与上面的评论类似,我发现这个插件没有捕获到脚本作业的使用情况。"警告:此插件无法检测到脚本管道作业。声明性管道作业的支持是实验性的。作业数量:0" - Colm Bhandal

7

我不能发表评论,因为我的声望不够高,但如果可以的话,我想指出在coffeebreaks提供的有关小脚本的破损链接在被接受的答案中提到,可以在互联网档案馆的这个链接找到:

https://web.archive.org/web/20131103111754/http://scriptlerweb.appspot.com/script/show/97001

如果该链接失效,以下是脚本内容:

import jenkins.model.*;
import hudson.ExtensionFinder;

List<ExtensionFinder> finders = Jenkins.instance.getExtensionList(ExtensionFinder.class);

for (finder in finders) {
  println(">>> " + finder);
  if (finder instanceof hudson.ExtensionFinder.GuiceFinder) {
    println(finder.annotations.size());
    for (key in finder.annotations.keySet()) {
       println(key);
    }
  } else if (finder instanceof ruby.RubyExtensionFinder) {
    println(finder.parsedPlugins.size());
    for (plugin in finder.parsedPlugins) {
      for (extension in plugin.extensions) {
        println("ruby wrapper for " + extension.instance.clazz);
      }
    }
  } else if (finder instanceof hudson.cli.declarative.CLIRegisterer) {
    println(finder.discover(Jenkins.instance));
    for (extension in finder.discover(Jenkins.instance)) {
      println("CLI wrapper for " + extension.instance.class);
      // not sure what to do with those      
    }
  } else {
    println("UNKNOWN FINDER TYPE"); 
  }
}

谢谢Duff!我也内联了脚本(这个脚本也是我写的,所以没有版权问题)。 - coffeebreaks
嗨@Duff,我使用了上面的脚本,但我没有得到哪个作业正在使用哪个插件,我只得到了类似于Key[type=configurationslicing.logstash.LogStashSlicer, annotation=[none]]的东西。 - Dashrath Mundkar

0
我编写了一个参数化的Jenkins任务,它可以查找配置文件。你只需要知道插件在配置文件中生成的标签,并将该标签的名称用作参数needle
cd  $JENKINS_HOME
cd jobs
echo searching for $needle
find . -name config.xml -type f -exec grep $needle /dev/null {} \;

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