#terminal #jenkins #hudson #jenkins-plugins
#терминал #дженкинс #хадсон #дженкинс-плагины
Вопрос:
Я пытаюсь создать скрипт bash для настройки Jenkins. Есть ли какой-либо способ обновить список плагинов из терминала Jenkins?
При первой настройке в списке нет плагина
т.е.:
java -jar jenkins-cli.jar -s `http://localhost:8080` install-plugin dry
не будет работать
Ответ №1:
Простой, но работающий способ — сначала перечислить все установленные плагины, найти обновления и установить их.
java -jar /root/jenkins-cli.jar -s http://127.0.0.1:8080/ list-plugins
Каждый плагин, для которого доступно обновление, имеет новую версию в скобках в конце. Итак, вы можете использовать grep для них:
java -jar /root/jenkins-cli.jar -s http://127.0.0.1:8080/ list-plugins | grep -e ')$' | awk '{ print $1 }'
Если вы вызываете install-plugin с именем плагина, он автоматически обновляется до последней версии.
Наконец, вам нужно перезапустить jenkins.
Собрать все это вместе (можно поместить в сценарий оболочки):
UPDATE_LIST=$( java -jar /root/jenkins-cli.jar -s http://127.0.0.1:8080/ list-plugins | grep -e ')$' | awk '{ print $1 }' );
if [ ! -z "${UPDATE_LIST}" ]; then
echo Updating Jenkins Plugins: ${UPDATE_LIST};
java -jar /root/jenkins-cli.jar -s http://127.0.0.1:8080/ install-plugin ${UPDATE_LIST};
java -jar /root/jenkins-cli.jar -s http://127.0.0.1:8080/ safe-restart;
fi
Комментарии:
1. Это лучший ответ, потому что он обрабатывает установку зависимостей плагинов jenkins в дополнение к самим плагинам.
2. Вероятно, вам также необходимо настроить аутентификацию с открытым ключом, согласно wiki.jenkins.io/display/JENKINS/Jenkins CLI
3. Добавьте
-auth @~/.ssh/jenkins.txt
для аутентификации в свой Jenkins, например:java -jar ~/tmp/jenkins-cli.jar -s https://jenkins.server.com -auth @~/.ssh/jenkins.txt list-plugins
~/ .ssh/jenkins.txt это файл, содержащий вашusername:password
4. Спасибо, это отличный ответ! Я просто хотел добавить, что, хотя я думал, что jenkins CLI устарел / отключен из-за проблем с безопасностью, это был просто старый протокол RMI. Jenkins по-прежнему поддерживает выполнение тех же команд CLI через http, websocket или ssh. С протоколом ssh вам даже не нужен jar, просто
ssh -p $port jenkins.example.com list-plugins
посмотрите jenkins.io/doc/book/managing/cli/#ssh о том, как это настроить.5. Вы можете загрузить Jenkins CLI .jar следующим образом: jenkins.io/doc/book/managing/cli/#downloading-the-client
Ответ №2:
На самом деле вы можете устанавливать плагины с компьютерного терминала (а не с терминала Jenkins).
- Загрузите плагин с сайта плагинов (
http://updates.jenkins-ci.org/download/plugins
) - Скопируйте этот плагин в
$JENKINS_HOME/plugins
каталог - В этот момент либо запустите Jenkins, либо вызовите службу настроек перезагрузки (
http://yourservername:8080/jenkins/reload
)
Это позволит включить плагин в Jenkins и предположить, что Jenkins запущен.
cd $JENKINS_HOME/plugins
curl -O http://updates.jenkins-ci.org/download/plugins/cobertura.hpi
curl http://yourservername:8080/reload
Комментарии:
1. Копирование обновленного файла hpi / jpi в каталог плагинов также работает для обновления существующего плагина. Я не знаю, достаточно ли URL-адреса / reload для перезапуска Jenkins, но использование «Безопасного перезапуска» (/ safeRestart) через пользовательский интерфейс делает то, что нужно.
2. Выше не будут установлены плагины зависимостей для устанавливаемого плагина AFAIK.
3. Это позволяет устанавливать определенные версии, спасибо.
4.
-L
Вероятно, потребуется добавить флаг в первый curl, поскольку он обычно перенаправляет на зеркало.5. Да, мне нужно
-L
было, чтобы в противном случае содержимое было просто перенаправлением HTML.
Ответ №3:
Вот как вы можете развернуть плагины Jenkins CI, используя Ansible, который, конечно, используется из терминала. Этот код является частью roles/jenkins_ci/tasks/main.yaml
:
- name: Plugins
with_items: # PLUGIN NAME
- name: checkstyle # Checkstyle
- name: dashboard-view # Dashboard View
- name: dependency-check-jenkins-plugin # OWASP Dependency Check
- name: depgraph-view # Dependency Graph View
- name: deploy # Deploy
- name: emotional-jenkins-plugin # Emotional Jenkins
- name: monitoring # Monitoring
- name: publish-over-ssh # Publish Over SSH
- name: shelve-project-plugin # Shelve Project
- name: token-macro # Token Macro
- name: zapper # OWASP Zed Attack Proxy (ZAP)
sudo: yes
get_url: dest="{{ jenkins_home }}/plugins/{{ item.name | mandatory }}.jpi"
url="https://updates.jenkins-ci.org/latest/{{ item.name }}.hpi"
owner=jenkins group=jenkins mode=0644
notify: Restart Jenkins
Это часть более полного примера, который вы можете найти по адресу:
https://github.com/sakaal/service_platform_ansible/blob/master/roles/jenkins_ci/tasks/main.yaml
Не стесняйтесь адаптировать его к вашим потребностям.
Комментарии:
1. Спасибо за это! Похоже
get_url
, что модуль Ansible будет извлекать файл, только если он еще не существует, что означает, что ваш playbook будет устанавливать только новые плагины, а не обновлять. Это правильно?2. Да, я обновляю их через веб-интерфейс Jenkins. Это делает только их первоначальную установку. Иногда важно иметь определенную версию какого-либо плагина, которым можно управлять из пользовательского интерфейса. Конечно, можно настроить скрипт управления конфигурацией, чтобы справиться с этим, но подход, который я привел выше, работает для меня очень хорошо.
3. force = yes загрузится
4. реквизиты для использования Ansible или любого инструмента автоматической настройки, если на то пошло.
Ответ №4:
Вы можете обновить список плагинов с помощью этой командной строки
curl -s -L http://updates.jenkins-ci.org/update-center.json | sed '1d;$d' | curl -s -X POST -H 'Accept: application/json' -d @- http://localhost:8080/updateCenter/byId/default/postBack
Комментарии:
1. Это удобно? Как не обновлять, пока не будет запущено задание? Мы не хотим тормозить задания для обновления плагинов.
2. @sorin Я почти уверен, что вам придется перезапустить jenkins, чтобы загрузить новые плагины. Таким образом, вы можете спланировать безопасный перезапуск после этой команды.
3. извините, но правильная реализация должна быть в состоянии ждать, пока не будет заданий. Даже текущий веб-интерфейс с ручным управлением имеет возможность отложить перезапуск до тех пор, пока не будут запущены задания.
4. AFAIU это не обновляет сами плагины, только информацию, которую Дженкинс имеет о доступных обновлениях плагинов. Это эквивалентно нажатию кнопки «Проверить сейчас» в / PluginManager для обновления информации об обновлении.
5. У меня это не удается с помощью «org.acegisecurity. Исключение AccessDeniedException: загрузка на основе браузера отключена «.
Ответ №5:
К вашему сведению — некоторые плагины (в частности, mercurial) неправильно устанавливаются из командной строки, если вы не используете их короткое имя. Я думаю, что это связано с триггерами в данных jenkins package info. Вы можете имитировать собственное обновление пакета jenkins, посетив 127.0.0.1:8080/pluginManager/checkUpdates
браузер с поддержкой javascript.
Или, если вы чувствуете себя мазохистом, вы можете запустить этот код на python:
import urllib2,requests
UPDATES_URL = 'https://updates.jenkins-ci.org/update-center.json?id=defaultamp;version=1.509.4'
PREFIX = 'http://127.0.0.1:8080'
def update_plugins():
"look at the source for /pluginManager/checkUpdates and downloadManager in /static/<whatever>/scripts/hudson-behavior.js"
raw = urllib2.urlopen(self.UPDATES_URL).read()
jsontext = raw.split('n')[1] # ugh, JSONP
json.loads(jsontext) # i.e. error if not parseable
print 'received updates json'
# post
postback = PREFIX '/updateCenter/byId/default/postBack'
reply = requests.post(postback,data=jsontext)
if not reply.ok:
raise RuntimeError(("updates upload not ok",reply.text))
print 'applied updates json'
И как только вы запустите это, вы сможете запустить jenkins-cli -s http://127.0.0.1:8080 install-plugin mercurial -deploy
.
Ответ №6:
С текущей версией Jenkins CLI можно использовать только через SSH. Это должно быть включено на странице «Глобальные настройки безопасности» в интерфейсе администрирования, как описано в документации. Кроме того, пользователь, который должен запускать обновления, должен добавить свой открытый ssh-ключ.
С помощью модифицированного сценария оболочки из принятого ответа это можно автоматизировать следующим образом, вам просто нужно заменить ИМЯ ХОСТА и ИМЯ ПОЛЬЗОВАТЕЛЯ:
#!/bin/bash
jenkins_host=HOSTNAME #e.g. jenkins.example.com
jenkins_user=USERNAME
jenkins_port=$(curl -s --head https://$jenkins_host/login | grep -oP "^X-SSH-Endpoint: $jenkins_host:K[0-9]{4,5}")
function jenkins_cli {
ssh -o StrictHostKeyChecking=no -l "$jenkins_user" -p $jenkins_port "$jenkins_host" "$@"
}
UPDATE_LIST=$( jenkins_cli list-plugins | grep -e ')$' | awk '{ print $1 }' );
if [ ! -z "${UPDATE_LIST}" ]; then
echo Updating Jenkins Plugins: ${UPDATE_LIST};
jenkins_cli install-plugin ${UPDATE_LIST};
jenkins_cli safe-restart;
else
echo "No updates available"
fi
Это greps используемый SSH-порт командной строки Jenkins, а затем подключается через SSH без проверки ключа хоста, поскольку он меняется при каждом перезапуске Jenkins.
Затем все плагины с доступным обновлением обновляются, а затем перезапускается Jenkins.
Ответ №7:
В groovy
У groovy path есть одно большое преимущество: его можно добавить к этапу сборки system groovy script в задании без каких-либо изменений.
Создайте файл ‘update_plugins.groovy‘ с этим содержимым:
jenkins.model.Jenkins.getInstance().getUpdateCenter().getSites().each { site ->
site.updateDirectlyNow(hudson.model.DownloadService.signatureCheck)
}
hudson.model.DownloadService.Downloadable.all().each { downloadable ->
downloadable.updateNow();
}
def plugins = jenkins.model.Jenkins.instance.pluginManager.activePlugins.findAll {
it -> it.hasUpdate()
}.collect {
it -> it.getShortName()
}
println "Plugins to upgrade: ${plugins}"
long count = 0
jenkins.model.Jenkins.instance.pluginManager.install(plugins, false).each { f ->
f.get()
println "${ count}/${plugins.size()}.."
}
if(plugins.size() != 0 amp;amp; count == plugins.size()) {
println "restarting Jenkins..."
jenkins.model.Jenkins.instance.safeRestart()
}
Затем выполните эту команду curl:
curl --user 'username:token' --data-urlencode "script=$(< ./update_plugins.groovy)" https://jenkins_server/scriptText