我想知道,如何使用 Jenkins 远程访问 API 将插件安装到 Jenkins?我找到了一种使用 jenkins CLI 安装的方法。但我需要知道如何使用 API 来做同样的事情。我尝试使用 jenkins-python 库。但我没有找到任何方法在那里安装插件。
6 回答
将以下 xml 数据(使用您的 plugin-id@version)发送(HTTP POST)到 Jenkins 插件管理器。在 gist 上查看我的jenkins 安装插件脚本。
这个 HTTP POST 请求安装jenkins git 插件2.0。
curl -X POST -d '<jenkins><install plugin="git@2.0" /></jenkins>' --header 'Content-Type: text/xml' http://localhost:8080/pluginManager/installNecessaryPlugins
有些插件很难在文件系统上更新,因为其他插件依赖于它(凭证就是一个例子)。对于此类插件,只能使用 Web 界面对其进行更新。
Jenkins 前端在“管理 Jenkins”->“管理插件”下有一个页面。在“高级”选项卡下是“上传插件”的表单。它允许使用 curl 进行 Web 自动化,您可能需要添加身份验证。
curl -i -F file=@pluginfilename.hpi http://jenkinshost/jenkins/pluginManager/uploadPlugin
除了已经提到的方法(我个人使用了@bbaassssiiee 提供的“ curl uploadPlugin ”),您需要考虑如果您使用pluginManager Jenkins 将尝试动态加载您的插件,但如果您需要重新启动Jenkins 以正确初始化插件(这是我的情况),您应该添加:
curl -kX POST https://${JENKINS_URL}/safeRestart
如果您将插件直接复制到jenkins/plugin,则必须重新启动才能加载插件。
正如malenkiy_scot 所建议的,我们可以创建一个工作并使用Jenkins CLI。这是我为自动化安装插件所做的秘密方法。Jenkins 插件可在此处的 Jenkins 镜像中找到:http: //updates.jenkins-ci.org/latest此链接可能未列出任何内容,但如果您知道插件的名称,您可以下载该插件。例如,如果要下载 skype-notifier 插件,可以从http://updates.jenkins-ci.org/latest/skype-notifier.hpi下载,通用 URL 为“ http://updates.jenkins -ci.org/latest/.hpi "
下载该插件后,它应该转到服务器上 Jenkins 主目录中的“插件”目录。对于 linux 机器,它很可能位于“/var/lib/jenkins/plugins”中。简单的例子
wget http://updates.jenkins-ci.org/latest/skype-notifier.hpi
mv skype-notifier.hpi /var/lib/jenkins/plugins
这里有两点需要注意:
- 如果插件有任何依赖项,则默认情况下不会安装这些依赖项。如果您知道需要哪些其他插件,则可以以相同的方式安装它们。这里需要一些手动过程。但是,如果需要相同的插件集,则可以只解决一次依赖关系,并且可以编写脚本来下载并将它们移动到 Jenkins 主页。
- 下载的插件不能马上使用。需要重新加载 Jenkins。
经过大量的血汗和泪水,我建议的解决方案是:
- 使用plugin-installation-manager-tool
(需要 java)或install-plugins.sh(仅需要 bash,但已正式弃用,但仍在 09/2021 工作)下载
hpi
文件(插件和依赖项) 注意:两者也包含在官方 docker 镜像(另见离线安装) - 然后通过安装所有下载的文件
curl -i -F file=@plugin.hpi http://${JENKINS_URL}/pluginManager/uploadPlugin
为什么?
发布到/pluginManager/installNecessaryPlugins
始终安装最新版本(已知错误或功能?)并且似乎只安装请求的插件而没有适当的依赖关系处理。
简单的例子
需要install-plugins.sh及其依赖jenkins-support来自jenkinsci/docker
.
您必须调整install-plugins.sh 第 27 行以指向您的jenkins-support
文件,例如,
. jenkins-support
如果您将所有内容放在一个文件夹中并从那里执行它。
pluginFolder=$(mktemp -d)
# Download plugins
JENKINS_UC=https://updates.jenkins.io REF="${pluginFolder}" \
install-plugins.sh \
docker-workflow:1.26 docker-plugin:1.2.2
# add more plugins in here, pass a bash array or load from file
# (see Real-life example bellow)
# Install all downloaded plugin files via HTTP
for pluginFile in "${pluginFolder}/plugins"/*; do
curl -i -F "file=@${pluginFile}" http://${JENKINS_URL}/pluginManager/uploadPlugin
done
现实生活中的例子
download-plugins.sh
plugins.txt
- 将使用中声明的所有插件加载install-plugins.sh
到作为参数传递的目录中。init-jenkins.sh调用
download-plugins.sh
,然后使用安装插件jenkins-REST-client.sh
我不认为这是可能的。但是,作为一种解决方法,您可以考虑创建一个通过 Jenkins CLI 安装插件的作业;然后,您可以使用适当的参数通过 API 调用该作业。