Jak uzyskać listę zainstalowanych wtyczek Jenkins z parą nazw i wersji


159

Jak mogę uzyskać listę zainstalowanych wtyczek Jenkins?

Przeszukałem dokument Jenkins Remote Access API, ale nie został znaleziony. Czy powinienem używać interfejsu wiersza polecenia Jenkinsa? Czy jest dokument lub przykład?

Odpowiedzi:


161

Informacje można pobrać za pomocą konsoli Jenkins Script Console, do której można uzyskać dostęp, odwiedzając witrynę http://<jenkins-url>/script. (Zakładając, że jesteś zalogowany i masz wymagane uprawnienia).

Zrzut ekranu konsoli skryptów

Wprowadź następujący skrypt Groovy, aby iterować po zainstalowanych wtyczkach i wydrukować odpowiednie informacje:

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

Lista wyników zostanie wydrukowana w następujący sposób (obcięta):

SScreenshot wyjścia skryptu

To rozwiązanie jest podobne do jednej z powyższych odpowiedzi , ponieważ używa Groovy, ale tutaj używamy zamiast tego konsoli skryptów. Konsola skryptów jest niezwykle pomocna podczas korzystania z Jenkinsa.

Aktualizacja

Jeśli wolisz posortowaną listę, możesz wywołać tę sortmetodę :

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

Dostosuj zamknięcie do swoich upodobań (np. Tutaj jest sortowane według shortName, w przykładzie jest sortowane według DisplayName)


2
Ze wszystkich odpowiedzi jest to najbardziej przydatne przy zgłaszaniu błędu wtyczki; można to zrobić przy użyciu standardowego interfejsu użytkownika sieci Web i daje wynik w formacie, który można łatwo wkleić w polu „Środowisko”.
Aaron D. Marasco

8
Świetna odpowiedź na szybkie tworzenie pliku plugins.txt dla dockera Jenkinsa!
Erik Englund

1
Przydatne może być dodanie sortowania, aby lista wtyczek była spójna: Jenkins.instance.pluginManager.plugins.sort({it.getDisplayName()}).each{ plugin -> println ("${plugin.getDisplayName()} (${plugin.getShortName()}): ${plugin.getVersion()}") }
wheleph

1
To jest odpowiedź, na którą przełączyliśmy się lokalnie zamiast mojej sugestii XPath powyżej, opakowana żądaniem curl i niektórymi przycinaniem wbudowanych wtyczek źródłowych, używamy tego podejścia do generowania plugins.txt dla naszego obrazu dockera, jak wspomniano powyżej @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
Ten rodzaj nie działa, w dzisiejszych czasach jest to mapa niemodyfikowalna. Użyj:jenkins.model.Jenkins.instance.getPluginManager().getPlugins().stream().sorted().each { println "${it.getShortName()} | ${it.getVersion()} | ${it.getDisplayName()}" }
Ed Randall

96

Obecnie używam tego samego podejścia, co odpowiedź opisana przez @Behe poniżej zamiast https://stackoverflow.com/a/35292719/1597808


Możesz używać interfejsu API w połączeniu z argumentami depth, XPath i wrapper.

Następujące polecenie wyśle ​​zapytanie do interfejsu API pluginManager, aby wyświetlić listę wszystkich zainstalowanych wtyczek, ale tylko w celu zwrócenia ich atrybutów shortName i version. Możesz oczywiście pobrać dodatkowe pola, dodając „|” na końcu parametru XPath i określając wzorzec identyfikujący węzeł.

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

Argument opakowujący jest wymagany w tym przypadku, ponieważ zwraca więcej niż jeden węzeł jako część wyniku, zarówno pod względem dopasowania wielu pól do XPath, jak i wielu węzłów wtyczki.

Prawdopodobnie przydatne jest użycie następującego adresu URL w przeglądarce, aby zobaczyć, jakie informacje o wtyczkach są dostępne, a następnie zdecydować, co chcesz ograniczyć za pomocą XPath:

http://<jenkins>/pluginManager/api/xml?depth=1

Cześć, czy wiesz, jak uzyskać listę wtyczek, które są faktycznie używane przez zadania Jenkins i system Jenkins, a nie pełną listę zainstalowanych wtyczek? Dzięki
user1164061

3
Działało dobrze w systemie Mac OS X. Chciałem przekonwertować dane wyjściowe na zwykłą listę tekstową, więc użyłem wyrażenia regularnego Perl do usunięcia tagów: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
Alternatywa w formacie JSON:curl -s -k "http://jenkins/pluginManager/api/json?depth=1" | jq '.plugins[]|{shortName, version,longName}' -c
MarkHu

1
Uważam, że wymaga to uprawnień administracyjnych, ale nie jestem pewien.
mkobit

2
Potwierdzono, że wymaga to uprawnień administratora zgodnie z zaleceniem bezpieczeństwa 11.05.2016 .
mkobit

