Як / коли Execute Shell позначає збірку як провал в Дженкінсі?


112

Історії жахів я знайшов під час пошуку відповіді на цю ...

Гаразд, у мене є .sh-скрипт, який в значній мірі робить все, що Дженкінс повинен зробити:

  • перевіряє джерела з SVN
  • побудувати проект
  • розгортає проект
  • очищає після себе

Тож у Дженкінсі мені залишається лише «побудувати» проект, запустивши сценарій у команді Execute Shell. Сценарій запускається (джерела завантажуються, проект будується / розгортається), але потім він позначає збірку як невдачу: крок збирання «Виконати оболонку» позначає збірку як провал Навіть якщо сценарій був успішно запущений! Я спробував закрити сценарій за допомогою:

  • вихід 0 (все ще позначає це як збій)
  • вихід 1 (позначає це як збій, як очікувалося)
  • взагалі немає команди виходу (позначає це як збій)

Коли, як і чому Execute Shell позначає мою конструкцію як провал?

Відповіді:


131

Спочатку спочатку наведіть курсор миші на сіру область нижче. Не частина відповіді, але абсолютно потрібно сказати:

Якщо у вас є сценарій оболонки, який "перевіряє, будує, розгортає" все сам, то чому ви використовуєте Дженкінс? Ви перераховуєте всі риси Дженкінса, які роблять його таким, яким він є. Можливо, ви також можете отримати cron або SVN-гачок після завершення виклику скрипта безпосередньо. Дженкінс, який займається оформленням SVN, має вирішальне значення. Це дозволяє запускати збірки лише тоді, коли є зміни (або в таймері, або вручну, якщо вам зручніше). Він відстежує зміни між збірками. Він показує ці зміни, тож ви можете бачити, яка збірка була для якого набору змін. Він надсилає електронний лист комітетам, коли їх зміни спричинили успішну або невдалу збірку (знову ж таки, як налаштовано). Він надішле електронних повідомлень, коли їхні виправлення виправлять невдалу збірку. І все більше. Архівні артефакти Дженкінса також роблять їх доступними за збірку безпосередньо за Дженкінсом. Хоча це не так важливо, як замовлення на SVN, це знову є невід'ємною частиною того, що робить його Дженкінсом. Те саме з розгортанням. Якщо у вас є єдине середовище, розгортання зазвичай відбувається в декількох середовищах. Дженкінс може відслідковувати, в якому середовищі розгорнута конкретна збірка (із специфічним набором змін SVN) за допомогою Акції. Ви все це випереджаєте. Це здається, що вам кажуть "ти повинен користуватися Дженкінсом", але ти цього не хочеш, і ти робиш це просто для того, щоб відмовитись від босів, щоб поставити галочку "так, я використав Дженкінса"

Коротка відповідь: вихідний код останньої команди кроку побудови виконавчої оболонки Дженкіна - це те, що визначає успіх / неуспіх кроку збірки . 0- успіх, anything else- невдача. Зауважте, це визначає успіх / провал кроку збирання , а не виконання всієї роботи . На успіх / невдачу всього виконання завдання може вплинути також кілька етапів складання, дії та додатки після складання.

Ви вже згадували Build step 'Execute shell' marked build as failure, тому ми зосередимось лише на одному кроці побудови. Якщо у вашому кроці зборки оболонки Execute є лише один рядок, який викликає ваш скрипт оболонки, тоді вихідний код сценарію оболонки визначатиме успіх / невдачу кроку збірки. Якщо у вас є більше рядків після виконання сценарію оболонки, уважно їх перегляньте, оскільки саме вони можуть стати причиною збою.

Нарешті, прочитайте тут виходи Jenkins Build Script після виконання тесту Google . Це не пов'язане безпосередньо з вашим запитанням, але зауважте, що частина про Дженкінс запускає крок побудови Execute Shell як сценарій оболонки з/bin/sh -xe

Це -eозначає, що скрипт оболонки завершиться з відмовою, навіть якщо не вдасться лише 1 команда, навіть якщо ви виконаєте перевірку помилок для цієї команди (оскільки сценарій закінчується до того, як він потрапить до вашої перевірки помилок). Це суперечить звичайному виконанню скриптів оболонки, які зазвичай друкують повідомлення про помилку для невдалої команди (або перенаправляють її на нуль та обробляють її іншими способами) та продовжують.

Щоб обійти це, додайте set +eдо верхнього сценарію оболонки.

Оскільки ви говорите, що ваш сценарій робить все, що належить зробити, швидше за все, команда, що не відповідає, знаходиться десь у кінці сценарію. Може, остаточне відлуння? Або копіювати артефакти десь? Не бачивши повного виходу консолі, ми просто здогадуємось.

