Как это сделать, я получаю вывод команды оболочки, выполненной с использованием в переменной Jenkinsfile (groovy)?
У меня есть что-то подобное в файле Jenkins (Groovy), и я хочу записать stdout и код выхода в переменной, чтобы позже использовать информацию.
sh "ls -l"
Как я могу это сделать, особенно, поскольку кажется, что вы действительно не можете запускать какой-либо код groovy внутри Jenkinsfile
?
Ответы
Ответ 1
Последняя версия шага конвейера sh
позволяет вам делать следующее:
// Git committer email
GIT_COMMIT_EMAIL = sh (
script: 'git --no-pager show -s --format=\'%ae\'',
returnStdout: true
).trim()
echo "Git committer email: ${GIT_COMMIT_EMAIL}"
Еще одна функция - опция returnStatus
.
// Test commit message for flags
BUILD_FULL = sh (
script: "git log -1 --pretty=%B | grep '\\[jenkins-full]'",
returnStatus: true
) == 0
echo "Build full flag: ${BUILD_FULL}"
Эти параметры были добавлены в зависимости от этой проблемы.
Смотрите официальную документацию для команды sh
.
Ответ 2
Быстрый ответ:
sh "ls -l > commandResult"
result = readFile('commandResult').trim()
Я думаю, что есть запрос функции, чтобы получить результат шага sh, но, насколько мне известно, в настоящее время нет другого варианта.
EDIT: JENKINS-26133
EDIT2: не совсем уверен, поскольку какая версия, но шаги sh/bat теперь могут возвращать вывод std, просто:
def output = sh returnStdout: true, script: 'ls -l'
Ответ 3
Версия Current Pipeline изначально поддерживает returnStdout
и returnStatus
, что позволяет получить выходные данные или статус от шагов sh
/bat
.
Пример:
def ret = sh(script: 'uname', returnStdout: true)
println ret
Официальная документация.
Ответ 4
Это пример, который будет иметь смысл, я верю!
node('master'){
stage('stage1'){
def commit = sh (returnStdout: true, script: '''echo hi
echo bye | grep -o "e"
date
echo lol''').split()
echo "${commit[-1]} "
}
}
Ответ 5
Если вы хотите получить стандартный вывод и знать, была ли команда выполнена успешно, просто используйте 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 из команды оболочки, возможны несколько подходов:
а) Перенаправить 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}")
}
в) Пойдите другим путем, установите вместо этого 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 требуются совершенно другие команды оболочки.
Ответ 6
Самый простой способ - использовать этот способ
my_var='echo 2'
echo $my_var
выход
: 2
обратите внимание, что это не простая одинарная кавычка - обратная кавычка (').