Как получить список установленных плагинов Jenkins с парой имени и версии

160

Как я могу получить список установленных плагинов Jenkins?

Я искал документ API удаленного доступа Jenkins, но он не был найден. Должен ли я использовать CLI Дженкинса? Есть ли документ или пример?

user1284795
источник

Ответы:

161

Вы можете получить информацию, используя консоль сценариев Jenkins, доступную при посещении http://<jenkins-url>/script. (Учитывая, что вы вошли в систему и имеете необходимые разрешения).

Снимок экрана консоли скриптов

Введите следующий скрипт Groovy, чтобы перебрать установленные плагины и распечатать соответствующую информацию:

Jenkins.instance.pluginManager.plugins.each{
  plugin -> 
    println ("${plugin.getDisplayName()} (${plugin.getShortName()}): ${plugin.getVersion()}")
}

Он напечатает список результатов примерно так (обрезано):

SScreenshot вывода скрипта

Это решение похоже на один из приведенных выше ответов в том, что оно использует Groovy, но здесь мы вместо этого используем консоль сценария. Консоль сценария чрезвычайно полезна при использовании Jenkins.

Обновить

Если вы предпочитаете отсортированный список, вы можете вызвать этот sortметод :

def pluginList = new ArrayList(Jenkins.instance.pluginManager.plugins)
pluginList.sort { it.getShortName() }.each{
  plugin -> 
    println ("${plugin.getDisplayName()} (${plugin.getShortName()}): ${plugin.getVersion()}")
}

Настройте Closure по своему вкусу (например, здесь он отсортирован по shortName, в примере он отсортирован по DisplayName)

Behe
источник
2
Из всех ответов это наиболее полезно для подачи сообщения об ошибке плагина; это можно сделать с помощью стандартного веб-интерфейса и получить результат в формате, который можно легко вставить в поле «Среда».
Аарон Д. Мараско
8
Отличный ответ для быстрого создания plugins.txt для докера Jenkins!
Эрик Энглунд
1
Может быть полезно добавить сортировку, чтобы список плагинов был согласованным: Jenkins.instance.pluginManager.plugins.sort({it.getDisplayName()}).each{ plugin -> println ("${plugin.getDisplayName()} (${plugin.getShortName()}): ${plugin.getVersion()}") }
wheleph
1
Это ответ, на который мы переключились локально вместо моего предложения XPath выше, обернутого запросом скручивания и некоторой отсечкой встроенных плагинов, мы используем этот подход для генерации plugins.txt для нашего образа докера, как упомянуто выше @ErikEnglund echo 'script=Jenkins.instance.pluginManager.plugins.each{ plugin -> println ("${plugin.getShortName()}:${plugin.getVersion()}") } null' \ | no_proxy=localhost curl --netrc --silent --data-binary @- -X POST "http://localhost:8080/jenkins/scriptText" | sort > plugins.txt
dbailey
8
Сортировка не работает, это неизменяемая карта в наши дни. Использование:jenkins.model.Jenkins.instance.getPluginManager().getPlugins().stream().sorted().each { println "${it.getShortName()} | ${it.getVersion()} | ${it.getDisplayName()}" }
Эд Рэндалл
96

В эти дни я использую тот же подход, что и ответ, описанный @Behe ниже вместо https://stackoverflow.com/a/35292719/1597808


Вы можете использовать API в сочетании с аргументами глубины, XPath и оболочки.

Следующее запросит API модуля pluginManager, чтобы получить список всех установленных плагинов, но только чтобы вернуть их атрибуты shortName и version. Конечно, вы можете получить дополнительные поля, добавив '|' до конца параметра XPath и указания шаблона для идентификации узла.

wget http://<jenkins>/pluginManager/api/xml?depth=1&xpath=/*/*/shortName|/*/*/version&wrapper=plugins

В этом случае требуется аргумент-обертка, поскольку он возвращает более одного узла как часть результата, поскольку он сопоставляет несколько полей с XPath и несколькими подключаемыми узлами.

Вероятно, полезно использовать следующий URL в браузере, чтобы увидеть, какая информация о плагинах доступна, а затем решить, что вы хотите ограничить с помощью XPath:

