Как я могу обновить плагины jenkins из терминала?

#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).

  1. Загрузите плагин с сайта плагинов ( http://updates.jenkins-ci.org/download/plugins )
  2. Скопируйте этот плагин в $JENKINS_HOME/plugins каталог
  3. В этот момент либо запустите 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