Jenkins - получить полный вывод консоли во время этапа сборки

Я пробовал интернет в течение нескольких дней, у меня проблема, подобная этому.

Мне нужно получить вывод консоли в грубом (обычном) тексте. Но если я могу получить его в HTML, это тоже хорошо, я всегда могу его разобрать. Единственное, что мне нужно получить на этапе сборки, что является проблемой, поскольку местоположение, где оно должно быть доступно, усечено...

Я попытался получить вывод консоли из следующего URL-адреса (относительно задания):

  • /consoleText
  • /logText/progressiveText
  • /logText/progressiveHTML

Два текстовых текста являются обычным текстом и были бы идеальными, если бы не усечение, то же самое касается HTML-кода... именно то, что мне нужно - только его усеченный....

Я уверен, что можно каким-то образом получить эту информацию, поскольку при просмотре /consoleFull происходит обновление консоли в реальном времени без усечения или буферизации.

Однако, изучив эту веб-страницу, вместо того, чтобы найти контент, который мне нужен, я нашел этот код там, где он должен был быть (я не включил полный код страницы, поскольку он был бы в основном неактуальным, и я считаю, что те, кто отвечает могли бы узнать и знать, что должно быть там по своему усмотрению)

      new Ajax.Request(href,{
          method: "post",
          parameters: {"start":e.fetchedBytes},
        requestHeaders: headers,
          onComplete: function(rsp,_) {

          var stickToBottom = scroller.isSticking();
          var text = rsp.responseText;
          if(text!="") {
            var p = document.createElement("DIV");
            e.appendChild(p); // Needs to be first for IE
            // Use "outerHTML" for IE; workaround for:
            // http://www.quirksmode.org/bugreports/archives/2004/11/innerhtml_and_t.html
            if (p.outerHTML) {
              p.outerHTML = '<pre>'+text+'</pre>';
              p = e.lastChild;
            }
            else p.innerHTML = text;
            Behaviour.applySubtree(p);
            if(stickToBottom) scroller.scrollToBottom();
          }

          e.fetchedBytes     = rsp.getResponseHeader("X-Text-Size");
          e.consoleAnnotator = rsp.getResponseHeader("X-ConsoleAnnotator");
            if(rsp.getResponseHeader("X-More-Data")=="true")
              setTimeout(function(){fetchNext(e,href);},1000);
          else
              $("spinner").style.display = "none";
          }
      });

В частности, я надеюсь, что у меня есть способ получить контент от text, каким бы он ни был. Я не знаком с этим языком, и поэтому не уверен, как я могу получить контент, который я хочу. Плагины не помогут, так как я хочу получить этот контент как часть моего script во время шага сборки

Ответы

Ответ 1

Вы провели довольно хорошее исследование. Я могу добавить только следующее: все связанные с консолью плагины, которые я знаю, разработаны как действия пост-сборки.

Плагин Log Trigger обеспечивает действие после сборки, которое позволяет Хадсону строит поиск в своем консольном журнале для данного регулярного выражения и если они найдены, запускают дополнительные рабочие задания ниже.

Таким образом, похоже, что нет прямого решения вашей проблемы. Я вижу следующие варианты:

1. Используйте тройник или что-то подобное (применимо только к шагам сборки оболочки)

Это решение далеко не универсальное, но оно может обеспечить быстрый доступ к последнему выпуску консоли, создаваемому командой или набором команд.

tee - чтение со стандартного ввода и запись на стандартный вывод и файлы

Используя синонимы на системном уровне, другие шаги сборки Jenkins могут быть изменены для создания вывода консоли. Файл с выходом консоли может быть указан через Jenkins или любым другим способом.

2. Изменить код Дженкинса

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

3. Поведение Mimic/console

Код в вашем примере используется для запроса обновлений с сервера Jenkins. Как вы можете ожидать, серверная сторона может вернуть часть информации, начиная с некоторого смещения. Позвольте мне показать.


Периодически страница консоли отправляет запросы на сервер:

enter image description here


Параметры просты:

enter image description here


Ответ - это кусок добавляемой информации:

enter image description here


Другой запрос с обновленным значением смещения (начала)

enter image description here


Вы можете легко понять, что нет данных, анализируя Content-Length

enter image description here


Итак, ответ: используйте url/job-name/build-number/logText/progressiveHtml, укажите начальное смещение, отправьте запрос и получите обновление консоли.

Ответ 2

Чтобы добавить некоторые сведения: когда была создана сборка Jenkins, ответ на URL.../consoleText превысил максимально допустимый уровень в 10000 строк. Я использовал пакет запросов() в Python. Я пробовал один и тот же URL-адрес с curl и снова получил только первые 10K строк. Только после завершения сборки оба метода вернули полный журнал ( > 22K строк в моем случае).

Я буду исследовать дальше и надеюсь отчитаться.

[2015-08-18] Обновление: похоже, это известная проблема (см. здесь), и она исправлена ​​в Jenkins 1.618 и позже. Я все еще работаю 1.615, поэтому не могу проверить. Amir