Будь ласка, опублікуйте вихідний консольний запуск завдання, бажано, і сам сценарій оболонки, і тоді ми могли б точно сказати, яка строка не відповідає.


6
Причина, по якій я все ще використовую Дженкінса, мені незрозуміла ... Схоже, хтось на вершині не зовсім зрозумів, що у нас вже є цей сценарій, і наполягав, щоб ми використовували Дженкінса. Я відчуваю, що перебуваю в смузі Ділберта. Дякую за пораду -e. Це вирішило проблему
тестер

45
Є ще вагомі причини використовувати Дженкінс: слід аудиту, видимість статусу і т. Д. Якщо у вас вже є сценарій збірки, переміщення його до Дженкінса - це хороший перший крок перед тим, як переробляти його, щоб скористатися можливостями Дженкінса.
aehlke

3
Перехресне посилання цього сервера відповідей defaultfault.com/a/143576/186454 set + e та set -e можна вказати в будь-якому місці вашого сценарію. Будь-який код між ними не зірве збірку, якщо повернене значення не 0.
Олексій Скрипник

2
дуже добре сказано на скрипті оболонки vs jenkins set
pushya

ми використовуємо jenkins для надання автентифікованого доступу та інтерфейсу користувача для роботи. Крон не вирізав би його. Дженкінс не просто виконує крипти.
ffghfgh

90

Проста і коротка відповідь на ваше запитання:

Будь ласка, додайте наступний рядок у крок збирання "Виконати оболонку".

#!/bin/sh

Тепер дозвольте пояснити вам причину, чому нам потрібен цей рядок для завдання збірки "Виконати оболонку".

За замовчуванням Дженкінс приймає, /bin/sh -xeі це означає, що -xбуде надруковано кожну -eкоманду.

Таким чином, додаючи #!/bin/shволю, ви зможете виконувати без варіантів.


4
Отримано. Не знав про -xe за замовчуванням. Коли мій греп-комман не знайшов рядок, весь мій сценарій не вдався, тому що grep повернув не 0 значення повернення :)
Somaiah Kumbera

Працювали чудово! Використовуючи його на моїх неважливих кроках, кроці очищення, які просто роблять щось на кшталт, find . -name 'bower_components' -exec rm {} \;а в деяких випадках, він не вдається. Дякую!
Йорч

це очистило все - "І інший варіант -e, який змушує оболонку припиняти виконання сценарію негайно, коли будь-яка команда закінчується з ненульовим (коли будь-яка команда не працює) кодом виходу."
Paramvir Singh Karwal

3

На мою думку, вимкнення -eопції для вашої оболонки - це дійсно погана ідея. Врешті-решт одна з команд у вашому скрипті вийде з ладу через перехідні умови, наприклад, відсутність дискового простору або помилки мережі. Без -eДженкінса не помітить і продовжуватиметься щасливо. Якщо у вас є Дженкінс, налаштований на розгортання, це може призвести до поганого коду та натиску на ваш сайт.

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

Якщо вам потрібно використовувати цей вихідний код, ви можете або підключити команду до свого оператора if:

grep foo bar; if [ $? == 0 ]; then ...    -->   if grep foo bar; then ...

Або ви можете захопити код повернення у своєму ||пункті:

grep foo bar || ret=$?

1
Спасибі Брайан Ти врятував мені день. Крім того, я вважаю, що добре ввімкнути і -x, і -e. Так що ви бачите у своєму журналі про дженкіни.
Бікал Баснет

2

Простий і простий:

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

Чому саме це трапляється, залежить від сценарію складання.

Я написав щось подібне з іншої точки зору, але, можливо, це допоможе прочитати це все одно: Чому Дженкінс вважає, що моя збірка вдалася?


0

Таким чином, додаючи #!/bin/shволю, ви зможете виконувати без варіантів.

Це також допомогло мені виправити проблему, коли я виконував скрипт bash від майстра Дженкінса на моєму рабі Linux. Просто додавши #!/bin/bashвище мого фактичного сценарію в блоці "Execute Shell", він вирішив мою проблему, оскільки в іншому випадку він виконував Windows git, надаючи версію bash shell, що давала помилку.


0

В версії Дженкінса. 1.635, неможливо показати змінну нативного середовища на зразок цієї:

$BUILD_NUMBER or ${BUILD_NUMBER}

У цьому випадку ви повинні встановити його в іншій змінній.

set BUILDNO = $BUILD_NUMBER
$BUILDNO
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.