не подведите Дженкинс построить, если выполнить оболочку не удается



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

512   11  

11 ответов:

остановить дальнейшее выполнение, когда команда не удается:

command || exit 0

продолжить выполнение, когда команда не удается:

command || true

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

так что я думаю, что произошло в вашем случае-это выход команды git с 1, и из-за значения по умолчанию -e param, оболочка берет код выхода не 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

    Ничего не найдено.