Подтвердить что ты не робот

Не скомпрометировать сборник jenkins, если выполнить shell не удается

Как часть моего процесса сборки, я запускаю git commit в качестве шага оболочки выполнения. Однако, если в рабочей области нет изменений, Jenkins не выполняет сборку. Это связано с тем, что git возвращает код ошибки, когда нет изменений в commit. Я хотел бы либо прервать сборку, либо просто отметить ее как неустойчивую, если это так. Любые идеи?

4b9b3361

Ответ 2

Чтобы прекратить дальнейшее выполнение при сбое команды:

command || exit 0

Чтобы продолжить выполнение, когда команда завершилась неудачей:

command || true

Ответ 3

Jenkins выполняет шаги сборки оболочки, используя /bin/sh -xe по умолчанию. -x означает печать каждой выполненной команды. -e означает выход с ошибкой, если какая-либо из команд в script не удалась.

Итак, я думаю, что в вашем случае было то, что вы завершили команду git с 1, и из-за параметра -e по умолчанию оболочка получает код выхода, отличный от 0, игнорирует остальную часть script и отмечает этот шаг как неудачу. Мы можем подтвердить это, если вы можете опубликовать свой шаг сборки script здесь.

В этом случае вы можете попробовать поставить #!/bin/sh так, чтобы script выполнялся без опции; или выполните set +e или что-нибудь подобное сверху шага сборки, чтобы переопределить это поведение.


Отредактировано: Еще одна вещь, которую следует отметить, заключается в том, что если последняя команда в вашей оболочке script возвращает не-0 код, весь шаг сборки будет по-прежнему отмечен как неудачу даже с этой установкой. В этом случае вы можете просто положить команду echo в конце, чтобы избежать этого.

Другой связанный вопрос

Ответ 4

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

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

Это означает, что выполнить второй аргумент, если первый сбой (возвращен статус завершения > 0). Вторая команда всегда возвращает 0. Если ничего не нажать (выйти из состояния 1 → выполнить вторую команду), эхо будет возвращать 0, а шаг сборки будет продолжаться.

Чтобы отметить сборку как нестабильную, вы можете использовать пост-сборку Jenkins Text Finder. Он может проходить через консольный вывод, шаблон соответствия (ваш эхо) и создавать метки как неустойчивые.

Ответ 5

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

Ответ 6

В (более общем) вопросе в заголовке - для предотвращения отказа Дженкинса вы можете помешать ему увидеть код выхода 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.

Ответ 7

Вы можете использовать плагин для поиска текста. Это позволит вам проверить выходную консоль для выражения по вашему выбору, а затем пометить сборку как Unstable.

Ответ 8

Существует еще один плавный способ сказать Дженкинсу не потерпеть неудачу. Вы можете изолировать фиксацию на этапе сборки и не запускать оболочку:

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

Ответ 9

Следующие действия для mercurial выполняются только при наличии изменений. Таким образом, сборка завершается с ошибкой, если коммит не выполняется.

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

Ответ 10

Если вы поместите эти команды в оболочку:

false
true

ваша сборка будет отмечена как сбой (по крайней мере 1 ненулевой код выхода), поэтому вы можете добавить (set + e), чтобы игнорировать ее:

set +e
false
true

не подведет. Однако это не сработает даже с (set + e) ​​на месте:

set +e
false

потому что последняя команда оболочки должна выйти с 0.