Настройка ответа Jenkins API

Мы создали панель управления поверх Jenkins, которая позволяет пользователям видеть только задания, относящиеся к проекту, а также запускать сборку. Пользовательский интерфейс построен с использованием responseJS, а серверной частью является JAVA REST WebServices.

WebService вызывает API Jenkins для получения информации о задании и преобразует данные в JSON для подачи в пользовательский интерфейс. В настоящее время на панели управления около 200 вакансий. На то, чтобы Jenkins API ответил с подробностями, требуется около 2 минут.

Дженкинс работает на Linux

OracleLinux 6 x Intel(R) Xeon(R) CPU E5-2660 0 @ 2.20GHz / 39.25 GB

Версия Jenkins - 1.564 с 16 исполнителями и более 2000 заданий

Sample API  Call - http://jenkins:8080/job/jobName/api/json?tree=displayName,builds[result],lastBuild[estimatedDuration,result,duration,number,timestamp,actions[causes[userName]]]

API вызывается 200 раз для 200 заданий, чтобы получить подробную информацию о каждом задании.

Любые советы о том, как ускорить ответ API.

Я подумал об увеличении ОЗУ на Linux-боксе и настройке JVM OPTS. Также обновление Jenkins до последней версии LTS.


person Upen    schedule 10.02.2017    source источник
comment
На вашей работе много сборок? Я знаю, что команда Jenkins работает с отложенной загрузкой сборок, но не знаю, в каких версиях есть эти улучшения. Например. как только вы загрузите задание, оно загрузит все сборки. В более новых версиях он загружает те, которые необходимы для отображения страницы / запроса рендеринга. Кроме того, часть builds[result] в запросе дерева может быть очень опасной, поскольку в более старых версиях (с отложенной загрузкой) это заставляло бы задание загружать все сборки. Причина в том, что пейджинг не выполнялся, например в более поздней версии вы должны указать диапазон возвращаемых сборок, по умолчанию, я думаю, 20.   -  person Jon S    schedule 10.02.2017
comment
Мы сохранили историю 30 сборок для каждой работы. Я просто беспокоюсь об обновлении ядра Jenkins, поскольку все плагины могут быть несовместимы. Мы используем несколько плагинов, чтобы все работало.   -  person Upen    schedule 10.02.2017
comment
Ладно, тогда не ленивая загрузка, 30 сборок - это не много. Только действительно проблема для вакансий с более чем 1000 сборками.   -  person Jon S    schedule 10.02.2017


Ответы (2)


Низко висящий фрукт:

  1. Запустите запросы параллельно, то есть не один за другим.
  2. Если вы это сделаете и используете стандартный jetty контейнер, попробуйте увеличить количество рабочих обрабатывает с параметром --handlerCountMax (по умолчанию 40).

В конце концов вам следует попытаться избежать выполнения 200 отдельных запросов. В зависимости от вашей настройки только проверки безопасности для каждого запроса могут вызвать значительные накладные расходы.

Поэтому самым чистым решением будет сбор всех необходимых данных из одного скрипта Groovy на главном сервере (вы также можете сделать это через REST):

  • это уменьшает количество запросов до 1
  • и это позволяет дальнейшую оптимизацию, возможно, обойдя проблемы, упомянутые в комментарии Джона С. выше
person Alex O    schedule 10.02.2017
comment
Поскольку я больше разбираюсь в Java, я попробую удалить цикл for для 200 нечетных вызовов и сделаю это за один раз, используя CountdownLatch. Будет держать вас в курсе. Спасибо. - person Upen; 14.02.2017
comment
С этим изменением я смог увеличить скорость с 2 минут до нескольких секунд. - person Upen; 01.03.2017
comment
Спасибо за ответ. Это приличное ускорение :) - person Alex O; 01.03.2017

Поскольку кажется, что у вас нет проблем с ленивой загрузкой на вашем сервере (поскольку у вас всего 60 сборок на задание), проблемы, вероятно, связаны с накладными расходами, как предлагает Алекс О. Также Alex O's предложил сделать все в одном запросе. Это можно сделать с помощью следующего запроса:

http://jenkins:8080/api/json?tree=jobs[displayName,builds[result],lastBuild[estimatedDuration,result,duration,number,timestamp,actions[causes[userName]]]]

Вместо того, чтобы полагаться на API заданий, мы используем API jenkins, где мы можем получить данные для всех заданий за один запрос.

person Jon S    schedule 10.02.2017
comment
Приятно :) Я не знал, что можно получить результаты для нескольких заданий за один запрос. - person Alex O; 12.02.2017