Jenkins + Zephyr: cannot configure Zephyr server

Привет!

Мы наблюдаем следующую проблему: при попытке подключить плагин 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 я не могу - нет аккаунта в их системе.

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

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

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

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

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

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

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

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

Тему можно закрыть, до причины докопались. Ошибка “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, метод считывает урл из поля и идёт по списку сохранённых конфигураций, проверяя, у кого же из них такой урл. Не находит, разумеется, мы же помним, что она не сохранилась? Соответственно, он не получает из сохраненной конфигурации пару логин и пароль и пытается создать коннекшен с пустым логином и паролем. Отсюда и ошибка.

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

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

https://github.com/jenkinsci/zephyr-enterprise-test-management-plugin/blob/master/src/main/java/com/thed/zephyr/jenkins/utils/rest/ServerInfo.java#L67

1 лайк

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