не подведите Дженкинса построить, если выполнить оболочку не удается
В рамках процесса сборки я запускаю git commit в качестве шага execute shell. Однако если в рабочей области нет никаких изменений, то Дженкинс завершает сборку неудачно. Это происходит потому, что git возвращает код ошибки, когда нет никаких изменений для фиксации. Я бы хотел либо прервать сборку, либо просто отметить ее как нестабильную, если это так. Есть идеи?

Ответы - не подведите Дженкинса построить, если выполнить оболочку не удается / don't fail jenkins build if execute shell fails

18.01.2013 01:11:20
Вы можете использовать плагин Text-finder . Это позволит вам проверить консоль вывода для выражения по вашему выбору, а затем отметить сборку как Unstable
.


18.01.2013 06:55:13
Дженкинс определяет успех / неудачу шага по возвращаемому значению шага. В случае оболочки это должно быть возвращение последнего значения. Для оболочек Windows CMD и (POSIX) Bash необходимо вручную задать возвращаемое значение, используя exit 0
в качестве последней команды.


exit 0
с "execute windows batch command" в нескольких сборках на моей установке Windows Jenkins, и это работает, как и ожидалось. Должно быть, происходит что-то еще. Не могли бы вы опубликовать соответствующую часть журнала консоли?


#!/bin/sh -xv
, что приводит к остановке скрипта при обнаружении ошибки.

18.01.2013 10:06:19
Я смог заставить это работать, используя ответ, найденный здесь:
Как git ничего не совершает без ошибки?
git diff --quiet --exit-code --cached || git commit -m 'bla'

git diff
команду git commit. В принципе, он делает коммит только в том случае, если git commit
нашел что-то для коммита. Однако @jwernerny ответил правильно, что вы должны быть в состоянии добавить git diff
в качестве последнего утверждения к любому сценарию, чтобы заставить Дженкинса рассматривать его как успех. Я могу придумать один сценарий, в котором это не сработало бы, если бы вы делали шаг оболочки Linux, но в пакетном режиме это всегда должно работать.

/bin/sh -xe
по умолчанию, как указано здесь (в середине). Так что вы можете попробовать поставить #!/bin/bash
или сделайте set +e
в верхней части шага сборки, чтобы переопределить это поведение, которое будет продолжать остальную часть шага даже одна команда внутри exit с кодом, отличным от 0

05.02.2013 10:18:46
Следующее работает для mercurial только путем фиксации, если есть изменения. Поэтому построить только с ошибкой, если совершить не удается.
hg id | grep "+" || exit 0
hg commit -m "scheduled commit"

17.10.2013 02:37:11
Если нет ничего, чтобы нажать git возвращает статус выхода 1. Выполнить построение оболочки шаг отмечен как ошибочный, соответственно. Вы можете использовать оператор OR | | (double pipe).
git commit -m 'some messasge' || echo 'Commit failed. There is probably nothing to commit.'
Это означает, что выполнить второй аргумент, если первый не удался (возвращенное состояние выхода > 0). Вторая команда всегда возвращает 0. Когда нет ничего, чтобы нажать (состояние выхода 1 - > выполнить вторую команду), echo возвратит 0 и шаг сборки продолжается.
Чтобы отметить сборку как нестабильную, вы можете использовать текстовый поиск Дженкинса после этапа сборки. Он может пройти через консольный вывод, сопоставить шаблон (ваше эхо) и отметить сборку как нестабильную.

20.11.2013 03:05:03
На (более общий) вопрос в заголовке-чтобы предотвратить неудачу Дженкинса, вы можете запретить ему видеть код выхода 1. Пример для пинг:
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
.


set -e
после команды, которую вы хотите выполнить, независимо от кода выхода. В противном случае вы можете закончить выполнение команд, которые вы не собираетесь делать. Я хотел сам справиться с ошибкой, поэтому я сделал что-то вроде: ` set +e commit-m "bla" EXIT_CODE="${?} "set-e # handle exit code logic `

09.09.2014 05:13:11
Чтобы остановить выполнение, когда команда терпит неудачу:
command || exit 0
Продолжить выполнение при сбое команды:
command || true

|| exit 0
в первом случае, если command
возвращает false, выполнение будет остановлено. Тем не менее, второй вариант очень полезен!

exit 0
, потому что любой ненулевой код выхода завершится неудачей сборки.


command || exit 0
- если команда не удалась-это действительно остановит дальнейшее выполнение, но также отметит задание как успешное.





11.02.2015 10:00:50
Дженкинс выполняет шаги сборки оболочки, используя /bin/sh -xe
по умолчанию. -x
означает печатать каждую выполняемую команду. -e
означает выход с ошибкой, если какая-либо из команд в скрипте не удалась.
Поэтому я думаю, что в вашем случае команда git завершается с 1, и из-за параметра default-e
оболочка берет код выхода, отличный от 0, игнорирует остальную часть сценария и помечает шаг как сбой. Мы можем подтвердить это, если вы можете разместить свой сценарий шага сборки здесь.
Если это так, вы можете попробовать поставить #!/bin/sh
, чтобы сценарий выполнялся без опции; или сделайте set +e
или что-нибудь подобное в верхней части шага сборки, чтобы переопределить это поведение.
Отредактировано: еще одна вещь, которую следует отметить, заключается в том , что, если последняя команда в вашем скрипте оболочки возвращает код, отличный от 0, весь шаг сборки все равно будет помечен как fail даже с этой установкой. В этом случае вы можете просто поставить команду echo
в конце, чтобы избежать этого.

30.11.2016 10:35:52
Если вы поместите эти команды в оболочку блока:
false
true
ваша сборка будет помечена как fail (по крайней мере 1 ненулевой код выхода), поэтому вы можете добавить (set +e), чтобы игнорировать его:
set +e
false
true
не подведет. Однако это не удастся даже с (set +e) на месте:
set +e
false
потому что последняя команда оболочки должна завершиться с 0.

04.07.2018 07:17:12
https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#sh-shell-script
если вы включаете свойство returnStatus: true, то возврат оболочки игнорируется.



11.03.2019 03:24:43
Еще один ответ с некоторыми советами, может быть полезным для кого-то:
не забудьте разделить ваши команды следующим правилом:
command1 & & command2-означает, что command2 будет выполняться, только если command1 успешна
command1; command2-означает, что команда 2 будет выполнена несмотря на результат command1
например:
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 0
в&& gmake test && set -e && echo 0
будет пропущен, с println run_tests
заявление, потому что не удалось gmake test
прервет Дженкинс построить. В качестве обходного пути вы можете переключиться на returnStatus:true
, но тогда вы пропустите выходные данные своей команды.