Cara mendapatkan daftar plugin Jenkins yang terinstal dengan pasangan nama dan versi

160

Bagaimana saya bisa mendapatkan daftar plugin Jenkins yang diinstal?

Saya mencari dokumen Jenkins Remote Access API, tetapi tidak ditemukan. Haruskah saya menggunakan CLI Jenkins? Apakah ada dokumen atau contoh?

pengguna1284795
sumber

Jawaban:

161

Anda dapat mengambil informasi menggunakan Konsol Script Jenkins yang dapat diakses dengan mengunjungi http://<jenkins-url>/script. (Mengingat bahwa Anda masuk dan memiliki izin yang diperlukan).

Cuplikan layar dari Script Console

Masukkan skrip Groovy berikut untuk beralih di atas plugin yang diinstal dan mencetak informasi yang relevan:

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

Ini akan mencetak daftar hasil seperti ini (terpotong):

SScreenshot dari output skrip

Solusi ini mirip dengan salah satu jawaban di atas karena menggunakan Groovy, tetapi di sini kita menggunakan konsol skrip. Konsol script sangat membantu saat menggunakan Jenkins.

Memperbarui

Jika Anda lebih suka daftar yang diurutkan, Anda dapat memanggil sortmetode ini :

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

Sesuaikan Penutupan dengan keinginan Anda (mis. Di sini disortir oleh shortName, pada contoh disortir oleh DisplayName)

Behe
sumber
2
Dari semua jawaban, ini adalah yang paling berguna untuk mengajukan laporan bug plugin; itu dapat dilakukan dengan menggunakan UI web standar dan memberikan hasilnya dalam format yang dapat dengan mudah ditempelkan ke bidang "Lingkungan".
Aaron D. Marasco
8
Jawaban yang bagus untuk membuat plugins.txt dengan cepat untuk buruh pelabuhan Jenkins!
Erik Englund
1
Mungkin bermanfaat untuk menambahkan penyortiran agar daftar plugin konsisten: Jenkins.instance.pluginManager.plugins.sort({it.getDisplayName()}).each{ plugin -> println ("${plugin.getDisplayName()} (${plugin.getShortName()}): ${plugin.getVersion()}") }
wheleph
1
Ini adalah jawaban yang kami beralih ke saran XPath saya di atas, dibungkus dengan permintaan ikal dan beberapa pemangkasan dibangun dari plugin sumber kami menggunakan pendekatan ini untuk menghasilkan plugins.txt untuk gambar buruh pelabuhan kami seperti yang disebutkan oleh @ErikEnglund di atas 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
Penyortiran tidak berfungsi, ini adalah peta yang tidak dapat dimodifikasi hari ini. Gunakan:jenkins.model.Jenkins.instance.getPluginManager().getPlugins().stream().sorted().each { println "${it.getShortName()} | ${it.getVersion()} | ${it.getDisplayName()}" }
Ed Randall
96

Hari ini saya menggunakan pendekatan yang sama dengan jawaban yang dijelaskan oleh @Behe di bawah ini alih-alih https://stackoverflow.com/a/35292719/1597808


Anda dapat menggunakan API dalam kombinasi dengan argumen depth, XPath, dan wrapper.

Berikut ini akan menanyakan API dari pluginManager ke daftar semua plugin yang diinstal, tetapi hanya untuk mengembalikan atribut shortName dan versi mereka. Tentu saja Anda dapat mengambil bidang tambahan dengan menambahkan '|' ke akhir parameter XPath dan menentukan pola untuk mengidentifikasi node.

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

Argumen wrapper diperlukan dalam kasus ini, karena ini mengembalikan lebih dari satu simpul sebagai bagian dari hasil, baik dalam hal itu mencocokkan beberapa bidang dengan XPath dan beberapa plugin plugin.