29

Jenkins 1,588 (2 nd od listopada 2014) i 1,647 (4 th of lutego 2016)

  • Jenkins> Zarządzaj Jenkins

    wprowadź opis obrazu tutaj

  • Informacje o systemie

    wprowadź opis obrazu tutaj

  • Wtyczki

    wprowadź opis obrazu tutaj


1
Jest to bardzo proste i jestem w stanie pobrać listę z serwera DEV i PRD, wkleić je do Excela i porównać ich wersje obok siebie.
Jirong Hu,

24

Interfejs wiersza polecenia Jenkinsa obsługuje wyświetlanie wszystkich zainstalowanych wtyczek:

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


To nie wyświetli stanu wtyczki.
akhan

1
A list-pluginspolecenie CLI nie wymaga od użytkownika posiadania uprawnienia General / RunScripts, jak to groovyrobi polecenie.
José Andias

Wydaje się, że nie działa to z tokenem API, jeśli użytkownik / token nie jest „Ogólny / Administrator”.
cgseller

21

Użyj Jenkins CLI w następujący sposób:

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

=w wywołaniu oznacza „czytaj ze standardowego wejścia” . pluginEnumerator.groovy zawiera następujący kod 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()}"

Jeśli chcesz bawić się kodem, oto dokumentacja Jenkins Java API .


@ user1284795, czy to było pomocne?
malenkiy_scot

1
Cześć, czy wiesz, jak uzyskać wtyczki używane przez system Jenkins i zadanie Jenkins zamiast instalować wszystkie wtyczki? Chciałbym, aby to pomogło mi odinstalować wszystkie nieużywane wtyczki. Każda pomoc jest mile widziana. Dzięki!
user1164061

To powinna być akceptowana odpowiedź. @ user1164061, wydaje mi się, że nie ma różnicy między wtyczkami widocznymi w zadaniu a wtyczkami na serwerze. Istnieje isActive()interfejs API, którego możesz użyć w skrypcie groovy w tej odpowiedzi, aby uzyskać stan wtyczki. Zobacz javadoc.jenkins-ci.org/hudson/PluginWrapper.html#isActive () .
akhan

20

Jeśli pracujesz w środowisku docker i chcesz wyprowadzić listę wtyczek w formacie plugins.txt, aby przekazać ją do pliku install_scripts.sh, użyj tych skryptów w http://{jenkins}/scriptkonsoli:

  1. Ta wersja jest przydatna do pobierania określonej wersji pakietu
Jenkins.instance.pluginManager.plugins.each{
  plugin -> 
    println ("${plugin.getShortName()}:${plugin.getVersion()}")
}
  1. Jeśli chcesz tylko wtyczki z najnowszą wersją, możesz jej użyć (dzięki @KymikoLoco za wskazówkę)
Jenkins.instance.pluginManager.plugins.each{
  plugin -> 
    println ("${plugin.getShortName()}:latest")
}

1
Jeśli chcesz uzyskać najnowsze wersje wszystkich wtyczek, możesz to rozszerzyć, aby uzyskać tylko krótką nazwę i dodać :latestna końcu:println ("${plugin.getShortName()}:latest")
KymikoLoco

17

Odpowiedzi tutaj były nieco niekompletne. I musiałem skompilować informacje z innych źródeł, aby faktycznie uzyskać listę wtyczek.

1. Pobierz Jenkins CLI

Interfejs wiersza polecenia Jenkins pozwoli nam na interakcję z naszym serwerem Jenkins z wiersza poleceń. Możemy to uzyskać za pomocą prostego zawijania.

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

2. Utwórz skrypt Groovy do parsowania (dzięki malenkiy_scot)

Zapisz poniższe jako plugins.groovy.

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

3. Wywołaj interfejs API Jenkinsa, aby uzyskać wyniki wtyczki

Zadzwoń do serwera Jenkins ( localhost:8080tutaj), podając swoją nazwę użytkownika i hasło podczas odwoływania się do skryptu Groovy:

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

Dane wyjściowe pliku plugins.txt wyglądają następująco:

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

Powyższe polecenia powinny działać na Twojej stacji roboczej, a nie na zadaniu Jenkinsa
user3740244

Wydaje się, że polecenie powoduje „BŁĄD: anonimowe brakuje uprawnienia Ogólne / Odczyt” w najnowszych wersjach .. zamiast tego przekazywanie autoryzacji, zanim zadziałało dla mnie java -jar jenkins-cli.jar -s localhost: 8080 -auth "admin: < hasło> "groovy = <plugins.groovy
prasanna

12

Odpowiedź Behe'ego z sortowaniem wtyczek nie działała na moim komputerze z Jenkinsem. Otrzymałem błąd java.lang.UnsupportedOperationExceptionz powodu próbuje uporządkować niezmiennej zebraniu tzn Jenkins.instance.pluginManager.plugins. Prosta poprawka dla kodu:

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