http://<jenkins>/pluginManager/api/xml?depth=1
dbailey
источник
Привет, Знаете ли вы, как получить список плагинов, которые фактически используются заданиями Jenkins и системой Jenkins, а не полный список установленных плагинов? Спасибо
user1164061
3
У меня хорошо работало в Mac OS X. Я хотел преобразовать вывод в простой текстовый список, поэтому использовал некоторое регулярное выражение Perl для удаления тегов:curl 'http://192.168.197.133:8080/pluginManager/api/xml?depth=1&xpath=/*/*/shortName|/*/*/version&wrapper=plugins' | perl -pe 's/.*?<shortName>([\w-]+).*?<version>([^<]+)()(<\/\w+>)+/\1 \2\n/g'
G. Lombard
8
Альтернатива в формате JSON:curl -s -k "http://jenkins/pluginManager/api/json?depth=1" | jq '.plugins[]|{shortName, version,longName}' -c
MarkHu
1
Я считаю, что это требует прав администратора, но я не уверен.
mkobit
2
Подтверждено, что для этого требуются права администратора в соответствии с рекомендациями по безопасности 2016-05-11 .
Mkobit
29

Дженкинс 1,588 (2 - е ноября 2014 г.) и 1,647 (4 - е февраля, 2016)

  • Дженкинс> Управление Дженкинс

    введите описание изображения здесь

  • Системная информация

    введите описание изображения здесь

  • Плагины

    введите описание изображения здесь

ROMANIA_engineer
источник
1
Это очень просто, и я могу получить список с сервера DEV и PRD, вставить их в Excel и сравнить их версии рядом.
Цзиронг Ху
24

CLI Jenkins поддерживает перечисление всех установленных плагинов:

java -jar jenkins-cli.jar -s http://localhost:8080/ list-plugins

wmli
источник
Это не будет перечислять состояние плагина.
ахан
1
И команда list-pluginsCLI не требует, чтобы у пользователя было полное разрешение / RunScripts, как у groovyкоманды.
Хосе Андиас
Это не похоже на работу с токеном API, если пользователь / токен не "Общий / Администратор".
cgseller
21

Используйте Jenkins CLI следующим образом:

java -jar jenkins-cli.jar -s http://[jenkins_server] groovy = < pluginEnumerator.groovy

=в вызове означает «читать со стандартного ввода» . pluginEnumerator.groovy содержит следующий код Groovy:

println "Running plugin enumerator"
println ""
def plugins = jenkins.model.Jenkins.instance.getPluginManager().getPlugins()
plugins.each {println "${it.getShortName()} - ${it.getVersion()}"}
println ""
println "Total number of plugins: ${plugins.size()}"

Если вы хотите поиграть с кодом, вот документация Jenkins Java API .

malenkiy_scot
источник
@ user1284795, это было полезно?
malenkiy_scot
1
Привет, вы знаете, как получить плагины, используемые системой Jenkins и заданием Jenkins, вместо того, чтобы устанавливать все плагины? Я хотел бы, чтобы это помогло мне удалить все неиспользуемые плагины. Любая помощь приветствуется. Спасибо!
user1164061
Это должен быть принятый ответ. @ user1164061, я не думаю, что есть какие-либо различия между плагинами, видимыми для задания, и для сервера. В isActive()этом ответе есть API- интерфейс, который вы можете использовать в скрипте groovy для получения состояния плагина. См. Javadoc.jenkins-ci.org/hudson/PluginWrapper.html#isActive () .
ахан
20

Если вы работаете в среде докера и хотите вывести список плагинов в формате plugins.txt, чтобы передать его в install_scripts.sh, используйте следующие сценарии в http://{jenkins}/scriptконсоли:

  1. Эта версия полезна для получения конкретной версии пакета
Jenkins.instance.pluginManager.plugins.each{
  plugin -> 
    println ("${plugin.getShortName()}:${plugin.getVersion()}")
}
  1. Если вам нужен только плагин с последней версией, вы можете использовать это (спасибо @KymikoLoco за подсказку)
