通过远程 API 同步安装 Jenkins 插件(等到完成)或找出所有插件何时安装
Install Jenkins plugins over remote API synchronously (wait until finished) OR find out when all plugins have been installed
我知道有两种通过远程安装 Jenkins 插件的方法 API,给定一个包含换行符分隔的插件短名称列表的文本文件,例如
# plugins.txt
ansicolor
bitbucket
cobertura
POSTing XML 在远程 API 使用 curl
:
JENKINS_URL="http://my-jenkins:8080/"
JENKINS_CRUMB=$(curl -s "${JENKINS_URL}"'/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)')
while read plugin; do
echo "Installing ${plugin} ..."
curl -X POST --data "<jenkins><install plugin='${plugin}@latest' /></jenkins>" -H "${JENKINS_CRUMB}" -H 'Content-Type: text/xml' "${JENKINS_URL}"/pluginManager/installNecessaryPlugins
done <"${PLUGINS_FILE}"
或者,POST 到远程端点的 Groovy 脚本,它基本上会做同样的事情:
# install_plugins.groovy
import jenkins.model.*
import java.util.logging.Logger
def logger = Logger.getLogger("")
def installed = false
def initialized = false
def plugins = new File('plugins.txt') as String[]
def instance =Jenkins.getInstance()
def pm = instance.getPluginManager()
def uc =instance.getUpdateCenter()
uc.updateAllSites()
plugins.each { logger.info("Checking ${it}")
if (!pm.getPlugin(it)) {
logger.info("Looking UpdateCenter for ${it}")
if (!initialized) {
uc.updateAllSites()
initialized = true
}
def plugin = uc.getPlugin(it)
if (plugin) {
logger.info("Installing ${it}")
plugin.deploy()
installed = true
} } }
if (installed)
{
logger.info("Plugins installed, initializing a restart!")
instance.save()
instance.doSafeRestart()
}
Shell:
export JENKINS_URL="http://my-jenkins:8080/"
export JENKINS_CRUMB=$(curl -s "${JENKINS_URL}"'/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)')
curl -H ${JENKINS_CRUMB} -d "script=$(cat install_plugins.groovy)" "${JENKINS_URL}/scriptText"
然而,这两种方法的共同点是每个安装插件的请求都由 Jenkins 异步处理,因此 returns 立即处理。然后插件将在后台安装。
但是,我想自动触发 Jenkins 重启并通知用户一旦安装了 所有 插件,一切就绪。我目前知道的唯一解决方案是在浏览器中打开插件管理器 UI 并点击 refresh
直到我觉得没有任何改变,然后手动触发重启。
有什么办法吗
- 同步安装插件(一个接一个),等到它及其依赖项完全安装后再继续下一个(我不介意更长的运行时间)
或者,或者,
- 启动异步作业,但定期查询服务器,直到安装完所有插件及其依赖项?
您可以获取此端点:
http://my-jenkins:8080/updateCenter/api/json?tree=jobs[*]
这会给你这样的回应:
{
"_class":"hudson.model.UpdateCenter",
"jobs":[
{
"_class":"hudson.model.UpdateCenter$ConnectionCheckJob",
"errorMessage":null,
"id":3,
"type":"ConnectionCheckJob"
},
{
"_class":"hudson.model.UpdateCenter$InstallationJob",
"errorMessage":null,
"id":1,
"type":"InstallationJob",
"name":"Xamarin Studio Tool Runner Plugin",
"status":{
"_class":"hudson.model.UpdateCenter$DownloadJob$SuccessButRequiresRestart"
},
"plugin":{
}
},
{
"_class":"hudson.model.UpdateCenter$InstallationJob",
"errorMessage":null,
"id":2,
"type":"InstallationJob",
"name":"PAM Authentication plugin",
"status":{
"_class":"hudson.model.UpdateCenter$DownloadJob$Pending"
},
"plugin":{
}
}
]}
然后是等待 class hudson.model.UpdateCenter$InstallationJob
的所有作业具有状态 hudson.model.UpdateCenter$DownloadJob$SuccessButRequiresRestart
或 hudson.model.UpdateCenter$DownloadJob$Success
的情况。也值得寻找 hudson.model.UpdateCenter$DownloadJob$Failure
或 hudson.model.UpdateCenter$DownloadJob$Skipped
并适当处理。
我知道有两种通过远程安装 Jenkins 插件的方法 API,给定一个包含换行符分隔的插件短名称列表的文本文件,例如
# plugins.txt
ansicolor
bitbucket
cobertura
POSTing XML 在远程 API 使用 curl
:
JENKINS_URL="http://my-jenkins:8080/"
JENKINS_CRUMB=$(curl -s "${JENKINS_URL}"'/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)')
while read plugin; do
echo "Installing ${plugin} ..."
curl -X POST --data "<jenkins><install plugin='${plugin}@latest' /></jenkins>" -H "${JENKINS_CRUMB}" -H 'Content-Type: text/xml' "${JENKINS_URL}"/pluginManager/installNecessaryPlugins
done <"${PLUGINS_FILE}"
或者,POST 到远程端点的 Groovy 脚本,它基本上会做同样的事情:
# install_plugins.groovy
import jenkins.model.*
import java.util.logging.Logger
def logger = Logger.getLogger("")
def installed = false
def initialized = false
def plugins = new File('plugins.txt') as String[]
def instance =Jenkins.getInstance()
def pm = instance.getPluginManager()
def uc =instance.getUpdateCenter()
uc.updateAllSites()
plugins.each { logger.info("Checking ${it}")
if (!pm.getPlugin(it)) {
logger.info("Looking UpdateCenter for ${it}")
if (!initialized) {
uc.updateAllSites()
initialized = true
}
def plugin = uc.getPlugin(it)
if (plugin) {
logger.info("Installing ${it}")
plugin.deploy()
installed = true
} } }
if (installed)
{
logger.info("Plugins installed, initializing a restart!")
instance.save()
instance.doSafeRestart()
}
Shell:
export JENKINS_URL="http://my-jenkins:8080/"
export JENKINS_CRUMB=$(curl -s "${JENKINS_URL}"'/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)')
curl -H ${JENKINS_CRUMB} -d "script=$(cat install_plugins.groovy)" "${JENKINS_URL}/scriptText"
然而,这两种方法的共同点是每个安装插件的请求都由 Jenkins 异步处理,因此 returns 立即处理。然后插件将在后台安装。
但是,我想自动触发 Jenkins 重启并通知用户一旦安装了 所有 插件,一切就绪。我目前知道的唯一解决方案是在浏览器中打开插件管理器 UI 并点击 refresh
直到我觉得没有任何改变,然后手动触发重启。
有什么办法吗
- 同步安装插件(一个接一个),等到它及其依赖项完全安装后再继续下一个(我不介意更长的运行时间)
或者,或者,
- 启动异步作业,但定期查询服务器,直到安装完所有插件及其依赖项?
您可以获取此端点:
http://my-jenkins:8080/updateCenter/api/json?tree=jobs[*]
这会给你这样的回应:
{
"_class":"hudson.model.UpdateCenter",
"jobs":[
{
"_class":"hudson.model.UpdateCenter$ConnectionCheckJob",
"errorMessage":null,
"id":3,
"type":"ConnectionCheckJob"
},
{
"_class":"hudson.model.UpdateCenter$InstallationJob",
"errorMessage":null,
"id":1,
"type":"InstallationJob",
"name":"Xamarin Studio Tool Runner Plugin",
"status":{
"_class":"hudson.model.UpdateCenter$DownloadJob$SuccessButRequiresRestart"
},
"plugin":{
}
},
{
"_class":"hudson.model.UpdateCenter$InstallationJob",
"errorMessage":null,
"id":2,
"type":"InstallationJob",
"name":"PAM Authentication plugin",
"status":{
"_class":"hudson.model.UpdateCenter$DownloadJob$Pending"
},
"plugin":{
}
}
]}
然后是等待 class hudson.model.UpdateCenter$InstallationJob
的所有作业具有状态 hudson.model.UpdateCenter$DownloadJob$SuccessButRequiresRestart
或 hudson.model.UpdateCenter$DownloadJob$Success
的情况。也值得寻找 hudson.model.UpdateCenter$DownloadJob$Failure
或 hudson.model.UpdateCenter$DownloadJob$Skipped
并适当处理。