Mungkin bermanfaat untuk menggunakan URL berikut di browser untuk melihat informasi apa pada plugin yang tersedia dan kemudian memutuskan apa yang ingin Anda batasi menggunakan XPath:

http://<jenkins>/pluginManager/api/xml?depth=1
dbailey
sumber
Hai, Apakah Anda tahu cara mendapatkan daftar plugin yang sebenarnya digunakan oleh pekerjaan Jenkins dan sistem Jenkins daripada daftar lengkap plugin yang diinstal? Terima kasih
user1164061
3
Bekerja dengan baik untuk saya di Mac OS X. Saya ingin mengubah output ke daftar teks biasa, jadi gunakan beberapa regex Perl untuk menghapus tag: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
Alternatif dalam format JSON:curl -s -k "http://jenkins/pluginManager/api/json?depth=1" | jq '.plugins[]|{shortName, version,longName}' -c
MarkHu
1
Saya percaya bahwa ini memerlukan hak administrasi, tetapi saya tidak yakin.
mkobit
2
Dikonfirmasi bahwa ini memerlukan hak admin per penasihat keamanan 2016-05-11 .
mkobit
29

Jenkins 1,588 (2 nd November 2014) & 1,647 (4 th Februari 2016)

  • Jenkins> Kelola Jenkins

    masukkan deskripsi gambar di sini

  • Sistem Informasi

    masukkan deskripsi gambar di sini

  • Plugin

    masukkan deskripsi gambar di sini

ROMANIA_engineer
sumber
1
Ini sangat sederhana, dan saya bisa mendapatkan daftar dari server DEV dan PRD, tempel ke Excel dan bandingkan versinya secara berdampingan.
Jirong Hu
24

CLI Jenkins mendukung daftar semua plugin yang diinstal:

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

wmli
sumber
Ini tidak akan mencantumkan status plugin.
akhan
1
Dan list-pluginsperintah CLI tidak mengharuskan pengguna untuk memiliki izin Keseluruhan / RunScripts seperti yang groovydilakukan perintah.
José Andias
Tampaknya ini tidak berfungsi dengan token API jika pengguna / token bukan "Keseluruhan / Administrator".
cgseller
21

Gunakan Jenkins CLI seperti ini:

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

=dalam panggilan berarti 'membaca dari input standar' . pluginEnumerator.groovy berisi kode Groovy berikut:

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

Jika Anda ingin bermain dengan kode tersebut, inilah dokumentasi Jenkins Java API .

malenkiy_scot
sumber
@ user1284795, apakah ini membantu?
malenkiy_scot
1
Hai, apakah Anda tahu cara menggunakan plugin dengan sistem Jenkins dan pekerjaan Jenkins alih-alih memasang semua plugin? Saya ingin ini membantu saya mencopot pemasangan semua plugin yang tidak digunakan. Bantuan apa pun dihargai. Terima kasih!
user1164061
Ini harus menjadi jawaban yang diterima. @ user1164061, saya tidak berpikir ada perbedaan antara plugin yang terlihat dari pekerjaan vs ke server. Ada isActive()api yang bisa Anda gunakan di skrip groovy dalam jawaban ini untuk mendapatkan status plugin. Lihat javadoc.jenkins-ci.org/hudson/PluginWrapper.html#isActive () .
akhan
20

Jika Anda bekerja di lingkungan buruh pelabuhan dan ingin menampilkan daftar plugin dalam format plugins.txt untuk meneruskannya ke install_scripts.sh gunakan skrip ini di http://{jenkins}/scriptkonsol:

  1. Versi ini berguna untuk mendapatkan versi paket tertentu
Jenkins.instance.pluginManager.plugins.each{
  plugin -> 
    println ("${plugin.getShortName()}:${plugin.getVersion()}")
}
  1. Jika Anda hanya menginginkan plugin dengan versi terbaru, Anda dapat menggunakan ini (terima kasih @KymikoLoco untuk tipnya)
