Подтвердить что ты не робот

Как это сделать, я получаю вывод команды оболочки, выполненной с использованием в переменной Jenkinsfile (groovy)?

У меня есть что-то подобное в файле Jenkins (Groovy), и я хочу записать stdout и код выхода в переменной, чтобы позже использовать информацию.

sh "ls -l"

Как я могу это сделать, особенно, поскольку кажется, что вы действительно не можете запускать какой-либо код groovy внутри Jenkinsfile?

4b9b3361

Ответ 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

обратите внимание, что это не простая одинарная кавычка - обратная кавычка (').