Как настроить этап конвейера Дженкинса на нестабильный на основе кода выхода из сценария?

#python-3.x #jenkins #jenkins-pipeline

Вопрос:

Этап в моем конвейере Дженкинса должен быть установлен как нестабильный в зависимости от кода завершения сценария в его шагах: 2 должен установить статус этапа как нестабильный, когда 1 должен установить результат этапа как неудачный.

Как этого добиться? Я проверил «Ошибка», но, похоже, она не отличается от статуса «сбой», предлагая только способ поймать выход, отличный от 0 (1,2…).

 pipeline {  agent any   parameters {  string(name: 'FOO', defaultValue: 'foo', description: 'My foo param')  string(name: 'BAR', defaultValue: 'bar', description: 'My bar param')  }   stages {  stage('First') {  steps {  // If "script.py" exit code is 2, set stage to unstable  // If "script.py" exit code is 1, set stage to failed     sh """  . ${WORKSPACE}/venv/bin/activate  python ${WORKSPACE}/script.py --foo ${FOO} --bar ${BAR}  deactivate  """  }  }  }  stage('Second') {  steps {  echo('Second step')  }  }  } }  

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

1. Мой ответ был обновлен/исправлен в соответствии с вашими требованиями

Ответ №1:

Решение

Вам нужно будет выполнить следующие действия

  1. Поместите весь свой код в script блок
  2. Изменить sh , чтобы вернуть код состояния
  3. Используйте условное условие для проверки кода состояния
  4. Бросьте и поймайте ошибку с catchError помощью . Установите сборку на УСПЕХ, а этап-на СБОЙ или НЕСТАБИЛЬНОСТЬ соответственно

Я использую error для принудительного исключения, но вы также можете использовать sh 'exit 1' или throw new Exception('')

 pipeline {  agent any   parameters {  string(name: 'FOO', defaultValue: 'foo', description: 'My foo param')  string(name: 'BAR', defaultValue: 'bar', description: 'My bar param')  }   stages {  stage('First') {  steps {  script {    def pythonScript = """  . ${WORKSPACE}/venv/bin/activate  python ${WORKSPACE}/script.py --foo ${FOO} --bar ${BAR}  deactivate  """    def statusCode = sh( script:pythonScript, returnStatus:true )      if(statusCode == 2) {  catchError(buildResult: 'SUCCESS', stageResult: 'UNSTABLE') {  error 'STAGE UNSTABLE'  }  } else if(statusCode == 1) {  catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {  error 'STAGE FAILURE'  }  }    }  }  }  } }    

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

1. спасибо за ваш ответ, но мне нужно, чтобы результат этапа был НЕСТАБИЛЬНЫМ, а не вся сборка.

2. @donmelchior пожалуйста, дайте мне знать, удовлетворяет ли это обновление вашим требованиям. Я понимаю , что вы сказали, что пытались catchError , но это не похоже на то, что вы ввели catchError условные обозначения, и вы не получили код возврата для сравнения

3. Это именно то, что мне нужно, спасибо

4. @donmelchior отлично. Пожалуйста. Спасибо, что приняли ответ и поддержали