Как я могу узнать, используется ли плагин для любых заданий в jenkins

У Дженкинса были плагины 600+, в реальной системе мы привыкли устанавливать множество плагинов.

И иногда мы хотим удалить некоторые плагины, чтобы сделать систему более чистой, или заменить их другим зрелым плагином (другое название).

Это должно гарантировать, что никто/никакая работа не использует эти плагины, или я должен уведомить их.

Есть ли в конфигурации или где-нибудь в системе Jenkins какие-либо способы узнать, используется ли плагин для каких-либо заданий?

ОБНОВЛЕНИЕ 2013 Основываясь на ответе ниже, я поддерживаю простое отображение "плагин: ключевое слово", например

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

И найдите ключевое слово плагина из config.xml, всю информацию (плагины, задания, конфиг) можно получить через удаленный API jenkins.

меня устраивает.

ОБНОВЛЕНИЕ 2014.04.26 Более поздняя версия jenkins, кажется, что config.xml изменен, чтобы иметь имя плагина там

подобно

<com.coravy.hudson.plugins.github.GithubProjectProperty plugin="[email protected]">
<hudson.plugins.throttleconcurrents.ThrottleJobProperty plugin="[email protected]">
<hudson.plugins.disk__usage.DiskUsageProperty plugin="[email protected]"/>
<scm class="hudson.plugins.git.GitSCM" plugin="[email protected]">

Поэтому я просто проверяю этот plugin="<plugin name>" в config.xml, он снова работает

ОБНОВЛЕНИЕ 2014.05.05

Смотрите полный сценарий в Gist jenkins-stats.py

ОБНОВЛЕНИЕ 2018.6.7

Существует поддержка плагинов использования плагинов (пока нет REST API)

Ответ 1

Вот два способа найти эту информацию.

Самый простой способ - это, чтобы grep файлы конфигурации задания:

например. когда вы знаете имя класса (или имя пакета) вашего плагина (например, org.jenkinsci.plugins.unity3d.Unity3dBuilder):

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

Другой - использовать что-то вроде плагин 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);
      }
    }
  }
}

Обновить: здесь небольшой скрипт script, который может облегчить вам поиск соответствующих имен классов. Это, безусловно, может быть улучшено:

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"); 
  }
}

(встроенный скрипт из моего исходного списка listJenkinsExtensions для http://scriptlerweb.appspot.com, который кажется пустым)

Не забудьте сделать резервную копию!

Ответ 2

Я не могу комментировать, потому что у меня недостаточно репутации, но если бы я мог, я бы указал, что неработающая ссылка coffeebreaks для небольшой скрипт script, упомянутый в принятом ответе, можно найти в интернет-архиве по этой ссылке:

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

В случае разрыва ссылки, вот содержание script:

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"); 
  }
}

Ответ 3

По состоянию на начало 2018 года появился "Плагин использования плагинов", который дает вам хороший список плагинов и места их использования. Мы заметили, что в зависимости от системы иногда кажется, что она не перехватывает все плагины, но дает действительно прекрасный список плагинов и все задания, связанные с конкретным плагином в расширяемом списке.

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