Якщо ви хочете отримати stdout І знати, вдала команда чи ні, просто використовуйте 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 з команди оболонки, Дженкінс, на жаль, не вдається належним чином підтримати цей звичайний варіант використання. Квиток на 2017 рік JENKINS-44930 застряг у стані самовпевненого пінг-понгу, не роблячи жодного прогресу на шляху до вирішення - будь ласка, подумайте про те, щоб додати його.
Щодо рішення зараз , можливо, існує кілька можливих підходів:
a) Перенаправляйте 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 вимагає зовсім інших команд оболонки.