如何知道插件是否被jenkins中的任何作业使用

Lar*_*Cai 38 jenkins jenkins-plugins

Jenkins有600多个插件,在真实系统中,我们习惯于安装大量插件.

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

这需要确保没有人/没有工作使用这些插件或我需要通知他们.

在Jenkins系统中是否有任何配置或知道该插件是否被任何作业使用的方法?

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

plugin_keys = {
    "git":'scm class="hudson.plugins.git.GitSCM"',
    "copyartifact":"hudson.plugins.copyartifact.CopyArtifact",
        # and more      
}
Run Code Online (Sandbox Code Playgroud)

并从中搜索plugin关键字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">
Run Code Online (Sandbox Code Playgroud)

因此,我只是检查这个plugin="<plugin name>"config.xml,它再次工作

更新2014.05.05

请参阅gist jenkins-stats.py中的完整脚本

更新2018.6.7

插件使用的插件支持这个(没有REST API还)

cof*_*aks 15

以下是查找该信息的两种方法.

最简单的可能是grep作业配置文件:

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

find $JENKINS_HOME/jobs/ -name config.xml -maxdepth 2 | xargs grep Unity3dBuilder
Run Code Online (Sandbox Code Playgroud)

另一个是使用类似scriptler插件的东西,但是你需要更多关于插件在构建中的使用位置的信息.

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);
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

更新:这是一个小的scriplet脚本,可以帮助您轻松找到相关的类名.它肯定可以改进:

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"); 
  }
}
Run Code Online (Sandbox Code Playgroud)

(内联scriplet从我原来的listJenkinsExtensions提交到http://scriptlerweb.appspot.com这似乎下来了)

别忘了备份!

  • @msa这取决于磁盘上的配置文件数量.如果你有很多工作,你可能会遇到`grep:arg list too long}错误. (3认同)

dra*_*788 8

截至2018年初,有一个“插件使用插件”,为您提供了很好的插件列表以及使用位置。我们注意到,有时视系统而定,它似乎无法捕获所有插件,但它在扩展列表中提供了一个非常可爱的插件列表以及与特定插件相关的所有作业。

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

  • 插件使用情况 在我看来,插件不是很有用,因为它不会检测管道作业中的插件使用情况。我几个月前安装的,插件只报告说我安装的插件中​​有 4/100 被使用,我知道这是错误的。然后我发现他们自己的文档也承认这一点:“管道脚本中使用的插件通常不会像作业所使用的那样列出,因为它们是在 Jenkinsfiles 中动态使用的。” (4认同)

Duf*_*uff 6

我无法发表评论,因为我没有足够的声誉,但如果可以的话,我会指出,在接受的答案中提到的用于小型scriplet脚本的coffeebreaks提供的断开链接可以在Internet Archive上找到,在此链接:

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"); 
  }
}
Run Code Online (Sandbox Code Playgroud)