如何获取具有名称和版本对的已安装Jenkins插件的列表


159

如何获取已安装的Jenkins插件的列表?

我搜索了Jenkins远程访问API文档,但没有找到。我应该使用Jenkins的CLI吗?有文件或范例吗?

Answers:


160

您可以使用Jenkins脚本控制台检索信息,可以通过访问进行访问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()}")
}

根据您的喜好调整Closure(例如,此处按shortName排序,在示例中按DisplayName排序)


2
在所有答案中,这对于提交插件错误报告最有用。可以使用标准的Web UI进行操作,并以易于粘贴到“环境”字段中的格式给出结果。
亚伦·D·马拉斯科

8
快速为Docker Jenkins创建plugins.txt的好答案!
Erik Englund

1
添加排序以使插件列表一致可能会很有用: Jenkins.instance.pluginManager.plugins.sort({it.getDisplayName()}).each{ plugin -> println ("${plugin.getDisplayName()} (${plugin.getShortName()}): ${plugin.getVersion()}") }
wheleph

1
这是我们已经切换到本地而不是上面的XPath建议的答案,其中包含curl请求和一些从源插件构建的修剪,我们使用这种方法为我们的docker镜像生成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
排序不起作用,这些天来是不可修改的Map。使用: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与depth,XPath和wrapper参数结合使用。

以下内容将查询pluginManager的API,以列出所有已安装的插件,但仅返回其shortName和version属性。您当然可以通过添加“ |”来检索其他字段 到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

嗨,您知道如何获取Jenkins作业和Jenkins系统实际使用的插件列表,而不是已安装插件的完整列表吗?谢谢
user1164061 2014年

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 2014年

8
JSON格式的替代格式:curl -s -k "http://jenkins/pluginManager/api/json?depth=1" | jq '.plugins[]|{shortName, version,longName}' -c
MarkHu,2016年

1
我认为这需要管理特权,但是我不确定。
mkobit

2
根据2016-05-11安全通报确认这需要管理员特权。
mkobit

29

詹金斯1.588(2 11月,2014)和1.647(4 月的,2016)

  • 詹金斯>管理詹金斯

    在此处输入图片说明

  • 系统信息

    在此处输入图片说明

  • 外挂程式

    在此处输入图片说明


1
这非常简单,我可以从DEV和PRD服务器获取列表,将它们粘贴到Excel中并进行比较。
Jirong Hu

24

Jenkins CLI支持列出所有已安装的插件:

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


这不会列出插件的状态。
akhan 2015年

1
而且,list-pluginsCLI命令不需要用户像命令一样具有“ 总体/运行脚本”权限groovy
何塞·安迪亚斯(JoséAndias)

如果用户/令牌不是“总体/管理员”,则这似乎不适用于API令牌。
csseller

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文档


@ user1284795,这有帮助吗?
malenkiy_scot

1
嗨,您知道如何获取Jenkins系统和Jenkins工作所使用的插件,而不是安装所有插件吗?我想借此帮助我卸载所有未使用的插件。任何帮助表示赞赏。谢谢!
user1164061 2014年

这应该是公认的答案。@ user1164061,我认为作业可见的插件与服务器可见的插件之间没有任何区别。isActive()您可以在此答案的groovy脚本中使用一个api,以获取插件的状态。参见javadoc.jenkins-ci.org/hudson/PluginWrapper.html#isActive()
akhan 2015年

20

如果您在docker环境中工作,并且想要以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.获取Jenkins CLI

Jenkins CLI将允许我们从命令行与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以获得插件结果

localhost:8080引用Groovy脚本时,使用您的登录用户名和密码调用Jenkins服务器(在此处):

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

上面的命令应该在您的工作站上运行,而不是在Jenkins作业上运行
user3740244

在最新版本中,该命令似乎导致“错误:匿名用户缺少总体/读取权限”。.而是在对我有用之前传递auth java -jar jenkins-cli.jar -s localhost:8080 -auth“ admin:<密码>“ groovy = <plugins.groovy
prasanna

12

Behe对排序插件的回答在我的Jenkins机器上不起作用。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 '18

1
我刚刚注意到的一件事是,您displayName在打印时基于进行排序shortName,这非常令人困惑,因为某些插件的字母顺序不同,导致列表未排序。更改it.displayNameit.shortName可以很好地解决此问题。
Dragon788 '18 -10-19

8

如果您是Jenkins管理员,则可以使用Jenkins系统信息页面:

http://<jenkinsurl>/systemInfo

/systeminfo在詹金斯1.594
G. Lombard

7
试试- http://localhost:8080/systemInfo一些服务器区分大小写。还要注意,它要求当前登录的用户具有“总体/管理”权限。
MarkHu

8

curljq

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

此命令以特殊的Jenkins plugins.txt文件使用的格式提供输出,使您可以预安装依赖项(例如,在docker映像中):

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

一个示例plugins.txthttps : //github.com/hoto/jenkinsfile-examples/blob/master/source/jenkins/usr/share/jenkins/plugins.txt


5

在Jenkins主页上:

  1. 单击管理詹金斯
  2. 单击管理插件
  3. 单击已安装选项卡。

要么

  1. 直接转到Jenkins URL:{您的Jenkins基本URL} / pluginManager / installed

1
“已安装的插件”页面不一定反映真实的插件状态。例如,您可以重新启用插件,并查看插件已选中,而在Jenkins-Restart之前,插件仍处于禁用状态。因此,唯一的100%解决方案是http:// <jenkinsurl> / systeminfo和API查询答案,恕我直言。
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

我认为这些答案还不够好……许多涉及一些额外的幕后步骤。这是我的方法。

sudo apt-get install jq

...因为调用API后需要使用JSON输出。

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

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)

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

如果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`

0

对于Jenkins 2.125版,以下工作。

注意:用相应用户的有效UserName和APIKey替换说USERNAME和APIKEY的部分。可通过“ 管理用户” →“ 选择用户” →“ API密钥”选项获得用户的API密钥

如果您的Jenkins安装开始时间较长,则可能需要延长睡眠时间。

yum update -y如果您还使用yum安装了Jenkins,则启动程序还将升级该版本。

#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

有很多方法可以获取此信息,但是我正在编写以下两种方法:-

1.获取詹金斯cli。

jenkins CLI将允许我们从命令行与jenkins服务器进行交互。我们可以通过简单的curl调用获得它。

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

2.创建一个Groovy脚本。或从jenkins脚本控制台

我们需要创建一个Groovy脚本来解析从jenkins API接收到的信息。这将输出每个插件及其版本。将以下内容另存为plugins.groovy。

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.