не подведите Дженкинс построить, если выполнить оболочку не удается
в рамках моего процесса сборки я запускаю git commit как шаг execute shell. Однако, если в рабочей области нет изменений, Дженкинс не выполняет сборку. Это связано с тем, что git возвращает код ошибки, когда нет никаких изменений для фиксации. Я хотел бы либо прервать сборку, либо просто отметить ее как нестабильную, если это так. Есть идеи?
11 ответов:
остановить дальнейшее выполнение, когда команда не удается:
command || exit 0продолжить выполнение, когда команда не удается:
command || true
Дженкинс выполняет шаги сборки оболочки с помощью
/bin/sh -xeпо умолчанию.-xозначает печать каждой выполненной команды.-eозначает выход с ошибкой, если какая-либо из команд в скрипте не удалась.так что я думаю, что произошло в вашем случае-это выход команды git с 1, и из-за значения по умолчанию
-eparam, оболочка берет код выхода не 0, игнорирует остальную часть скрипта и отмечает шаг как сбой. Мы можем подтвердить это, если вы можете опубликовать свой сценарий шага сборки здесь.если это так, вы можете попробовать поставить
#!/bin/shтак что скрипт будет выполняться без варианта; илиset +eили что-нибудь подобное на этапе сборки, чтобы переопределить это поведение.
редактировать: еще одна вещь, чтобы отметить, что если последняя команда в командной строке скрипт возвращает не 0 код, весь шаг сборки по-прежнему будет помечен как сбой даже с этой настройкой. В этом случае, вы можете просто поставить
echoкоманда в конце, чтобы избежать этого.
если нет ничего, чтобы нажать git возвращает статус выхода 1. Выполнить построение оболочки шаг отмечен как ошибочный, соответственно. Вы можете использовать или заявление | / (двойная труба).
git commit -m 'some messasge' || echo 'Commit failed. There is probably nothing to commit.'это означает, что выполнить второй аргумент, если первый не удалось (возвращенный статус выхода > 0). Вторая команда всегда возвращает 0. Когда нет ничего, чтобы нажать (состояние выхода 1 -> выполнить вторую команду) Эхо вернет 0 и шаг сборки продолжается.
чтобы отметить сборку как нестабильную, вы можете использовать шаг после сборки Дженкинс Текстовый Искатель. Он может проходить через консольный выход, соответствовать шаблону (ваше эхо) и отмечать сборку как нестабильную.
есть еще один гладкий способ сказать Дженкинсу, чтобы он не потерпел неудачу. Вы можете изолировать фиксацию на шаге сборки и установить оболочку, чтобы не потерпеть неудачу:
set +e git commit -m "Bla." set -e
Дженкинс определяет успех / неудачу шага по возвращаемому значению шага. Для случая оболочки это должно быть возвращение последнего значения. Для оболочек Windows CMD и (POSIX) Bash вы должны иметь возможность установить возвращаемое значение вручную с помощью
exit 0как последняя команда.
я смог получить эту работу, используя ответ, найденный здесь:
как git ничего не совершает без ошибки?
git diff --quiet --exit-code --cached || git commit -m 'bla'
на (более общий) вопрос в заголовке-чтобы предотвратить Дженкинс от сбоя вы можете предотвратить его от просмотра кода выхода 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.
можно использовать плагин для поиска текста. Это позволит вам проверить консоль вывода для выражения по вашему выбору, а затем пометить сборку как
Unstable.
Если вы поместите эти команды в блок оболочки:
false trueваша сборка будет отмечена как fail (по крайней мере, 1 ненулевой код выхода), поэтому вы можете добавить (set +e), чтобы игнорировать его:
set +e false trueне будет выполнена. Однако это не удастся даже с (set +e) на месте:
set +e falseпотому что последняя команда оболочки должна выйти с 0.
следующие работы для mercurial только фиксируя, если есть изменения. Таким образом, сборка завершается неудачей только в случае сбоя фиксации.
hg id | grep "+" || exit 0 hg commit -m "scheduled commit"
https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#sh-shell-script
Если вы включаете свойство returnStatus: true, то возврат оболочки игнорируется.
Comments