【问题标题】:Install Jenkins plugins over remote API synchronously (wait until finished) OR find out when all plugins have been installed通过远程 API 同步安装 Jenkins 插件(等到完成)或找出所有插件何时安装
【发布时间】:2018-01-11 11:14:15
【问题描述】:

我知道通过远程 API 安装 Jenkins 插件的两种方法,给定一个带有换行符分隔的插件短名称列表的文本文件,例如

# plugins.txt
ansicolor
bitbucket
cobertura

使用curl 通过远程 API 发布 XML:

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}"

或者,将 Groovy 脚本 POST 到远程端点,它基本上会做同样的事情:

# 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()
 }

壳牌:

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 异步处理,因此会立即返回。然后插件将在后台安装。

但是,我想自动触发 Jenkins 重新启动并通知用户在安装 所有 插件后一切都准备就绪。我目前知道的唯一解决方案是在浏览器中打开插件管理器 UI,然后点击refresh,直到我觉得没有任何变化,然后手动触发重启。

有什么办法吗

  • 同步安装插件(一个接一个),等到它及其依赖项完全安装后再继续下一个(我不介意更长的运行时间)

或者,或者

  • 启动异步作业,但定期查询服务器,直到安装所有插件及其依赖项?

【问题讨论】:

    标签: jenkins plugins groovy remoteapi


    【解决方案1】:

    您可以获取此端点:

    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":{
    
         }
      }
    ]}
    

    然后就是等待hudson.model.UpdateCenter$InstallationJob 类的所有作业的状态为hudson.model.UpdateCenter$DownloadJob$SuccessButRequiresRestarthudson.model.UpdateCenter$DownloadJob$Success。寻找hudson.model.UpdateCenter$DownloadJob$Failurehudson.model.UpdateCenter$DownloadJob$Skipped 并妥善处理也是值得的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-11
      • 2019-03-26
      • 2015-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多