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

207

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

我在查找Jenkins远程访问API文档时没有找到相关内容。我应该使用Jenkins的CLI吗?是否有相应的文档或示例呢?

23个回答

242
您可以使用Jenkins脚本控制台检索信息,访问http://<jenkins-url>/script即可访问。(前提是您已登录并具备所需权限)。

Screenshot of the Script Console

输入以下Groovy脚本以迭代已安装的插件并打印相关信息:

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

它将会打印出类似这样的结果列表(截取部分):

SScreenshot of script output

这个解决方案与上面的一个答案相似,因为它使用了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排序)

4
在所有的答案中,这个最有用于提交插件错误报告;它可以使用标准的Web用户界面完成,并以格式给出结果,该格式可以轻松地粘贴到“环境”字段中。 - Aaron D. Marasco
9
快速创建Docker Jenkins的插件清单的绝佳答案! - Erik Englund
1
可能添加排序功能会很有用,以使插件列表保持一致:Jenkins.instance.pluginManager.plugins.sort({it.getDisplayName()}).each{ plugin -> println ("${plugin.getDisplayName()} (${plugin.getShortName()}): ${plugin.getVersion()}") } - wheleph
1
这是我们在本地切换到的答案,而不是我之前提出的XPath建议,它包含一个curl请求和一些修剪源插件的步骤。我们使用这种方法生成plugins.txt以用于我们的docker镜像,正如@ErikEnglund所提到的那样。 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
10
排序功能不起作用了,因为现在是一个不可修改的Map。请使用以下代码: println "${it.getShortName()} | ${it.getVersion()} | ${it.getDisplayName()}" }```它将获取插件列表并按字母顺序排序,然后逐个打印每个插件的名称、版本和显示名称。 - Ed Randall
显示剩余3条评论

107

现在我使用与@Behe答案下述相同的方法,更新链接:https://dev59.com/5Wkw5IYBdhLWcg3wi7Jz#35292719 (旧链接:https://dev59.com/5Wkw5IYBdhLWcg3wi7Jz#35292719)


你可以将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

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
11
JSON格式的替代命令:curl -s -k "http://jenkins/pluginManager/api/json?depth=1" | jq '.plugins[]|{shortName, version,longName}' -c - MarkHu
1
不使用 jq 的 JSON 格式替代方案:curl -s "http://<jenkins>/pluginManager/api/json?depth=1&tree=plugins\[shortName,version,longName\]" - Jean Bob
2
我认为这需要管理权限,但我不确定。 - mkobit
2
根据2016-05-11安全公告,确认此操作需要管理员权限。 - mkobit
显示剩余6条评论

39

Jenkins 1.588(2014年11月2日)& 1.647(2016年2月4日)

  • Jenkins > 管理Jenkins

    输入图片说明

  • 系统信息

    输入图片说明

  • 插件

    输入图片说明


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

27

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

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


这不会列出插件的状态。 - akhan
2
list-plugins CLI 命令不需要用户具备 _Overall/RunScripts 权限_,就像 groovy 命令一样。 - José Andias
如果用户/令牌不是“Overall/Administrator”,则似乎无法使用API令牌。 - cgseller
@JoséAndias:是的,但总体/管理似乎是必需的,对吧? - serv-inc

27

如果您正在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")
}

2
如果您想获取所有插件的最新版本,可以将其扩展为仅获取短名称并在末尾添加“:latest”: println("${plugin.getShortName()}:latest") - KymikoLoco

25

使用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
这应该是被接受的答案。@user1164061,我认为作业可见的插件和服务器可见的插件之间没有任何区别。在这个答案的Groovy脚本中有一个isActive() API,您可以使用它来获取插件的状态。请参阅http://javadoc.jenkins-ci.org/hudson/PluginWrapper.html#isActive()。 - akhan
这个答案得到了我的投票,成为被接受的答案。 - Chris F

20

这里的回答有些不完整。我不得不从其他来源收集信息来获取插件列表。

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以获取插件结果

使用你的登录用户名和密码来调用Jenkins服务器(这里是localhost:8080),并引用Groovy脚本:

java -jar jenkins-cli.jar -s http://localhost:8080 groovy --username "admin" --password "admin" = < plugins.groovy > 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 作业上运行。 - psicopante
该命令在最新版本中似乎会出现“ERROR:anonymous缺少Overall/Read权限”的问题,而之前在进行身份验证后可以正常工作。java -jar jenkins-cli.jar -s http://localhost:8080 -auth“admin:<password>”groovy = <plugins.groovy - prasanna

16

使用curljq

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

这个命令会以特殊的 Jenkins plugins.txt 文件格式输出结果,使您能够预安装依赖项(例如在docker镜像中):

这个命令以特定的 Jenkins plugins.txt 文件格式输出结果,可帮助您预先安装依赖项(例如在 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


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>/script URL来运行代码。


1
我也遇到了同样的问题,使用与我最初测试时不同版本的 Jenkins。对于v2.81,顶部答案有效,但是对于LTS v2.83.x和任何更新版本,它会出现你提到的错误,而你的代码仍然可用。 - dragon788
2
我刚注意到的一件事是你在基于 displayName 进行排序,而在打印 shortName 时,这非常令人困惑,因为有些插件在两者之间的字母顺序不同,导致列表看起来并没有排序。将 it.displayName 更改为 it.shortName 可以很好地解决这个问题。 - dragon788

10

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

http://<jenkinsurl>/systemInfo

在 Jenkins 1.594 上,/systeminfo 不起作用(HTTP 404)。 - G. Lombard
7
尝试访问 http://localhost:8080/systemInfo -- 一些服务器区分大小写。请注意,此操作需要当前登录的用户具有“Overall/Administer”权限。 - MarkHu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接