У меня есть что-то подобное в Jenkinsfile (Groovy), и я хочу записать stdout и код выхода в переменную, чтобы позже использовать эту информацию.
sh "ls -l"
Как я могу это сделать, особенно если учесть, что вы не можете запустить какой-либо отличный код внутри Jenkinsfile
?
Ответы:
Последняя версия
sh
шага конвейера позволяет вам сделать следующее;Другая особенность -
returnStatus
опция.Эти параметры были добавлены на основе этой проблемы.
Смотрите официальную документацию для
sh
команды.источник
WorkflowScript: 97: Expected a step @ line 97, column 17.
script
блока шага. jenkins.io/doc/book/pipeline/syntax/#declarative-stepsТекущая версия конвейера изначально поддерживает
returnStdout
иreturnStatus
, что позволяет получить вывод или статус изsh
/bat
steps.Пример:
Официальная документация .
источник
script { }
шаг.быстрый ответ таков:
Я думаю, что существует запрос функции, чтобы можно было получить результат шага sh, но, насколько я знаю, в настоящее время нет другого варианта.
РЕДАКТИРОВАТЬ: JENKINS-26133
РЕДАКТИРОВАТЬ 2: Не совсем уверен, с какой версией, но шаги sh / bat теперь могут возвращать вывод std, просто:
источник
Если вы хотите получить стандартный вывод и знать, была ли команда выполнена успешно или нет, просто используйте
returnStdout
и оберните ее в обработчик исключений:скриптовый конвейер
вывод :
К сожалению, в hudson.AbortException отсутствует какой-либо полезный метод для получения этого статуса выхода, поэтому, если требуется фактическое значение, вам нужно разобрать его в сообщении (тьфу!)
В отличие от Javadoc, https://javadoc.jenkins-ci.org/hudson/AbortException.html сборка не завершается при обнаружении этого исключения. Это терпит неудачу, когда это не поймано!
Обновление: если вы также хотите получить вывод STDERR из команды оболочки, к сожалению, Jenkins не сможет должным образом поддерживать этот общий вариант использования. Билет на 2017 год JENKINS-44930 застрял в состоянии самоуверенного пинг-понга, пока не продвинулся в поиске решения - рассмотрите возможность добавления к нему своего положительного голоса.
Что касается решения сейчас , может быть несколько возможных подходов:
а) Перенаправить STDERR в STDOUT
2>&1
- но тогда вам придется проанализировать это из основного вывода, и вы не получите вывод, если команда не удалась - потому что вы находитесь в обработчике исключений.б) перенаправить STDERR во временный файл (имя которого вы готовите ранее)
2>filename
(но не забудьте впоследствии очистить файл) - т.е. основной код становится:c) Пойти другим путем, установить
returnStatus=true
вместо этого, обойтись без обработчика исключений и всегда записывать вывод в файл, то есть:Предостережение: приведенный выше код относится только к Unix / Linux - Windows требует совершенно других команд оболочки.
источник
Это пример, который, я думаю, будет иметь смысл!
источник
Для тех, кому нужно использовать выходные данные в последующих командах оболочки, а не в groovy, можно сделать что-то вроде этого:
Я нашел примеры кода maven весьма полезными.
источник
Самый простой способ - использовать этот способ
my_var=`echo 2` echo $my_var
выход: 2обратите внимание, что это не простая одинарная кавычка - обратная кавычка (`).
источник
sh
иначе люди могут подумать, что это здорово, особенно если они не знакомы с сценариями bash. Я только что попробовал это на Дженкинсе, используяls -l
вместо,echo 2
и это работает. Я действительно использовал этот подход раньше, но искал альтернативу, потому что он не очень надежен. У меня есть вывод более сложной команды, захваченной таким образом в стандартной оболочке, но при портировании в Jenkinssh
переменная не содержит ничего по неизвестной причине.