Установите плагины 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
и обрабатывать соответственно.