Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Jenkins + Zephyr: cannot configure Zephyr server

jenkins
jira
Теги: #<Tag:0x00007f7b652260b8> #<Tag:0x00007f7b65225ca8>

(sunstream) #1

Привет!

Мы наблюдаем следующую проблему: при попытке подключить плагин zephyr-enterprise-test-management-plugin невозможно добавить и сконфигурировать Zephyr-сервер. Выглядит это примерно так: http://snag.gy/dIB6N.jpg

Судя по стектрейсу, ругается на то, что параметр username - null, хотя соответствующее поле заполнено:

Caused by: java.lang.IllegalArgumentException: Username may not be null
    at org.apache.http.util.Args.notNull(Args.java:48)
    at org.apache.http.auth.UsernamePasswordCredentials.<init>(UsernamePasswordCredentials.java:78)
    at com.thed.zephyr.jenkins.utils.rest.RestClient.createClientContext(RestClient.java:70)
    at com.thed.zephyr.jenkins.utils.rest.RestClient.<init>(RestClient.java:43)
    at com.thed.zephyr.jenkins.reporter.ZeeDescriptor.getRestclient(ZeeDescriptor.java:411)
    at com.thed.zephyr.jenkins.reporter.ZeeDescriptor.doTestConnection(ZeeDescriptor.java:182)
    at sun.reflect.GeneratedMethodAccessor1167.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.kohsuke.stapler.Function$InstanceFunction.invoke(Function.java:298)
    at org.kohsuke.stapler.Function.bindAndInvoke(Function.java:161)
    at org.kohsuke.stapler.Function.bindAndInvokeAndServeResponse(Function.java:96)
    at org.kohsuke.stapler.MetaClass$1.doDispatch(MetaClass.java:121)
    at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:53)
    at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:746)

Сталкивался ли кто-нибудь с подобной проблемой? Достучаться до техподдержки Zephyr я не могу - нет аккаунта в их системе.


(Sergey Korol) #2

А на оф. страничку плагина заглядывали?

Там как бы намекают:

Note that the user credentials must be that of Zephyr “Test Manager” or “Test Lead”.

Конечно выглядит весьма странно и неочевидно, но тут уж вопрос к разработчикам.


(sunstream) #3

Заглядывали. Креды уровня Test Manager, да.
Проблема в другом. Этап установки соединения проходит проверку урла, но падает на проверке неналловости параметра username. Судя по исходному коду модуля RestClient, доступные конфигурации серверов складываются в коллекцию, после чего при вызове метода doTestConnection() создаются переменные username и password, инициализируются обе в null, затем идёт проходка по этой коллекции и в ней ищется сервер, чей урл совпадает с тем, что нужно протестировать. Когда он находится, из его конфигурации выдираются логин и пароль, записываются в заранее объявленные переменные и используются при установке соединения.
Такое впечатление, что требуемую конфигурацию он не находит, а, значит, креды не выдирает. Вот я и думаю, может, мы что-то где-то пропустили в настройках сервера.


(Sergey Korol) #4

Вот тут я смотрю висит открытый PR. Описание не очень внятное, но судя по коммиту - проблема, похожая на вашу.

Слейте исходники плагина, пересоберите с вашим (или предложенным) фиксом, и будет вам счастье. :wink:


(sunstream) #5

Мы тут немного подебажили и, кажется, нашли, в чём проблема.
Дело в том, что Zephyr начинает проверять введённую конфигурацию ещё до нажатия Test Connection, а сразу после ввода текста в поле URL. Он сначала проверяет, что урл соответствует условиям вроде “начинаться с http(s)”, а затем приписывает к нему подстроку /flex/services/rest/latest/, шлёт get-запрос и проверяет код ответа. В случае, если это код ошибки, он молча возвращает false и попросту не записывает конфигурацию в список доступных. В результате для неё не сохраняется логин-пароль, и при попытке установить соединение ругается, что, мол, юзернейм не может быть налл :slight_smile:
Похоже, надо как-то изменить сам урл, но как именно - непонятно. Есть вариант, что нужно дописать номер порта, но номер порта пока тоже неизвестен.


(sunstream) #6

Тему можно закрыть, до причины докопались. Ошибка “Username may not be null” выдаётся при неправильном адресе сервера. Ниже - объяснение того, как это происходит. Вдруг кому пригодится.

  1. Проверка на самом деле начинается ещё до нажатия кнопки Test Connection - по событию, что пользователь ввёл данные в форму.
  2. Несмотря на то, что у них есть отдельный класс, который валидирует урлы, прямо в код, который читает из UI данные конфигурации, вставлена проверка на то, что строка начинается с http:// или https:// - подлость в том, что под этим полем написано “URL или IP”, а примется по факту только урл. Айпишник не пройдёт )
  3. После ряда других проверок к пути дописывается /flex/services/rest/latest, и на результирующий урл отправляется GET-запрос.
  4. Проверяется код ответа. Если он свидетельствует о сбое, никакой ошибки не выскакивает - просто метод валидации возвращает false.
  5. Если на предыдущем шаге получен false, введённая конфигурация не сохраняется. В юае она по-прежнему на месте, а вот в поле zephyrInstances, хранящее список всех введённых конфигураций, она не попадает. Как будто мы ничего и не вводили.
  6. А дальше самое весёлое. Когда мы нажимаем Test Connection, метод считывает урл из поля и идёт по списку сохранённых конфигураций, проверяя, у кого же из них такой урл. Не находит, разумеется, мы же помним, что она не сохранилась? Соответственно, он не получает из сохраненной конфигурации пару логин и пароль и пытается создать коннекшен с пустым логином и паролем. Отсюда и ошибка.

Вот здесь производится вызов проверки.

А здесь - сама проверка.


(Sergey Korol) #7

Создайте issue. Может и пофиксят.