Установите плагины Jenkins поверх удаленного API синхронно (дождитесь завершения) ИЛИ узнайте, когда все плагины были установлены

Мне известны два подхода к установке плагинов Jenkins через удаленный API, учитывая текстовый файл со списком плагинов shortNames, разделенным новой строкой, например

# plugins.txt
ansicolor
bitbucket
cobertura

Размещение 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}"

В качестве альтернативы, поместите сценарий 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()
 }

Ракушка:

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 и уведомить пользователя о том, что все готово к работе после установки всех плагинов. Единственное решение, о котором я знаю в настоящее время, - это открыть пользовательский интерфейс менеджера плагинов в браузере и нажать refresh пока у меня не сложится впечатление, что ничего больше не меняется, потом вручную запускаю перезагрузку.

Есть ли способ либо

  • установите плагины синхронно (один за другим), ожидая, пока он и его зависимости не будут полностью установлены, прежде чем переходить к следующему (я не возражаю против более длительного времени выполнения)

или, альтернативно

  • запускать асинхронные задания, но регулярно запрашивать сервер, пока не будут установлены все плагины и их зависимости?

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$SuccessButRequiresRestart или же hudson.model.UpdateCenter$DownloadJob$Success, Также стоит поискать hudson.model.UpdateCenter$DownloadJob$Failure или же hudson.model.UpdateCenter$DownloadJob$Skipped и обрабатывать соответственно.

Другие вопросы по тегам