Jenkins.instance.pluginManager.plugins.each{
  plugin -> 
    println ("${plugin.getShortName()}:latest")
}
Алессандро Лукарини
источник
1
Если вы хотите получить последние версии всех плагинов, вы можете расширить это, чтобы получить только короткое имя и добавить :latestв конец:println ("${plugin.getShortName()}:latest")
KymikoLoco
17

Ответы здесь были несколько неполными. И мне пришлось собирать информацию из других источников, чтобы фактически получить список плагинов.

1. Получить Дженкинс CLI

CLI Jenkins позволит нам взаимодействовать с нашим сервером Jenkins из командной строки. Мы можем получить это с помощью простого вызова curl.

curl 'localhost:8080/jnlpJars/jenkins-cli.jar' > jenkins-cli.jar

2. Создать скрипт Groovy для разбора (спасибо malenkiy_scot)

Сохраните следующее как plugins.groovy.

def plugins = jenkins.model.Jenkins.instance.getPluginManager().getPlugins()
plugins.each {println "${it.getShortName()}: ${it.getVersion()}"}

3. Позвоните в Jenkins API для получения результатов плагинов.

Вызовите сервер Jenkins ( localhost:8080здесь), указав свое имя пользователя и пароль для входа, ссылаясь на скрипт Groovy:

java -jar jenkins-cli.jar -s http://localhost:8080 groovy --username "admin" --password "admin" = < plugins.groovy > plugins.txt

Вывод в plugins.txt выглядит следующим образом:

ace-editor: 1.1
ant: 1.5
antisamy-markup-formatter: 1.5
authentication-tokens: 1.3
blueocean-autofavorite: 1.0.0
blueocean-commons: 1.1.4
blueocean-config: 1.1.4
blueocean-dashboard: 1.1.4
blueocean-display-url: 2.0
blueocean-events: 1.1.4
blueocean-git-pipeline: 1.1.4
blueocean-github-pipeline: 1.1.4
blueocean-i18n: 1.1.4
blueocean-jwt: 1.1.4
blueocean-personalization: 1.1.4
blueocean-pipeline-api-impl: 1.1.4
blueocean-pipeline-editor: 0.2.0
blueocean-pipeline-scm-api: 1.1.4
blueocean-rest-impl: 1.1.4
noqcks
источник
Вышеуказанные команды должны выполняться на вашей рабочей станции, а не на задании Jenkins
user3740244
Похоже, что в результате выполнения этой команды в последних версиях появляется сообщение «ОШИБКА: анонимному пользователю не хватает разрешения« Полное / Чтение »... вместо того, чтобы пройти проверку подлинности, прежде чем это сработало, ява -jar jenkins-cli.jar -s localhost: 8080 -auth» admin: < пароль> "groovy = <plugins.groovy
prasanna
12

Ответ Бихе с сортировкой плагинов не работал на моей машине Дженкинс. Я получил сообщение об ошибке java.lang.UnsupportedOperationExceptionиз - за пытаюсь разобраться непреложными коллекциями ИЭ Jenkins.instance.pluginManager.plugins. Простое исправление для кода:

List<String> jenkinsPlugins = new ArrayList<String>(Jenkins.instance.pluginManager.plugins);
jenkinsPlugins.sort { it.displayName }
              .each { plugin ->
                   println ("${plugin.shortName}:${plugin.version}")
              }

Используйте http://<jenkins-url>/scriptURL для запуска кода.

Алессо
источник
1
Я столкнулся с этим, используя версию Jenkins, отличную от первой системы, на которой я его тестировал. Для v2.81 верхний ответ работал, но для LTS v2.83.x и любых более новых версий он дал ошибку, о которой вы упоминали, пока ваш код все еще работал.
dragon788
1
Одна вещь, которую я только что заметил, это то, что вы сортируете по displayNameвремени распечатывания shortName, это очень сбивает с толку, так как некоторые плагины не одинаковы для обоих по алфавиту, и в результате получается список, который не выглядит отсортированным. Изменение it.displayNameк it.shortNameРешает это красиво.
dragon788
8

Если вы являетесь администратором Jenkins, вы можете использовать информационную страницу системы Jenkins:

