Как часть моего процесса сборки, я запускаю git commit в качестве шага оболочки выполнения. Однако, если в рабочей области нет изменений, Jenkins не выполняет сборку. Это связано с тем, что git возвращает код ошибки, когда нет изменений в commit. Я хотел бы либо прервать сборку, либо просто отметить ее как неустойчивую, если это так. Любые идеи?
Не скомпрометировать сборник jenkins, если выполнить shell не удается
Ответ 1
Мне удалось получить эту работу, используя найденный здесь ответ:
Как git зафиксировать без ошибок?
git diff --quiet --exit-code --cached || git commit -m 'bla'
Ответ 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.