В процессе сборки я запускаю коммит git как шаг оболочки выполнения. Однако, если в рабочей области нет изменений, Jenkins не выполняет сборку. Это потому, что git возвращает код ошибки, когда нет изменений для фиксации. Я бы хотел либо прервать сборку, либо просто отметить ее как нестабильную, если это так. Любые идеи?
132
Ответы:
Чтобы остановить дальнейшее выполнение при сбое команды :
command || exit 0
Чтобы продолжить выполнение при сбое команды :
command || true
источник
|| exit 0
первом случае вам не нужно , еслиcommand
вернет false, выполнение остановится. Тем не менее, второй вариант очень полезен!exit 0
потому что любой ненулевой код выхода приведет к сбою сборки.Jenkins выполняет шаги сборки оболочки, используя
/bin/sh -xe
по умолчанию.-x
означает вывод каждой выполненной команды.-e
означает выход с ошибкой, если какая-либо из команд в сценарии не удалась.Итак, я думаю, что в вашем случае произошло то, что вы вышли из команды git с 1, и из-за параметра по умолчанию
-e
оболочка выбирает код выхода, отличный от 0, игнорирует остальную часть скрипта и отмечает шаг как сбой. Мы можем подтвердить это, если вы разместите здесь свой скрипт этапа сборки.Если это так, вы можете попробовать поставить
#!/bin/sh
так, чтобы сценарий выполнялся без опции; или выполнитеset +e
или что-нибудь подобное поверх этапа сборки, чтобы переопределить это поведение.Отредактировано: еще одна вещь, на которую следует обратить внимание, заключается в том, что если последняя команда в вашем сценарии оболочки возвращает код , отличный от 0 , весь этап сборки по-прежнему будет отмечен как сбой даже при этой настройке. В этом случае вы можете просто поставить
echo
команду в конце, чтобы этого избежать.Другой связанный вопрос
источник
Если нечего нажимать, git возвращает статус выхода 1. Выполнить шаг сборки оболочки, соответственно, помечается как неудачный. Вы можете использовать оператор OR || (двойная труба).
Это означает, что выполнить второй аргумент, если первый не удалось (возвращенный статус выхода> 0). Вторая команда всегда возвращает 0. Когда нечего нажимать (статус выхода 1 -> выполнить вторую команду), echo вернет 0, и этап сборки продолжится.
Чтобы пометить сборку как нестабильную, вы можете использовать шаг после сборки Jenkins Text Finder. Он может выполнять вывод консоли, сопоставлять шаблон (ваше эхо) и отмечать сборку как нестабильную.
источник
Есть еще один простой способ сказать Дженкинсу не терпеть неудач. Вы можете изолировать свой коммит на этапе сборки и настроить оболочку, чтобы она не выходила из строя:
источник
set -e
после команды, которую вы хотите запустить, независимо от кода выхода. В противном случае вы можете выполнить команды, которые не собирались выполнять. Я хотел обработать ошибку сам, поэтому сделал что-то вроде: `set + e commit -m" bla "EXIT_CODE =" $ {?} "Set -e # handle exit codeДженкинс определяет успех / неудачу шага по возвращаемому значению шага. В случае оболочки это должно быть возвращение последнего значения. Для оболочек Windows CMD и (POSIX) Bash вы должны иметь возможность установить возвращаемое значение вручную, используя
exit 0
последнюю команду.источник
exit 0
команду «выполнить пакетную команду Windows» в нескольких сборках в моей установке Windows Jenkins, и она работает должным образом. Что-то еще должно происходить. Не могли бы вы опубликовать соответствующую часть журнала консоли?#!/bin/sh -xv
результате которой сценарий останавливается при обнаружении какой-либо ошибки.Я смог заставить это работать, используя ответ, найденный здесь:
Как git ничего не зафиксировать без ошибки?
источник
git diff
команду, а если она не удалась, выполнитеgit commit
команду. В основном, она выполняет фиксацию только в том случае, еслиgit diff
найдено что-то для фиксации. Однако ответ @jwernerny был правильным, и вы можете добавить егоexit 0
в качестве последнего оператора. к любому сценарию, чтобы Дженкинс считал это успехом. Я могу придумать один сценарий, в котором это не удалось бы, если бы вы выполняли этап оболочки Linux, но в пакетном режиме это всегда должно работать./bin/sh -xe
по умолчанию, как указано здесь (посередине). Таким образом, вы можете попытаться поставить#!/bin/bash
или выполнитьset +e
поверх этапа сборки, чтобы переопределить это поведение, которое продолжит оставшуюся часть шага, даже если одна команда внутри выхода с кодом,По (более общему) вопросу в заголовке - чтобы предотвратить сбой Jenkins, вы можете запретить ему видеть код выхода 1. Пример для ping:
И теперь вы можете, например, получить вывод ping:
Конечно, вместо
ping ...
Вы можете использовать любую команду (ы), в том числеgit commit
.источник
https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#sh-shell-script
если вы включаете свойство returnStatus: true, то возврат оболочки игнорируется.
источник
Вы можете использовать плагин Text-finder . Это позволит вам проверить консоль вывода на наличие выражения по вашему выбору, а затем пометить сборку как
Unstable
.источник
Для нескольких команд оболочки я игнорирую сбои, добавляя:
set +e commands true
источник
Если вы поместите эти команды в блок оболочки:
ваша сборка будет отмечена как неудачная (по крайней мере, 1 ненулевой код выхода), поэтому вы можете добавить (set + e), чтобы игнорировать ее:
не подведет. Однако это не удастся даже с (set + e) на месте:
потому что последняя команда оболочки должна завершиться с 0.
источник
Следующее работает для mercurial, фиксируя только при наличии изменений. Таким образом, сборка терпит неудачу только при неудачной фиксации.
источник
Еще один ответ с некоторыми советами, может быть кому-то полезен:
не забудьте разделить свои команды следующим правилом :
command1 && command2 - означает, что command2 будет выполнена, только если command1 успешно
command1 ; command2 - означает, что команда 2 будет выполнена несмотря на результат command1
например:
будет успешно выполнена с
set -e
иecho 0
команды , еслиgmake test
не удалось (тесты не удалось), а следующий код отрезала:немного неверно, и команды
set -e
иecho 0
in&& gmake test && set -e && echo 0
будут пропущены вместе сprintln run_tests
оператором, потому что failedgmake test
прервет сборку jenkins. В качестве обходного пути вы можете переключиться наreturnStatus:true
, но тогда вы пропустите вывод своей команды.источник
Это правильный ответ , но он не указывает
|| exit 0
или|| true
входит в команду оболочки . Вот более полный пример:Вышеуказанное будет работать, но следующее не удастся:
Возможно, это очевидно для других, но я потратил много времени, прежде чем понял это.
источник