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

Posted

技术标签:

【中文标题】如何获取包含名称和版本对的已安装 Jenkins 插件列表【英文标题】:How to get a list of installed Jenkins plugins with name and version pair 【发布时间】:2012-04-06 14:25:00 【问题描述】:

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

我搜索了 Jenkins Remote Access API 文档,但没有找到。我应该使用 Jenkins 的 CLI 吗?有文档或例子吗?

【问题讨论】:

【参考方案1】:

您可以通过访问http://<jenkins-url>/script 访问Jenkins Script Console 来检索信息。 (假设您已登录并拥有所需的权限)。

输入以下 Groovy 脚本 来遍历已安装的插件并打印出相关信息:

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

它将像这样打印结果列表(剪辑):

这个解决方案类似于one of the answers above,因为它使用了 Groovy,但这里我们使用的是脚本控制台。使用 Jenkins 时,脚本控制台非常有用。

更新

如果您更喜欢排序列表,可以调用此sort method:

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

根据自己的喜好调整 Closure(例如,这里按 shortName 排序,在示例中按 DisplayName 排序)

【讨论】:

在所有答案中,这对于提交插件错误报告最有用;它可以使用标准 Web UI 完成,并以可以轻松粘贴到“环境”字段的格式给出结果。 为 docker Jenkins 快速创建 plugins.txt 的绝佳答案! 添加排序以使插件列表保持一致可能很有用:Jenkins.instance.pluginManager.plugins.sort(it.getDisplayName()).each plugin -> println ("$plugin.getDisplayName() ($plugin.getShortName()): $plugin.getVersion()") 这是我们切换到本地的答案,而不是我上面的 XPath 建议,包含 curl 请求和一些从源插件构建的修剪,我们使用这种方法为我们的生成 plugins.txt @ErikEnglund 上面提到的 docker 镜像 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()" 【参考方案2】:

这些天我使用与下面@Behe 描述的答案相同的方法,更新链接:https://***.com/a/35292719/3423146(旧链接:https://***.com/a/35292719/1597808)


您可以将 API 与深度、XPath 和包装器参数结合使用。

下面将查询 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 系统实际使用的插件列表,而不是已安装插件的完整列表吗?谢谢 在 Mac OS X 上运行良好。我想将输出转换为纯文本列表,因此使用了一些 Perl 正则表达式来去除标签:curl 'http://192.168.197.133:8080/pluginManager/api/xml?depth=1&amp;xpath=/*/*/shortName|/*/*/version&amp;wrapper=plugins' | perl -pe 's/.*?&lt;shortName&gt;([\w-]+).*?&lt;version&gt;([^&lt;]+)()(&lt;\/\w+&gt;)+/\1 \2\n/g' JSON 格式的替代方案:curl -s -k "http://jenkins/pluginManager/api/json?depth=1" | jq '.plugins[]|shortName, version,longName' -c 我认为这需要管理员权限,但我不确定。 确认这需要the 2016-05-11 security advisory 的管理员权限。【参考方案3】:

Jenkins 1.588(2014 年 11 月 2nd 日)和 1.647(2016 年 2 月 4th )

Jenkins > 管理 Jenkins

系统信息

插件

【讨论】:

这很简单,我可以从 DEV 和 PRD 服务器获取列表,将它们粘贴到 Excel 中并并排比较它们的版本。【参考方案4】:

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

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

【讨论】:

这不会列出插件的状态。 并且list-plugins CLI 命令不像groovy 命令那样要求用户拥有Overall/RunScripts 权限 如果用户/令牌不是“总体/管理员”,这似乎不适用于 API 令牌。【参考方案5】:

像这样使用 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()"

如果你想玩代码,here's Jenkins Java API documentation。

【讨论】:

@user1284795,这有帮助吗? 您好,您知道如何获取Jenkins系统和Jenkins作业使用的插件,而不是安装所有插件吗?我希望这可以帮助我卸载所有未使用的插件。任何帮助表示赞赏。谢谢! 这应该是公认的答案。 @ user1164061,我认为作业可见的插件与服务器可见的插件之间没有任何区别。有一个isActive() api,您可以在此答案的 groovy 脚本中使用它来获取插件的状态。见javadoc.jenkins-ci.org/hudson/PluginWrapper.html#isActive()。 这个答案让我投票成为接受的答案。【参考方案6】:

如果您在 docker 环境中工作并希望以 plugins.txt 格式输出插件列表以便将其传递给 install_scripts.sh,请在 http://jenkins/script 控制台中使用这些脚本:

    此版本对于获取特定包版本很有用
Jenkins.instance.pluginManager.plugins.each
  plugin -> 
    println ("$plugin.getShortName():$plugin.getVersion()")

    如果你只想要最新版本的插件,你可以使用这个(感谢@KymikoLoco 的提示)