Jenkins.instance.pluginManager.plugins.each{
  plugin -> 
    println ("${plugin.getShortName()}:latest")
}
Alessandro Lucarini
sumber
1
Jika Anda ingin mendapatkan versi terbaru dari semua plugin, Anda dapat memperpanjang ini hanya dengan mendapatkan nama pendek dan menambahkannya :latestsampai akhir:println ("${plugin.getShortName()}:latest")
KymikoLoco
17

Jawaban di sini agak tidak lengkap. Dan saya harus mengumpulkan informasi dari sumber lain untuk benar-benar mendapatkan daftar plugin.

1. Dapatkan Jenkins CLI

CLI Jenkins akan memungkinkan kita berinteraksi dengan server Jenkins dari baris perintah. Kita bisa mendapatkannya dengan panggilan ikal sederhana.

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

2. Buat skrip Groovy untuk penguraian (terima kasih kepada malenkiy_scot)

Simpan yang berikut ini sebagai plugins.groovy.

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

3. Panggil API Jenkins untuk hasil plugin

Panggil server Jenkins (di localhost:8080sini) dengan nama pengguna dan kata sandi masuk Anda saat merujuk skrip Groovy:

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

Output ke plugins.txt terlihat seperti ini:

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
sumber
Perintah di atas harus dijalankan pada workstation Anda dan bukan pada pekerjaan Jenkins
user3740244
Perintah tersebut tampaknya menghasilkan "ERROR: anonim tidak memiliki izin Keseluruhan / Baca" dalam versi terbaru .. alih-alih melewati auth sebelum bekerja untuk saya java -jar jenkins-cli.jar -s localhost: 8080 -auth "admin: < kata sandi> "groovy = <plugins.groovy
prasanna
12

Jawaban Behe dengan plugin sortir tidak berfungsi pada mesin Jenkins saya. Saya menerima kesalahan java.lang.UnsupportedOperationExceptionkarena mencoba menyortir koleksi yang tidak dapat diubah yaitu Jenkins.instance.pluginManager.plugins. Perbaikan sederhana untuk kode:

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

Gunakan http://<jenkins-url>/scriptURL untuk menjalankan kode.

Alesso
sumber
1
Saya mengalami ini juga menggunakan versi yang berbeda dari Jenkins dari sistem pertama saya mengujinya. Untuk v2.81 jawaban atas bekerja, tetapi untuk LTS v2.83.x dan versi yang lebih baru itu memberikan kesalahan yang Anda sebutkan saat kode Anda masih berfungsi.
dragon788
1
Satu hal yang saya perhatikan adalah Anda mengurutkan berdasarkan pada displayNamesaat mencetak shortName, ini sangat membingungkan karena beberapa plugin tidak secara alfabet sama untuk keduanya, dan itu menghasilkan daftar yang tidak muncul diurutkan. Mengubah it.displayNameuntuk it.shortNamemenyelesaikan ini dengan baik.
dragon788
8

Jika Anda seorang administrator Jenkins, Anda dapat menggunakan halaman informasi sistem Jenkins:

http://<jenkinsurl>/systemInfo
Andy G
sumber
/systeminfotidak berfungsi (HTTP 404) di Jenkins 1.594
G. Lombard
7
Coba http://localhost:8080/systemInfo- beberapa server peka huruf besar-kecil. Perhatikan juga bahwa ini mengharuskan pengguna yang saat ini masuk untuk memiliki izin Keseluruhan / Administer.
MarkHu
8

Dengan curldan jq:

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

Perintah ini memberikan output dalam format yang digunakan oleh plugins.txtfile Jenkins khusus yang memungkinkan Anda untuk pra-instal dependensi (misalnya dalam gambar buruh pelabuhan):

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

Contoh a plugins.txt: https://github.com/hoto/jenkinsfile-examples/blob/master/source/jenkins/usr/share/jenkins/plugins.txt

Andrzej Rehmann
sumber
5