Użyj http://<jenkins-url>/scriptadresu URL, aby uruchomić kod.


1
Natknąłem się na to również, używając innej wersji Jenkinsa niż pierwszy system, na którym go testowałem. Dla wersji 2.81 najlepsza odpowiedź zadziałała, ale dla LTS v2.83.x i wszystkich nowszych wersji dała błąd, o którym wspomniałeś, podczas gdy kod nadal działał.
dragon788

1
Jedną z rzeczy, które właśnie zauważyłem, jest sortowanie na podstawie displayNamepodczas drukowania shortName, było to bardzo zagmatwane, ponieważ niektóre wtyczki nie są takie same alfabetycznie dla obu i skutkuje listą, która nie pojawia się posortowana. Zmiana, it.displayNameaby it.shortNameładnie to rozwiązać.
dragon788,

8

Jeśli jesteś administratorem Jenkins, możesz skorzystać ze strony informacji o systemie Jenkins:

http://<jenkinsurl>/systemInfo

/systeminfonie działa (HTTP 404) na Jenkins 1.594
G. Lombard

7
Spróbuj - na http://localhost:8080/systemInfoniektórych serwerach jest rozróżniana wielkość liter. Zwróć również uwagę, że wymaga to, aby aktualnie zalogowany użytkownik miał uprawnienia Ogólne / Administrowanie.
MarkHu

8

Z curli jq:

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

To polecenie daje dane wyjściowe w formacie używanym przez specjalny plugins.txtplik Jenkins , który umożliwia preinstalację zależności (np. W obrazie dockera):

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

Przykład plugins.txt: https://github.com/hoto/jenkinsfile-examples/blob/master/source/jenkins/usr/share/jenkins/plugins.txt


5

Ze strony głównej Jenkins:

  1. Kliknij Zarządzaj Jenkins .
  2. Kliknij Zarządzaj wtyczkami .
  3. Kliknij kartę Zainstalowane .

Lub

  1. Przejdź bezpośrednio do adresu URL Jenkinsa: {Twój podstawowy adres URL Jenkinsa} / pluginManager / installed

1
Strona „zainstalowane wtyczki” niekoniecznie odzwierciedla rzeczywisty stan wtyczki. Np. Możesz ponownie włączyć wtyczkę i sprawdzić, czy wtyczka jest zaznaczona, podczas gdy wtyczka jest nadal wyłączona do czasu ponownego uruchomienia Jenkinsa. Dlatego jedynymi rozwiązaniami w 100% są http: // <jenkinsurl> / systeminfo i odpowiedzi na zapytania API, imho.
t0r0X

4

Udostępnianie innej opcji znalezionej tutaj z poświadczeniami

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/ /:/'

jak wyżej, ale bez wersji i posortowane. 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

Chciałem rozwiązania, które mogłoby działać na serwerze głównym bez żadnych wymagań autoryzacji i nie widziałem go tutaj. Zrobiłem szybki skrypt basha, który wyciągnie wszystkie wersje z wtyczek reż.

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
james dupont

2

Myślę, że to nie są wystarczająco dobre odpowiedzi ... wiele z nich wymaga kilku dodatkowych kroków pod maską. Oto jak to zrobiłem.

sudo apt-get install jq

... ponieważ dane wyjściowe JSON muszą zostać wykorzystane po wywołaniu interfejsu 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

1

Inna opcja dla użytkowników Pythona:

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)

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

Jeśli Jenkins działa w kontenerze Jenkins Docker, możesz użyć tego wiersza poleceń w 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`

0

W przypadku wersji Jenkins 2.125 działały następujące rozwiązania.

UWAGA: Zastąp sekcje, które mówią USERNAME i APIKEY, prawidłowymi nazwami użytkownika i APIKey dla tego odpowiedniego użytkownika. Klucz API dla użytkownika jest dostępny w opcji Zarządzaj użytkownikamiWybierz użytkownikaKlucz API .

Może być konieczne przedłużenie uśpienia, jeśli instalacja Jenkinsa trwa dłużej.

Inicjacja yum update -yzaktualizuje również wersję, jeśli zainstalowałeś Jenkins również za pomocą 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
##############

0

Istnieje wiele sposobów na pobranie tych informacji, ale piszę dwa sposoby, jak poniżej: -

1. Pobierz Cli Jenkinsa.

Interfejs wiersza poleceń jenkins pozwoli nam na interakcję z naszym serwerem jenkins z wiersza poleceń. Możemy to uzyskać za pomocą prostego zawijania.

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

2. Stwórz wspaniały skrypt. LUB z konsoli skryptu Jenkinsa

Musimy stworzyć świetny skrypt, aby przeanalizować informacje otrzymane z API Jenkinsa. Spowoduje to wyświetlenie każdej wtyczki wraz z jej wersją. Zapisz poniższe jako plugins.groovy.

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


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.