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' ''}