Обработка ответа на состояние завитка в Jenkins, не удается прервать выполнение конвейера

#curl #groovy #jenkins-pipeline

Вопрос:

У меня есть сценарий конвейера (файл Дженкинса), в котором я хочу получить ответ CURL (если 200 ок, двигайтесь дальше. В противном случае прервите выполнение задания). Я борюсь с синтаксисом curl на этапе конвейера, предназначенном для этого:

 stage('Getting getting external API') {
steps {
  script{
        /* groovylint-disable-next-line LineLength */
        final String url = "curl -X 'GET'  'https://my-endpoint-test/operations/promote/Approved'  -H 'accept: */*'"


        final def (String code) = sh(script: "curl -s -w '\n%{response_code}' $url", returnStdout: true)
                    
                    echo "HTTP response status code: $code"
                    /* groovylint-disable-next-line NestedBlockDepth */
                    if (code != "200") {
                        error ('URL status different of 200. Exiting script.')
                    } 
        }
    }
}
 

Я думаю, что я не в правильном направлении с этим URL-адресом, он жалуется на «»после GET и до «- H».

     WorkflowScript: 54: unexpected char: '' @ line 54, column 47.

   l String url = "curl -X 'GET'  'https:/

                                 ^1 error
 

Кроме того, не могли бы вы посоветовать более простой способ прерывания этого конвейера в зависимости от ответа о состоянии http?

Комментарии:

1. Обратная косая черта в строке Java/Groovy предназначена для экранирования специальных символов . Чего вы пытаетесь достичь с помощью этих»»? Кроме того, переменная имеет имя url , но содержит полную curl команду, которую затем вы интерполируете в другую curl команду. Вы когда-нибудь думали об использовании декларативных конвейеров ?

2. @Герольдброзер. Да, я именно боролся с этими негативными реакциями. Они выходят из форматирования завитков , как видно на Swagger. В этом есть большой смысл. Я не знал, как это лечить. И да: я рассматривал декларативные конвейеры . Я просто пытаюсь следовать каким-то стандартам в этом проекте. Но я определенно попробую, если сценарий не соответствует нашим потребностям.

3. В целом, сценарии трубопроводов удовлетворяют большему количеству потребностей. Но я уже много лет не видел ни одного проекта Дженкинса, который нуждался бы в таком. Сейчас доступно так много плагинов в виде шагов конвейера: jenkins.io/doc/pipeline/steps .

Ответ №1:

Ваша команда curl неверна.

 stage('Getting getting external API') {
  steps {
    script{

      cmd = """
          curl -s -X GET -H 'accept: */*' -w '{http_code}' 
              'https://my-endpoint-test/operations/promote/Approved' 
      """

      status_code = sh(script: cmd, returnStdout: true).trim()
      // must call trim() to remove the default trailing newline
                  
      echo "HTTP response status code: ${status_code}"

      if (status_code != "200") {
          error('URL status different of 200. Exiting script.')
      } 
    }
  }
}
 

Комментарии:

1. Кажется, работает довольно хорошо. Я не уверен в выводе, потому что переменная ${status_code} возвращает нечто большее, чем просто номер состояния: код состояния HTTP — ответа: {«Код состояния»:500,»сообщение»:»Внутренняя ошибка сервера»}{http_code}