Dari beranda Jenkins:

  1. Klik Kelola Jenkins .
  2. Klik Kelola Plugin .
  3. Klik pada tab Installed .

Atau

  1. Buka langsung URL Jenkins: {URL dasar Jenkins Anda} / pluginManager / diinstal
James Lawruk
sumber
1
Halaman "plugin yang diinstal" tidak mencerminkan status plugin yang sebenarnya. Misalnya Anda mungkin mengaktifkan kembali plugin, dan melihat plugin dicentang, sementara plugin masih dinonaktifkan sampai Jenkins-Restart. Oleh karena itu, satu-satunya solusi 100% adalah http: // <jenkinsurl> / systeminfo dan jawaban permintaan API, imho.
t0r0X
4

Berbagi opsi lain yang ditemukan di sini dengan kredensial

JENKINS_HOST=username:[email protected]: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/ /:/'
Wisnu
sumber
seperti di atas, tetapi tanpa versi, dan diurutkan. 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

Saya menginginkan solusi yang dapat berjalan pada master tanpa persyaratan auth dan tidak melihatnya di sini. Saya membuat skrip bash cepat yang akan mencabut semua versi dari direktori plugins.

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
Kevin Brotcke
sumber
grep Plugin-Version */META-INF/MANIFEST.MF | sed -e 's!/META-INF/MANIFEST.MF:Plugin-Version: !:!g' > ../plugins2.txt
james dupont
2

Opsi lain untuk pengguna 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)
Tidhar Klein Orbach
sumber
2

Saya pikir ini bukan jawaban yang cukup baik ... banyak melibatkan beberapa langkah ekstra di bawah tenda. Begini cara saya melakukannya.

sudo apt-get install jq

... karena output JSON perlu dikonsumsi setelah Anda memanggil 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
sumber
1

Anda juga dapat tertarik dengan pembaruan apa yang tersedia untuk plugin. Untuk itu, Anda harus menggabungkan data tentang plugin yang diinstal dengan informasi tentang pembaruan yang tersedia di sini https://updates.jenkins.io/current/update-center.json .

Untuk mem-parsing file yang diunduh sebagai JSON Anda harus membaca online baris kedua (yang sangat besar).

Wojciech Sciesinski
sumber
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}")
    }
Brian
sumber
0

Ada tabel yang mencantumkan semua plugin yang diinstal dan apakah mereka diaktifkan di http: // jenkins / systemInfo

tsuna
sumber
0

Jika Jenkins dijalankan dalam wadah Docker Jenkins Anda dapat menggunakan baris perintah ini di 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
sumber
0

Untuk Jenkins versi 2.125 berikut ini berfungsi.

CATATAN: Ganti bagian yang mengatakan USERNAME dan APIKEY dengan UserName dan APIKey yang valid untuk pengguna yang sesuai. Kunci API untuk pengguna tersedia melalui Kelola PenggunaPilih Pengguna → opsi Kunci API .

Anda mungkin harus memperpanjang waktu tidur jika instalasi Jenkins Anda membutuhkan waktu lebih lama untuk memulai.

Inisiasi yum update -yakan memperbarui versi juga jika Anda menginstal Jenkins menggunakan yum juga.

#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
sumber
0

Ada banyak cara untuk mengambil informasi ini tetapi saya menulis dua cara seperti di bawah ini: -

1. Dapatkan jenkins cli.

CLen jenkins akan memungkinkan kita untuk berinteraksi dengan server jenkins kita dari baris perintah. Kita bisa mendapatkannya dengan panggilan ikal sederhana.

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

2. Buat skrip asyik. ATAU dari konsol skrip jenkins

Kita perlu membuat skrip groovy untuk mengurai informasi yang kita terima dari API jenkins. Ini akan menampilkan setiap plugin dengan versinya. Simpan yang berikut ini sebagai plugins.groovy.

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

pengguna128364
sumber