Jenkins.instance.pluginManager.plugins.each
  plugin -> 
    println ("$plugin.getShortName():latest")

【讨论】:

如果你想获取所有插件的最新版本,你可以扩展这个只获取短名称,并在末尾添加:latestprintln ("$plugin.getShortName():latest") 太棒了!【参考方案7】:

这里的答案有些不完整。而且我必须从其他来源编译信息才能真正获得插件列表。

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

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

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 作业上运行 该命令似乎在最新版本中导致“错误:匿名缺少整体/读取权限”。而不是在为我工作之前通过身份验证 java -jar jenkins-cli.jar -s @ 987654321@ -auth "admin:" groovy = 【参考方案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.txt 的示例:https://github.com/hoto/jenkinsfile-examples/blob/master/source/jenkins/usr/share/jenkins/plugins.txt

【讨论】:

【参考方案9】:

Behe's answer 带有排序插件在我的 Jenkins 机器上不起作用。由于尝试对不可变集合(即Jenkins.instance.pluginManager.plugins)进行排序,我收到了错误java.lang.UnsupportedOperationException。代码的简单修复:

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

使用http://&lt;jenkins-url&gt;/script URL 运行代码。

【讨论】:

我也遇到了这个问题,使用的 Jenkins 版本与我测试的第一个系统不同。对于 v2.81,最佳答案有效,但对于 LTS v2.83.x 和任何较新版本,它给出了您提到的错误,而您的代码仍然有效。 我刚刚注意到的一件事是您在打印出displayName 时基于displayName 进行排序,这非常令人困惑,因为某些插件的字母顺序对于两者而言并不相同,并且结果在未排序的列表中。将it.displayName 更改为it.shortName 可以很好地解决这个问题。【参考方案10】:

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

http://<jenkinsurl>/systemInfo

【讨论】:

/systeminfo 在 Jenkins 1.594 上不起作用(HTTP 404) 试试http://localhost:8080/systemInfo——有些服务器区分大小写。另请注意,它要求当前登录的用户具有总体/管理权限。【参考方案11】:

使用凭据共享找到的另一个选项 here

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&amp;xpath=/*/*/shortName|/*/*/version&amp;wrapper=plugins" | perl -pe 's/.*?&lt;shortName&gt;([\w-]+).*?&lt;version&gt;([^&lt;]+)()(&lt;\/\w+&gt;)+/\1 \n/g' | sort【参考方案12】:

来自 Jenkins 主页:

    点击管理 Jenkins。 点击管理插件。 点击已安装标签。

或者

    直接转到 Jenkins URL:Your Jenkins base URL/pluginManager/installed

【讨论】:

“已安装插件”页面不一定反映真实的插件状态。例如。您可能会重新启用一个插件,并查看该插件是否被选中,而该插件在 Jenkins-Restart 之前仍处于禁用状态。因此,唯一 100% 的解决方案是 http:///systeminfo 和 API 查询答案,恕我直言。【参考方案13】:

我想要一个可以在没有任何身份验证要求的情况下在 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' &gt; ../plugins2.txt【参考方案14】:

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)

【讨论】:

【参考方案15】:

我认为这些答案还不够好……很多都涉及到一些额外的幕后步骤。以下是我的做法。

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

【讨论】:

【参考方案16】:

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

1.获取 jenkins cli。

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

curl 'localhost:8080/jnlpJars/jenkins-cli.jar' &gt; jenkins-cli.jar

2。创建一个 groovy 脚本。或者来自詹金斯脚本控制台

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

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

【讨论】:

【参考方案17】:

您也可以对插件可用的更新感兴趣。为此,您必须将有关已安装插件的数据与有关可用更新的信息合并在此处 https://updates.jenkins.io/current/update-center.json 。

要将下载的文件解析为 JSON,您必须在线阅读第二行(内容很大)。

【讨论】:

【参考方案18】:
# 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.sortit
    i = 0
    for (String item : list) 
      i++
      println(" $i $item")
    

【讨论】:

【参考方案19】:

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

【讨论】:

【参考方案20】:

对于 Jenkins 版本 2.125,以下工作有效。

注意:用对应用户的有效用户名和 APIKey 替换说 USERNAME 和 APIKEY 的部分。 用户的 API 密钥可通过以下方式获得 管理用户选择用户API Key 选项。

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

如果您也使用 yum 安装了 Jenkins,启动 yum update -y 也会升级版本。

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

【讨论】:

【参考方案21】:

在 http://jenkins/systemInfo 有一个表格列出了所有已安装的插件以及它们是否启用

但是,您需要管理权限。

【讨论】:

以上是关于如何获取包含名称和版本对的已安装 Jenkins 插件列表的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins安装环境

Jenkins安装环境

Jenkins安装环境

jenkins插件之如何优雅的生成版本号

Jenkins安装

Google Play 控制台上的已安装受众和用户获取有啥区别?