ฉันจะรับรายการปลั๊กอิน Jenkins ที่ติดตั้งไว้ได้อย่างไร
ฉันค้นหาเอกสาร API การเข้าถึงระยะไกลของ Jenkins แต่ไม่พบ ฉันควรใช้ CLI ของเจนกินส์หรือไม่ มีเอกสารหรือตัวอย่างหรือไม่
ฉันจะรับรายการปลั๊กอิน Jenkins ที่ติดตั้งไว้ได้อย่างไร
ฉันค้นหาเอกสาร API การเข้าถึงระยะไกลของ Jenkins แต่ไม่พบ ฉันควรใช้ CLI ของเจนกินส์หรือไม่ มีเอกสารหรือตัวอย่างหรือไม่
คำตอบ:
คุณสามารถดึงข้อมูลโดยใช้สคริปต์คอนโซลเจนกินส์http://<jenkins-url>/script
ซึ่งสามารถเข้าถึงได้โดยการเยี่ยมชม (ระบุว่าคุณเข้าสู่ระบบและมีสิทธิ์ที่จำเป็น)
ป้อนสคริปต์ Groovyต่อไปนี้เพื่อวนซ้ำปลั๊กอินที่ติดตั้งและพิมพ์ข้อมูลที่เกี่ยวข้อง:
Jenkins.instance.pluginManager.plugins.each{
plugin ->
println ("${plugin.getDisplayName()} (${plugin.getShortName()}): ${plugin.getVersion()}")
}
มันจะพิมพ์รายการผลลัพธ์เช่นนี้ (ตัด):
โซลูชันนี้คล้ายกับหนึ่งในคำตอบข้างต้นซึ่งใช้ Groovy แต่ที่นี่เราใช้คอนโซลสคริปต์แทน คอนโซลสคริปต์มีประโยชน์อย่างยิ่งเมื่อใช้ Jenkins
ปรับปรุง
หากคุณต้องการรายการที่เรียงลำดับคุณสามารถเรียกsort
ใช้วิธีนี้ได้:
def pluginList = new ArrayList(Jenkins.instance.pluginManager.plugins)
pluginList.sort { it.getShortName() }.each{
plugin ->
println ("${plugin.getDisplayName()} (${plugin.getShortName()}): ${plugin.getVersion()}")
}
ปรับการปิดเพื่อความชอบของคุณ (เช่นที่นี่จะถูกจัดเรียงโดย shortName ในตัวอย่างที่จัดเรียงตาม DisplayName)
Jenkins.instance.pluginManager.plugins.sort({it.getDisplayName()}).each{ plugin -> println ("${plugin.getDisplayName()} (${plugin.getShortName()}): ${plugin.getVersion()}") }
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
jenkins.model.Jenkins.instance.getPluginManager().getPlugins().stream().sorted().each { println "${it.getShortName()} | ${it.getVersion()} | ${it.getDisplayName()}" }
วันนี้ฉันใช้วิธีการเดียวกันกับคำตอบที่อธิบายโดย @Behe ด้านล่างแทนhttps://stackoverflow.com/a/35292719/1597808
คุณสามารถใช้ API ร่วมกับอาร์กิวเมนต์ depth, XPath และ wrapper
ต่อไปนี้จะสืบค้น API ของ pluginManager เพื่อแสดงรายการปลั๊กอินทั้งหมดที่ติดตั้ง แต่จะส่งคืนแอตทริบิวต์ shortName และเวอร์ชันของพวกเขาเท่านั้น คุณสามารถเรียกดูฟิลด์เพิ่มเติมได้โดยเพิ่ม '|' ไปที่จุดสิ้นสุดของพารามิเตอร์ XPath และระบุรูปแบบเพื่อระบุโหนด
wget http://<jenkins>/pluginManager/api/xml?depth=1&xpath=/*/*/shortName|/*/*/version&wrapper=plugins
ต้องการอาร์กิวเมนต์ wrapper ในกรณีนี้เนื่องจากมันส่งคืนมากกว่าหนึ่งโหนดเป็นส่วนหนึ่งของผลลัพธ์ซึ่งทั้งคู่กำลังจับคู่หลายฟิลด์กับ XPath และโหนดปลั๊กอินหลายโหนด
อาจเป็นประโยชน์ที่จะใช้ URL ต่อไปนี้ในเบราว์เซอร์เพื่อดูว่ามีข้อมูลใดเกี่ยวกับปลั๊กอินและจากนั้นตัดสินใจว่าคุณต้องการ จำกัด การใช้ XPath อย่างไร:
http://<jenkins>/pluginManager/api/xml?depth=1
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'
curl -s -k "http://jenkins/pluginManager/api/json?depth=1" | jq '.plugins[]|{shortName, version,longName}' -c
เจนกินส์ 1.588 (2 ครั้งของเดือนพฤศจิกายน 2014) และ1.647 (4 วันของเดือนกุมภาพันธ์ 2016)
Jenkins CLI รองรับรายการปลั๊กอินที่ติดตั้งทั้งหมด:
java -jar jenkins-cli.jar -s http://localhost:8080/ list-plugins
list-plugins
คำสั่ง CLI ไม่ต้องการให้ผู้ใช้มีสิทธิ์โดยรวม / RunScriptsเช่นเดียวกับgroovy
คำสั่ง
ใช้ 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 ที่นี่
isActive()
API ที่คุณสามารถใช้ในสคริปต์ groovy ในคำตอบนี้เพื่อรับสถานะปลั๊กอิน ดูjavadoc.jenkins-ci.org/hudson/PluginWrapper.html#isActive ()
หากคุณทำงานในสภาพแวดล้อมของนักเทียบท่าและต้องการส่งออกรายการปลั๊กอินในรูปแบบ plugins.txt เพื่อส่งต่อไปยัง install_scripts.sh ให้ใช้สคริปต์เหล่านี้ในhttp://{jenkins}/script
คอนโซล:
Jenkins.instance.pluginManager.plugins.each{
plugin ->
println ("${plugin.getShortName()}:${plugin.getVersion()}")
}
Jenkins.instance.pluginManager.plugins.each{
plugin ->
println ("${plugin.getShortName()}:latest")
}
:latest
ไปยังจุดสิ้นสุด:println ("${plugin.getShortName()}:latest")
คำตอบที่นี่ค่อนข้างไม่สมบูรณ์ และฉันต้องรวบรวมข้อมูลจากแหล่งอื่น ๆ เพื่อรับรายการปลั๊กอินจริง
Jenkins CLI จะช่วยให้เราสามารถโต้ตอบกับเซิร์ฟเวอร์ Jenkins ของเราจากบรรทัดคำสั่ง เราสามารถรับมันด้วยการเรียกขดง่าย ๆ
curl 'localhost:8080/jnlpJars/jenkins-cli.jar' > jenkins-cli.jar
plugins.groovy
บันทึกต่อไปนี้เป็น
def plugins = jenkins.model.Jenkins.instance.getPluginManager().getPlugins()
plugins.each {println "${it.getShortName()}: ${it.getVersion()}"}
โทรหาเซิร์ฟเวอร์ 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
คำตอบของ Behe ที่มีการเรียงลำดับปลั๊กอินไม่สามารถใช้กับเครื่อง Jenkins ของฉันได้ ผมได้รับข้อผิดพลาดjava.lang.UnsupportedOperationException
เนื่องจากการพยายามที่จะจัดเรียงคอลเลกชันมี Jenkins.instance.pluginManager.plugins
IE แก้ไขง่าย ๆ สำหรับรหัส:
List<String> jenkinsPlugins = new ArrayList<String>(Jenkins.instance.pluginManager.plugins);
jenkinsPlugins.sort { it.displayName }
.each { plugin ->
println ("${plugin.shortName}:${plugin.version}")
}
ใช้http://<jenkins-url>/script
URL เพื่อเรียกใช้รหัส
displayName
ขณะที่พิมพ์ออกมาสิ่งshortName
นี้ทำให้เกิดความสับสนอย่างมากเนื่องจากปลั๊กอินบางตัวไม่เหมือนกันทั้งตัวอักษรและผลลัพธ์ในรายการที่ไม่เรียงลำดับ การเปลี่ยนit.displayName
มาit.shortName
แก้ปัญหานี้เป็นอย่างดี
หากคุณเป็นผู้ดูแลระบบเจนกินส์คุณสามารถใช้หน้าข้อมูลระบบเจนกินส์:
http://<jenkinsurl>/systemInfo
/systeminfo
ไม่ทำงาน (HTTP 404) บน Jenkins 1.594
http://localhost:8080/systemInfo
เซิร์ฟเวอร์บางตัวเป็นกรณี ๆ ไป โปรดทราบว่ามันต้องการให้ผู้ใช้ที่เข้าสู่ระบบในปัจจุบันมีสิทธิ์โดยรวม / การจัดการ
ด้วยcurl
และjq
:
curl -s <jenkins_url>/pluginManager/api/json?depth=1 \
| jq -r '.plugins[] | "\(.shortName):\(.version)"' \
| sort
คำสั่งนี้ให้เอาต์พุตในรูปแบบที่ใช้โดยplugins.txt
ไฟล์Jenkins พิเศษซึ่งช่วยให้คุณสามารถติดตั้งการพึ่งพาล่วงหน้าได้ (เช่นในอิมเมจ docker):
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
จากหน้าแรกของเจนกินส์:
หรือ
แบ่งปันตัวเลือกอื่นที่นี่พร้อมข้อมูลประจำตัว
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
ฉันต้องการทางออกที่สามารถทำงานได้โดยไม่ต้องมีการตรวจสอบสิทธิ์และไม่เห็นที่นี่ ฉันสร้างสคริปต์ทุบตีด่วนที่จะดึงทุกเวอร์ชันออกจากปลั๊กอิน dir
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
ฉันคิดว่าสิ่งเหล่านี้ไม่ใช่คำตอบที่ดีพอ ... หลายคนมีขั้นตอนพิเศษภายใต้ประทุนสองสามอย่าง นี่เป็นวิธีที่ฉันทำ
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
ตัวเลือกอื่นสำหรับผู้ใช้ 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)
# 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}")
}
มีตารางที่แสดงรายการปลั๊กอินทั้งหมดที่ติดตั้งและเปิดใช้งานหรือไม่ที่http: // jenkins / systemInfo
หาก 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`
สำหรับเจนกินส์รุ่น 2.125 การทำงานต่อไปนี้
หมายเหตุ: แทนที่ส่วนที่ระบุว่า USERNAME และ APIKEY ด้วยชื่อผู้ใช้และ 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
##############
มีวิธีมากมายในการดึงข้อมูลนี้ แต่ฉันเขียนสองวิธีดังนี้: -
1. รับ jenkins cli
เจนกินส์ CLI จะช่วยให้เราสามารถโต้ตอบกับเซิร์ฟเวอร์เจนกินส์ของเราจากบรรทัดคำสั่ง เราสามารถรับมันด้วยการเรียกขดง่าย ๆ
curl 'localhost:8080/jnlpJars/jenkins-cli.jar' > jenkins-cli.jar
2. สร้างสคริปต์ groovy หรือจากคอนโซลสคริปต์เจนกินส์
เราจำเป็นต้องสร้างสคริปต์ groovy เพื่อแยกข้อมูลที่เราได้รับจากเจนกินส์ API สิ่งนี้จะแสดงผลแต่ละปลั๊กอินด้วยเวอร์ชัน บันทึกสิ่งต่อไปนี้เป็น plugins.groovy
def plugins = jenkins.model.Jenkins.instance.getPluginManager().getPlugins()
plugins.each {println "${it.getShortName()}: ${it.getVersion()}"}