http://<jenkinsurl>/systemInfo
Энди Джи
источник
/systeminfoне работает (HTTP 404) на Jenkins 1.594
Г. Ломбард
7
Попробуйте - http://localhost:8080/systemInfoнекоторые серверы чувствительны к регистру. Также обратите внимание, что для этого требуется, чтобы в данный момент вошедший в систему пользователь имел разрешение «Общий / Администратор».
MarkHu
8

С curlи jq:

curl -s <jenkins_url>/pluginManager/api/json?depth=1 \
  | jq -r '.plugins[] | "\(.shortName):\(.version)"' \
  | sort

Эта команда выводит данные в формате, используемом специальным plugins.txtфайлом Jenkins, который позволяет предварительно установить зависимости (например, в образе докера):

ace-editor:1.1
ant:1.8
apache-httpcomponents-client-4-api:4.5.5-3.0

Пример plugins.txt: https://github.com/hoto/jenkinsfile-examples/blob/master/source/jenkins/usr/share/jenkins/plugins.txt

Анджей Реманн
источник
5

С домашней страницы Дженкинс:

  1. Нажмите Управление Дженкинс .
  2. Нажмите Управление плагинами .
  3. Нажмите на установленную вкладку.

Или

  1. Перейдите непосредственно к URL-адресу Jenkins: {ваш базовый URL-адрес Jenkins} / pluginManager / установлен
Джеймс Лаврук
источник
1
Страница «Установленные плагины» не обязательно отражает реальный статус плагина. Например, вы можете повторно включить плагин и увидеть, что плагин отмечен, в то время как плагин все еще отключен до перезапуска Jenkins. Поэтому единственными 100% решениями являются http: // <jenkinsurl> / systeminfo и ответы на запросы API, imho.
t0r0X
4

Совместное использование другого варианта, найденного здесь, с учетными данными

JENKINS_HOST=username:password@myhost.com:port
curl -sSL "http://$JENKINS_HOST/pluginManager/api/xml?depth=1&xpath=/*/*/shortName|/*/*/version&wrapper=plugins" | perl -pe 's/.*?<shortName>([\w-]+).*?<version>([^<]+)()(<\/\w+>)+/\1 \2\n/g'|sed 's/ /:/'
Вишну
источник
как указано выше, но без версий и отсортировано. curl -sSL "http://127.0.0.1:8080/pluginManager/api/xml?depth=1&xpath=/*/*/shortName|/*/*/version&wrapper=plugins" | perl -pe 's/.*?<shortName>([\w-]+).*?<version>([^<]+)()(<\/\w+>)+/\1 \n/g' | sort
ffghfgh
3

Я хотел решение, которое могло бы работать на master без каких-либо требований авторизации и не видел его здесь. Я сделал быстрый скрипт bash, который вытащит все версии из каталога плагинов.

if [ -f $JENKINS_HOME/plugin_versions.txt ]; then
  rm $JENKINS_HOME/plugin_versions.txt
fi

