не виходять з ладу побудувати jenkins, якщо не вдалося виконати оболонку


132

Як частина мого процесу збирання, я виконую git комісію як етап оболонки Execute. Однак, якщо в робочій області немає змін, Дженкінс не працює в збірці. Це пов’язано з тим, що git повертає код помилки, коли немає змін для здійснення. Я хотів би або перервати збірку, або просто позначити її як нестабільну, якщо це так. Будь-які ідеї?


Перевірте, чи є що-небудь зробити, і виконувати лише в тих випадках? stackoverflow.com/questions/5139290/…
Anders Lindahl

Відповіді:


210

Щоб зупинити подальше виконання, коли команда не працює:

command || exit 0

Щоб продовжити виконання, коли команда не працює:

command || true


12
У || exit 0першому випадку вам не знадобиться , якщо commandповернення помилково, виконання буде зупинено. Однак, другий варіант дуже корисний!
Нір Альфасі

20
@alfasin Ви не розумієте проблеми. ОП не хоче, щоб конструкція Дженкінса провалилася; Ерго ми повинні, exit 0тому що будь-який ненульовий код виходу зірве збірку.
Запитання щодо кволонеля

1
Я бачу, що в такому випадку я змінив би формулювання з: "Щоб зупинити подальше виконання, коли команда не працює:" на: "Зупинити подальше виконання, коли команда не працює, і позначити роботу Дженкінса як успішну:".
Нір Альфасі

1
@alfasin Хоча я погоджуюсь, що смішне зауваження Quolonel Questions було непрофесійним, він мав рацію в тому, що сказав. "вихід 0" НЕ позначає роботу успішною. Це просто позначить поточний крок збирання успішним. Завдання все ще може провалитися на одному з наступних етапів збирання.
noamik

1
Спасибі це спрацювало! Це особливо корисно для плагіну "Виконати оболонку на віддаленому хості за допомогою ssh", оскільки ви не можете використовувати / bin / bash + e, щоб не помилитися з помилкою. Мені також подобається ідея, яку я вибираю, які команди не провалюють збірку.
leeman24

80

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

Тому я думаю, що у вашому випадку вийшло вихід команди git з 1, і через параметр за замовчуванням -eоболонка підбирає код виходу не 0, ігнорує решту сценарію та відзначає крок як провал. Ми можемо підтвердити це, якщо ви можете опублікувати свій сценарій кроку збирання тут.

Якщо це так, ви можете спробувати поставити #!/bin/shтак, щоб сценарій виконувався без опції; або зробіть щось set +eабо щось подібне поверх кроку збирання, щоб змінити таку поведінку.


Відредаговано. Ще одна річ, яку слід зазначити, що якщо остання команда у вашому скрипті оболонки повертає код , який не стосується 0 , то весь крок збирання все одно буде позначений як невдалий навіть при цій установці. У цьому випадку ви можете просто поставити echoкоманду в кінці, щоб уникнути цього.

Ще одне пов'язане питання


41

Якщо нічого не натискати, git повертає статус виходу 1. Виконати крок побудови оболонки позначається відповідно як невдало. Ви можете використовувати операцію OR || (подвійна труба).

git commit -m 'some messasge' || echo 'Commit failed. There is probably nothing to commit.'

Це означає, що виконайте другий аргумент, якщо перший не вдався (повернуто статус виходу> 0). Друга команда завжди повертає 0. Коли нічого не натискати (статус виходу 1 -> виконувати другу команду) echo поверне 0 і крок збирання продовжується.

Щоб позначити збірку як нестабільну, ви можете скористатися кроком після збирання тексту Jenkins Text Finder. Він може пройти через консольний вихід, узор відповідності (ваше відлуння) та позначити побудову як нестабільну.


27

Є ще один гладкий спосіб сказати Дженкінсу не зазнати невдач. Ви можете ізолювати свої зобов’язання на етапі збирання та встановити оболонку на невдачу:

set +e
git commit -m "Bla."
set -e

2
Не забудьте додати set -eпісля команди, яку потрібно запустити незалежно від коду виходу. В іншому випадку ви можете закінчити виконання команд, яких не збираєтесь. Я хотів вирішити помилку сам, тому зробив щось на кшталт: `set + e commit -m" bla "EXIT_CODE =" $ {?} "Set -e #
обработка логики кода выхода`

8

Успіх / невдача кроку Дженкінс визначає зворотне значення кроку. У випадку з оболонкою це має бути повернення останнього значення. Як оболонки Windows CMD, так і (POSIX) Bash, ви повинні мати можливість встановити повернене значення вручну, використовуючи exit 0як останню команду.


це, здається, не працює для "виконання bat bat", який має 2 рядки: git commit -m "message" exit 0
Бен

