Как выполнить команду в задании Jenkins 2.0 Pipeline, а затем вернуть stdout

Есть ли лучший способ запустить задачу оболочки в конвейере Jenkins 2.0, а затем вернуть команду stdout этой команды. Единственный способ, которым я могу заставить это работать, - передать вывод команды в файл, а затем прочитать файл в переменной.

sh('git config --get remote.origin.url > GIT_URL')
def stdout = readFile('GIT_URL').trim()

Кажется, это очень плохой способ вернуть результат. Я надеялся, что смогу сделать что-то вроде:

def stdout = sh('git config --get remote.origin.url').stdout

или

def exitcode = sh('git config --get remote.origin.url').exitcode

Возможно ли это?

Ответы

Ответ 1

Обновление

Начиная с 6/2016 JENKINS-26133 официально отмечен как Решено. Поэтому перед попыткой обходных решений сначала попробуйте поддерживать реализацию для sh/bat, что позволяет использовать returnStdout и returnStatus параметров.

Обходные

К сожалению, эта функция по-прежнему не поддерживается и отсутствует. Для получения дополнительной информации см. Официальный билет:

JENKINS-26133 Shell script прием/возвращение вывода/статус Состояние: Правопреемник: Приоритет: Разрешение: Открыть Джесси Глик Основные нерешенные


Описание

В настоящее время sh не имеет значимого возвращаемого значения и выдает исключение если статус выхода не равен нулю. Было бы неплохо иметь возможность верните код выхода (ноль или нет) в виде целочисленного значения:

def r = sh script: 'someCommand', returnStatus: true

Текущее обходное решение:

sh 'someCommand; echo $? > status' 
def r = readFile('status').trim()

Или вернуть его стандартный вывод (похожий на backticks оболочки):

def lines = sh(script: 'dumpStuff.sh', returnStdout: true).split("\r?\n")

Обход проблемы:

sh 'dumpStuff.sh > result'
def lines = readFile('result').split("\r?\n")

Или для этого требуется что-то на стандартном вводе:

sh script: 'loadStuff.sh', stdin: someText

Обход проблемы:

writeFile file: 'input', text: someText >     sh 'loadStuff.sh < input'

Возможно, потребуются некоторые изменения API в долговременной задаче.

Ответ 2

Да, как упоминается luka5z, версия 2.4 узлов конвейеров и процессов Плагин теперь поддерживает такие вещи:

def stdout = sh(script: 'git config --get remote.origin.url', returnStdout: true)
println stdout

def retstat = sh(script: 'git config --get remote.origin.url', returnStatus: true)
println retstat

Кажется, что если вы попытаетесь вернуть оба в том же script, returnStatus перезапишет returnStdout, что немного неудачно.

Подробнее вы можете прочитать в официальной документации здесь

Изменить: Кроме того, он позволяет вам осуществлять более мелкий контроль над состояниями с невыполнением/нестабильной сборки. Вы можете увидеть пример в моем комментарии здесь