for dir in $JENKINS_HOME/plugins/*/; do
  dir=${dir%*/}
  dir=${dir##*/}
  version=$(grep Plugin-Version $JENKINS_HOME/plugins/$dir/META-INF/MANIFEST.MF | awk -F': ' '{print $2}')
  echo $dir $version >> $JENKINS_HOME/plugin_versions.txt
done
Кевин Бротке
источник
grep Plugin-Version */META-INF/MANIFEST.MF | sed -e 's!/META-INF/MANIFEST.MF:Plugin-Version: !:!g' > ../plugins2.txt
Джеймс Дюпон
2

Еще один вариант для пользователей Python:

from jenkinsapi.jenkins import Jenkins

#get the server instance
jenkins_url = 'http://<jenkins-hostname>:<jenkins-port>/jenkins'
server = Jenkins(jenkins_url, username = '<user>', password = '<password>')

#get the installed plugins as list and print the pairs
plugins_dictionary = server.get_plugins().get_plugins_dict()
for key, value in plugins_dictionary.iteritems():
    print "Plugin name: %s, version: %s" %(key, value.version)
Тидхар Кляйн Орбах
источник
2

Я думаю, что это не достаточно хороший ответ (ы) ... многие включают в себя пару дополнительных шагов под капотом. Вот как я это сделал.

sudo apt-get install jq

... потому что вывод JSON необходимо использовать после вызова API.

#!/bin/bash
server_addr = 'jenkins'
server_port = '8080'

curl -s -k "http://${server_addr}:${server_port}/pluginManager/api/json?depth=1" \
  | jq '.plugins[]|{shortName, version,longName,url}' -c | sort \
  > plugin-list

echo "dude, here's your list: "
cat plugin-list
hhony
источник
1

Вас также может заинтересовать, какие обновления доступны для плагинов. Для этого вам необходимо объединить данные об установленных плагинах с информацией об обновлениях, доступной здесь https://updates.jenkins.io/current/update-center.json .

Чтобы проанализировать загруженный файл как JSON, вы должны прочитать онлайн вторую строку (которая огромна).

Войцех Sciesinski
источник
1
# list of plugins in sorted order
# Copy this into your Jenkins script console
    def plugins = jenkins.model.Jenkins.instance.getPluginManager().getPlugins()

    List<String> list = new ArrayList<String>()

    i = 0
    plugins.each {
      ++i
      //println " ${i}  ${it.getShortName()}: ${it.getVersion()}"
      list.add("${it.getShortName()}: ${it.getVersion()}")
    }

    list.sort{it}
    i = 0
    for (String item : list) {
      i++
      println(" ${i} ${item}")
    }
Брайан
источник
0

В таблице http: // jenkins / systemInfo приведена таблица со всеми установленными плагинами и с указанием, включены ли они.

Тсуна
источник
0

Если Jenkins запускается в контейнере Jenkins Docker, вы можете использовать эту командную строку в Bash:

java -jar /var/jenkins_home/war/WEB-INF/jenkins-cli.jar -s http://localhost:8080/ list-plugins --username admin --password `/bin/cat /var/jenkins_home/secrets/initialAdminPassword`
Huluvu424242
источник
0

Для версии Jenkins 2.125 сработало следующее.

ПРИМЕЧАНИЕ. Замените разделы с именами USERNAME и APIKEY действительными UserName и APIKey для этого соответствующего пользователя. Ключ API для пользователя доступен через Управление пользователямиВыбрать пользователяКлюч API .

Возможно, вам придется продлить сон, если установка Jenkins занимает больше времени для запуска.

Инициация yum update -yтакже обновит версию, если вы установили Jenkins также с помощью yum.

#JENKINS AUTO UPDATE SCRIPT link this script into a cron
##############
!/bin/bash
sudo yum update -y
sleep 120
UPDATE_LIST=$( sudo /usr/bin/java -jar /var/cache/jenkins/war/WEB-INF/jenkins-cli.jar -auth [USERNAME:APIKEY] -s http://localhost:8080/ list-plugins | grep -e ')$' | awk '{ print $1 }' );
if [ ! -z "${UPDATE_LIST}" ]; then
    echo Updating Jenkins Plugins: ${UPDATE_LIST};
    sudo /usr/bin/java -jar /var/cache/jenkins/war/WEB-INF/jenkins-cli.jar -auth [USERNAME:APIKEY] -s http://localhost:8080/ install-plugin ${UPDATE_LIST};
    sudo /usr/bin/java -jar /var/cache/jenkins/war/WEB-INF/jenkins-cli.jar -auth [USERNAME:APIKEY] -s http://localhost:8080/ safe-restart;
fi
##############
gdd1984
источник
0

Есть много способов получить эту информацию, но я пишу двумя способами, как показано ниже:

1. Получить Дженкинс кли.

CLI jenkins позволит нам взаимодействовать с нашим сервером jenkins из командной строки. Мы можем получить это с помощью простого вызова curl.

curl 'localhost:8080/jnlpJars/jenkins-cli.jar' > jenkins-cli.jar

2. Создайте заводной скрипт. ИЛИ из консоли скриптов jenkins

Нам нужно создать отличный скрипт для анализа информации, которую мы получаем от API jenkins. Это выведет каждый плагин с его версией. Сохраните следующее как plugins.groovy.

def plugins = jenkins.model.Jenkins.instance.getPluginManager().getPlugins() plugins.each {println "${it.getShortName()}: ${it.getVersion()}"}

user128364
источник