@Ben я використовую exit 0"виконувати пакетну команду Windows" у декількох складах на моїй установці Windows Jenkins, і вона працює як очікувалося. Потрібно щось ще робити. Чи можете ви розмістити відповідну частину журналу консолі?
jwernerny

ти використовуєш це з git commit -m "blah" на своєму першому кроці? Я спробував створити сценарій bat на машині вручну, і після команди git поставив ехо та вихід 0. Жодна з інших команд не виконується, коли немає чого робити ...
Бен

Дивіться відповідь від @xiawei. Поведінка Дженкінса за замовчуванням - це виконувати оболонку, за допомогою #!/bin/sh -xvякої сценарій зупиняється, якщо виникає помилка.
Стівен Легко забавлявся

8

Мені вдалося це зробити, використовуючи відповідь, знайдений тут:

Як git нічого не робить без помилки?

git diff --quiet --exit-code --cached || git commit -m 'bla'

1
Згадане вище: "Зробіть git diffкоманду, і якщо це не вдасться, виконайте git commitкоманду. В основному, вона виконує лише фіксацію, якщо git diffзнайдено щось для здійснення". Однак @jwernerny відповідь була правильною, що ви повинні бути в змозі додати exit 0як останнє твердження будь-який сценарій, щоб змусити Дженкінса трактувати це як успіх. Я можу придумати один сценарій, коли це не вдалося б, якщо ви робили крок оболонки Linux, але в Партії це завжди має працювати.
Слав.

@Ben Jenkins виконує етапи побудови оболонки, використовуючи /bin/sh -xeза замовчуванням, як зазначено тут (в середині). Таким чином, ви можете спробувати поставити #!/bin/bashабо виконати set +eповерх кроку збирання, щоб змінити таку поведінку, яка буде продовжувати решту кроків навіть однією командою всередині виходу з кодом не 0
Xiawei Zhang

8

Що стосується (більш загального) питання, зазначеного в заголовку - щоб уникнути невдачі Дженкінса, ви можете запобігти перегляду вихідного коду 1. Приклад для ping:

bash -c "ping 1.2.3.9999 -c 1; exit 0"

А тепер ви можете, наприклад, отримати вихід ping:

output=`bash -c "ping 1.2.3.9999 -c 1; exit 0"`

Звичайно, замість ping ...вас можна використовувати будь-які команди - в тому числі git commit.



6

Ви можете використовувати плагін Text-Finder . Це дозволить вам перевірити консоль виводу на предмет вибору, а потім позначити збірку як Unstable.


це виглядало багатообіцяючим, але чомусь це не вдавалося збігати.
Бен

4

Для декількох команд оболонки я ігнорую збої, додаючи:

set +e commands true

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


Я перешкоджаю невдачі -е взагалі. Якщо ви хочете проігнорувати певну віддачу певної команди, ви можете додати "|| true" або щось більш значуще, що повертає істину, наприклад: stop-service.sh || Служба ехо вже
Рауль Салінас-Монтеагудо

3

Якщо ви введете ці команди в блок оболонки:

false
true

ваша збірка буде позначена як помилка (принаймні 1 ненульовий код виходу), тому ви можете додати (встановити + e), щоб ігнорувати її:

set +e
false
true

не підведе. Однак це не вдасться навіть у випадку (set + e):

set +e
false

тому що остання команда оболонки повинна вийти з 0.


2

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

hg id | grep "+" || exit 0
hg commit -m "scheduled commit"

0

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

не забудьте розділити свої команди за допомогою наступного правила :

command1 && command2 - означає, що команда2 буде виконана, лише якщо команда1 буде успішною

команда1 ; command2 - означає, що команда 2 буде виконана, незважаючи на результат команди1

наприклад:

String run_tests = sh(script: "set +e && cd ~/development/tests/ && gmake test ;set -e;echo 0 ", returnStdout: true).trim()
println run_tests 

буде успішно виконана з set -eі echo 0команди , якщо gmake testне вдалося (тести не вдалося), а наступний код відрізала:

String run_tests = sh(script: "set +e && cd ~/development/tests/ && gmake test && set -e && echo 0 ", returnStdout: true).trim()
println run_tests 

трохи неправильно, і команди set -eта echo 0in && gmake test && set -e && echo 0будуть пропущені, з println run_testsтвердженням, тому що не gmake testвдасться перестати будувати джинкіни. Як вирішення проблеми ви можете перейти до returnStatus:true, але тоді ви пропустите вихід із своєї команди.


0

Ця відповідь правильна, але вона не вказує || exit 0або не || trueвходить до команди оболонки . Ось більш повний приклад:

sh "adb uninstall com.example.app || true"

Зазначене буде спрацьовувати, але наступне не вдасться:

sh "adb uninstall com.example.app" || true

Можливо, це очевидно для інших, але я витратив багато часу, перш ніж це зрозумів.

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