Если вы хотите получить стандартный вывод и знать, была ли команда выполнена успешно или нет, просто используйте returnStdout
и оберните ее в обработчик исключений:
скриптовый конвейер
try {
// Fails with non-zero exit if dir1 does not exist
def dir1 = sh(script:'ls -la dir1', returnStdout:true).trim()
} catch (Exception ex) {
println("Unable to read dir1: ${ex}")
}
вывод :
[Pipeline] sh
[Test-Pipeline] Running shell script
+ ls -la dir1
ls: cannot access dir1: No such file or directory
[Pipeline] echo
unable to read dir1: hudson.AbortException: script returned exit code 2
К сожалению, в hudson.AbortException отсутствует какой-либо полезный метод для получения этого статуса выхода, поэтому, если требуется фактическое значение, вам нужно разобрать его в сообщении (тьфу!)
В отличие от Javadoc, https://javadoc.jenkins-ci.org/hudson/AbortException.html сборка не завершается при обнаружении этого исключения. Это терпит неудачу, когда это не поймано!
Обновление:
если вы также хотите получить вывод STDERR из команды оболочки, к сожалению, Jenkins не сможет должным образом поддерживать этот общий вариант использования. Билет на 2017 год JENKINS-44930 застрял в состоянии самоуверенного пинг-понга, пока не продвинулся в поиске решения - рассмотрите возможность добавления к нему своего положительного голоса.
Что касается решения сейчас , может быть несколько возможных подходов:
а) Перенаправить STDERR в STDOUT 2>&1
- но тогда вам придется проанализировать это из основного вывода, и вы не получите вывод, если команда не удалась - потому что вы находитесь в обработчике исключений.
б) перенаправить STDERR во временный файл (имя которого вы готовите ранее) 2>filename
(но не забудьте впоследствии очистить файл) - т.е. основной код становится:
def stderrfile = 'stderr.out'
try {
def dir1 = sh(script:"ls -la dir1 2>${stderrfile}", returnStdout:true).trim()
} catch (Exception ex) {
def errmsg = readFile(stderrfile)
println("Unable to read dir1: ${ex} - ${errmsg}")
}
c) Пойти другим путем, установить returnStatus=true
вместо этого, обойтись без обработчика исключений и всегда записывать вывод в файл, то есть:
def outfile = 'stdout.out'
def status = sh(script:"ls -la dir1 >${outfile} 2>&1", returnStatus:true)
def output = readFile(outfile).trim()
if (status == 0) {
// output is directory listing from stdout
} else {
// output is error message from stderr
}
Предостережение: приведенный выше код относится только к Unix / Linux - Windows требует совершенно других команд оболочки.