jenkins: многострочные команды оболочки с трубой
Я пытаюсь создать трубопровод Jenkins, где мне нужно выполнить несколько команд оболочки и использовать результат одной команды в следующей команде или около того. Я обнаружил, что обертывание команд в пару из трех одинарных кавычек '''
может сделать то же самое. Тем не менее, я сталкиваюсь с проблемами при использовании канала для подачи вывода одной команды на другую команду. Например
stage('Test') {
sh '''
echo "Executing Tests"
URL='curl -s "http://localhost:4040/api/tunnels/command_line" | jq -r '.public_url''
echo $URL
RESULT='curl -sPOST "https://api.ghostinspector.com/v1/suites/[redacted]/execute/?apiKey=[redacted]&startUrl=$URL" | jq -r '.code''
echo $RESULT
'''
}
Команды с трубой работают неправильно. Вот выход консоли jenkins:
+ echo Executing Tests
Executing Tests
+ curl -s http://localhost:4040/api/tunnels/command_line
+ jq -r .public_url
+ URL=null
+ echo null
null
+ curl -sPOST https://api.ghostinspector.com/v1/suites/[redacted]/execute/?apiKey=[redacted]&startUrl=null
Ответы
Ответ 1
Я попытался ввести все эти команды в генератор фрагментов jenkins для конвейера и дал следующий результат:
sh ''' echo "Executing Tests"
URL='curl -s "http://localhost:4040/api/tunnels/command_line" | jq -r \'.public_url\''
echo $URL
RESULT='curl -sPOST "https://api.ghostinspector.com/v1/suites/[redacted]/execute/?apiKey=[redacted]&startUrl=$URL" | jq -r \'.code\''
echo $RESULT
'''
Обратите внимание на экранированные одинарные кавычки в командах jq -r \'.public_url\'
и jq -r \'.code\'
. Использование кода таким образом позволило решить проблему
UPDATE:: Через некоторое время даже это начало создавать проблемы. Перед этими командами выполнялись определенные команды. Один из них был grunt serve
а другой был ./ngrok http 9000
. Я добавил некоторую задержку после каждой из этих команд, и на данный момент она решила проблему.
Ответ 2
Я разделил команды с помощью &&
node {
FOO = world
stage('Preparation') { // for display purposes
sh "ls -a && pwd && echo ${FOO}"
}
}
Пример выводит: - ls -a (файлы в вашей рабочей области - pwd (рабочая область местоположения) - echo world
Ответ 3
Код не работает, потому что вы используете "в sh, если вы добавите /", то он должен работать.
stage ('Test') {sh '' 'echo "Выполнение тестов" URL = curl -s "http://localhost:4040/api/tunnels/command_line" | jq -r/'.public_url/'
curl -s "http://localhost:4040/api/tunnels/command_line" | jq -r/'.public_url/'
echo $URL RESULT= curl -sPOST "https://api.ghostinspector.com/v1/suites/[redacted]/execute/?apiKey=[redacted]&startUrl=$URL" | jq -r/'.code/'
curl -s "http://localhost:4040/api/tunnels/command_line" | jq -r/'.public_url/'
echo $ URL RESULT = curl -sPOST "https://api.ghostinspector.com/v1/suites/[redacted]/execute/?apiKey=[redacted]&startUrl=$URL" | jq -r/'.code/'
curl -sPOST "https://api.ghostinspector.com/v1/suites/[redacted]/execute/?apiKey=[redacted]&startUrl=$URL" | jq -r/'.code/'
echo $RESULT ''' } curl -sPOST "https://api.ghostinspector.com/v1/suites/[redacted]/execute/?apiKey=[redacted]&startUrl=$URL" | jq -r/'.code/'
echo $ RESULT' ''}