Самый чистый способ преждевременного выхода из работы трубопровода Дженкинс, как успех?

56

У меня есть задание, которое будет создавать файлы, если только одно из значений, передаваемых в него, не совпадает со старым значением. Какой самый чистый способ в Дженкинсе прервать или уйти с работы, если это не так FAILED? Это выход - правильное поведение, поэтому я хочу пометить сборку SUCCESS.

Это закончится выражением if, таким образом;

stage ('Check value') {

     if( $VALUE1 == $VALUE2 ) {
       //if they do match exit as a success, else continue with the rest of the job 
    }

}

Я не хочу бросать код ошибки, если это не может как-то перевести на него, помеченного как успешная сборка.

Alex
источник
1
Просто exit 0...
Тенсибай
Я думал, что ознаменовал работу неудачей? Если я ошибаюсь , и вы можете показать документы, я был бы счастлив принять , что в качестве ответа
Alex
Ну, просто bash-скрипты, выход 0 означает успех, выход не ноль означает сбой ...
Tensibai
Это не в скрипте bash, это само конвейерное задание, так что Groovy. Это что-то меняет?
Алекс
Я думаю, что в groovy я просто попробую return 0, в общем, любой конец Groovy-кода, который не выдает исключение. Я позволю кому-то с большим опытом о Дженкинсе 2 подтвердить или
опровергнуть

Ответы:

47

Догадаться. Вне каких-либо этапов (в противном случае это просто завершит конкретный этап в качестве успеха), выполните следующие действия;

if( $VALUE1 == $VALUE2 ) {
   currentBuild.result = 'SUCCESS'
   return
}

return остановит этап или узел, на котором вы работаете , поэтому важно запускать его вне этапа, в то время как настройка currentBuild.resultпредотвращает его сбой.

Alex
источник
просто возвращение должно оставить сборку с серым статусом и без результата ... так что это не совсем то же самое, что сборка с ошибкой.
drewish
1
Как вы вернетесь и пропустите все оставшиеся этапы?
Джесс Бауэрс
1
@JessBowers это все о том, где вы положили фрагмент. Если вы сделаете это на уровне узла, а не на уровне сцены, он завершит всю работу.
Alex
4
Обратите внимание, что это работает только для скриптового конвейера, а не для декларативного
kagarlickij
@kagarlickij - Правильные, декларативные конвейеры не существовали, когда был написан этот ответ!
Алекс
11

Вы также можете использовать ошибку для выхода из текущего этапа, тогда вам не нужно учитывать иерархию текущего этапа и тому подобное:

def autoCancelled = false

try {
  stage('checkout') {
    ...
    if (your condition) {
      autoCancelled = true
      error('Aborting the build.')
    }
  }
} catch (e) {
  if (autoCancelled) {
    currentBuild.result = 'SUCCESS'
    // return here instead of throwing error to keep the build "green"
    return
  }
  // normal error handling
  throw e
}

Но это привело бы к красной стадии, если ошибка происходит в пределах стадии.

введите описание изображения здесь

Это зависит от ваших требований, каким образом вы хотите использовать.

CSchulz
источник
Если вы собираетесь сделать это таким образом, создайте новый подкласс RuntimeExceptionдля броска вместо того, чтобы отлавливать все исключения и проверять флаг
Майкл Мрозек
1

Честно говоря, вам не нужно специально использовать команду выхода, но есть плагин Conditional BuildStep, который может достичь того же конечного результата (код, который не запускается).

Я еще не сталкивался с этим, поэтому не использовал плагин.

Также есть условные обозначения, которые можно найти в предыдущем сообщении о переполнении стека в Jenkins: условный шаг / этап конвейера Jenkins

MrMesees
источник
1
Хотя ваш ответ кажется верным (не проверял его вживую с тех пор, как я нашел другой обходной путь), я не думаю, что «Честно говоря, вы не должны выходить» - это хороший способ начать его; Очевидно, что наличие этих методов означает, что иногда необходимо выйти.
Алекс
Что ты предлагаешь? Переходя к окончательному утверждению? Добавлять классификатор "вообще"? Вы предоставили «обратную связь», но мне нелегко сообщить о намерении или действии, пожалуйста, будьте менее краткими.
MrMesees
Подожди немного. Это твой вопрос? Если это так, TBH, вы не хотели бы слышать, что не должны выходить, но ни один из предложенных мною методов не предоставляет выходы, они обходят выполнение кода ... Непосредственно в поддержку моей позиции.
MrMesees
1
Ааа, я понимаю, я думаю, что я неправильно истолковал ваше утверждение как «что-то делать, чтобы закончить работу, плохо» вместо «вы не должны использовать буквальную exitкоманду» - если так, то я извиняюсь, это мое недоразумение.
Алекс
3
Я пытался прояснить ситуацию, не нужно извиняться вообще, язык - переменчивый зверь, особенно в Интернете :)
MrMesees
0

Этот Executor.interrupt(Result)метод является самым чистым, самым прямым способом, который я мог найти, чтобы преждевременно остановить сборку и отметить ее как успешную.

script {
    currentBuild.getRawBuild().getExecutor().interrupt(Result.SUCCESS)
}

Плюсы :

  • Работает как в декларативном конвейере, так и в сценарии.
  • Нет попытки / ловить или исключений для обработки.
  • Помечает вызывающий этап и любые последующие этапы как зеленые / проходящие в пользовательском интерфейсе.

Минусы :

  • Требуется несколько утверждений сценариев в процессе, включая одно, которое считается небезопасным . Одобрить и использовать с осторожностью.
Бен Амос
источник
Для меня это не работает - выполняются последовательные этапы.
Лукаш К