Найпростіший спосіб передчасно залишити роботу на трубопроводі Дженкінса як успішний?


55

У мене є робота, яка створюватиме файли, якщо одне з поданих до неї значень не відповідає старішому значенню. Який найчистіший спосіб у Дженкінса перервати або покинути роботу, не маючи цього 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 
    }

}

Я не хочу кидати код помилки, якщо це не може якось перетворити на те, що воно позначається успішною збіркою.


1
Просто exit 0...
Тенсібай

Я думав, що це позначило роботу провалом? Якщо я помиляюся, і ви можете показати документацію, я би радий прийняти це як відповідь
Олексій,

Ну, просто скрипти сценаріїв, вихід 0 означає успіх, вихід без нуля означає невдачу ...
Tensibai

Це не в рамках bash-сценарію, це сама робота з конвеєром, тому Groovy. Це щось змінює?
Алекс

У groovy я просто спробую return 0, я думаю, що все, в будь-якому кінці groovy коду, який не кидає виняток, я повинен вважати. Я дозволю, щоб хтось із більшим фоном на jenkins 2 підтвердив або
невідомий

Відповіді:


46

Зрозумів це. Поза будь-якими етапами (інакше це просто закінчить конкретний етап як успіх) виконайте наступне;

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

return зупинить етап або вузол, на якому ви працюєте , тому важливо запустити його поза сценою, встановивши currentBuild.resultзапобігання його відмови.


просто повернення повинно залишити збірку із статусом сірого та без результату ... тож не зовсім як збій збірки.
весело

1
Як повернутись та пропустити всі решти етапів?
Джесс Боуерс

1
@JessBowers - справа в тому, куди ви поставите фрагмент. Якщо ви зробите це на рівні вузла, а не на етапі, ви закінчите всю роботу.
Алекс

4
Зверніть увагу, що він працює лише для сценарію, який прописаний, а не для декларативного
kagarlickij

@kagarlickij - Правильних декларативних конвеєрів не було, коли ця відповідь була написана!
Алекс

10

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

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
}

Але це призведе до червоної стадії, якщо помилка трапиться всередині етапу.

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

Це залежить від ваших вимог, яким способом ви хочете скористатися.


Якщо ви збираєтеся це зробити так, складіть новий підклас RuntimeExceptionкидати замість того, щоб ловити всі винятки та перевіряти прапор
Майкл Мрозек

1

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

Я ще не придумав цього, тому не використовував плагін.

У цьому попередньому пості про переповнення стека на Jenkins: Умовний крок / етап


1
Хоча ваша відповідь здається достовірною (не перевіряли її наживо, оскільки я знайшов чергове вирішення), я не думаю, що "Чесно кажучи, ви не повинні виходити" - це хороший спосіб її почати; Очевидно, що існування цих методів означає, що ІНТИ іноді потрібно вийти.
Олексій

Що б ти запропонував? Перехід до закінчення заяви? Додавання класифікатора "взагалі"? Ви надали "зворотній зв'язок", але мені нелегко сказати про наміри чи дії, будь ласка, будьте менш стислі.
MrMesees

Почекайся трохи. Це ваше питання? Якщо це так, TBH ви б не хотіли чути, щоб ви не виходили, але жоден із способів, які я запропонував, не передбачає виходів, вони обходять кодовий біг ... Безпосередньо підтримуючи мою позицію.
MrMesees

1
Ага, я бачу, я думаю, що я неправильно трактував ваше твердження як "робити щось, щоб закінчити роботу, це погано", а не "ви не повинні використовувати буквальну exitкоманду" - якщо так я вибачаюся, це моє непорозуміння.
Олексій

3
Я намагався зробити це зрозумілішим, зовсім не потрібно вибачатися, мова - це непогане звір, особливо в Інтернеті :)
MrMesees

0

Executor.interrupt(Result)Метод є найчистішим, самим прямим чином я міг би знайти , щоб зупинити збірку передчасно і позначити його як успіх.

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

Плюси :

  • Працює в декларативному конвеєрі так само добре, як і за сценарієм.
  • Немає спроб / вилову чи виключень, які можна обробити
  • Позначає стадію виклику та будь-які наступні етапи як зелені / проходять в інтерфейсі користувача.

Мінуси :

  • Потрібна низка поточних схвалень сценарію, включаючи таке, що вважається небезпечним . Схвалюйте та використовуйте обережно.

Для мене це не працює - виконуються послідовні етапи.
Łukasz K
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.