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?

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)


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

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


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


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 .


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

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

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.


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

/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


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

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

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

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)

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


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

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`

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

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.