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

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

18.01.2013 08:22:17 Просмотров 26 Источник

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

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/14392349/dont-fail-jenkins-build-if-execute-shell-fails#comment20024774_14392349
Проверить, есть ли что-то, что нужно совершить, и совершать только в этих случаях? stackoverflow.com/questions/5139290/…

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

jphuynh

18.01.2013 01:11:20

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

https://stackoverflow.com/questions/14392349/dont-fail-jenkins-build-if-execute-shell-fails/14395602#comment20041795_14395602
это выглядело многообещающе, но по какой-то причине он продолжал отказывать сборке.
jwernerny

18.01.2013 06:55:13

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

https://stackoverflow.com/questions/14392349/dont-fail-jenkins-build-if-execute-shell-fails/14401494#comment20041274_14401494
это, кажется, не работает для "execute windows bat", который имеет 2 строки: git commit-m "message" exit 0
https://stackoverflow.com/questions/14392349/dont-fail-jenkins-build-if-execute-shell-fails/14401494#comment20042322_14401494
@Ben я использую exit 0с "execute windows batch command" в нескольких сборках на моей установке Windows Jenkins, и это работает, как и ожидалось. Должно быть, происходит что-то еще. Не могли бы вы опубликовать соответствующую часть журнала консоли?
https://stackoverflow.com/questions/14392349/dont-fail-jenkins-build-if-execute-shell-fails/14401494#comment20042645_14401494
вы используете его с git commit-m "blah" в вашем первом шаге? Я попытался создать скрипт bat на машине вручную и поставил echo и exit 0 после команды git. Ни одна из других команд не выполняется, когда нет ничего для фиксации...
https://stackoverflow.com/questions/14392349/dont-fail-jenkins-build-if-execute-shell-fails/14401494#comment69300950_14401494
Смотрите ответ от @xiawei. По умолчанию поведение Дженкинса это выполнить оболочку с #!/bin/sh -xv, что приводит к остановке скрипта при обнаружении ошибки.
Ben

18.01.2013 10:06:19

Я смог заставить это работать, используя ответ, найденный здесь:

Как git ничего не совершает без ошибки?

git diff --quiet --exit-code --cached || git commit -m 'bla'
https://stackoverflow.com/questions/14392349/dont-fail-jenkins-build-if-execute-shell-fails/14404929#comment20109670_14404929
Вот что делается выше: "выполните git diffкоманду git commit. В принципе, он делает коммит только в том случае, если git commitнашел что-то для коммита. Однако @jwernerny ответил правильно, что вы должны быть в состоянии добавить git diffв качестве последнего утверждения к любому сценарию, чтобы заставить Дженкинса рассматривать его как успех. Я могу придумать один сценарий, в котором это не сработало бы, если бы вы делали шаг оболочки Linux, но в пакетном режиме это всегда должно работать.
https://stackoverflow.com/questions/14392349/dont-fail-jenkins-build-if-execute-shell-fails/14404929#comment45224883_14404929
@Ben Jenkins выполняет шаги сборки оболочки, используя /bin/sh -xeпо умолчанию, как указано здесь (в середине). Так что вы можете попробовать поставить #!/bin/bashили сделайте set +eв верхней части шага сборки, чтобы переопределить это поведение, которое будет продолжать остальную часть шага даже одна команда внутри exit с кодом, отличным от 0
Shaun Lebron

05.02.2013 10:18:46

Следующее работает для mercurial только путем фиксации, если есть изменения. Поэтому построить только с ошибкой, если совершить не удается.

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

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 и шаг сборки продолжается.

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

Nux

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.

joecks

04.06.2014 12:58:09

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

set +e
git commit -m "Bla."
set -e
https://stackoverflow.com/questions/14392349/dont-fail-jenkins-build-if-execute-shell-fails/24033071#comment74577208_24033071
Обязательно добавьте set -eпосле команды, которую вы хотите выполнить, независимо от кода выхода. В противном случае вы можете закончить выполнение команд, которые вы не собираетесь делать. Я хотел сам справиться с ошибкой, поэтому я сделал что-то вроде: ` set +e commit-m "bla" EXIT_CODE="${?} "set-e # handle exit code logic `
Является ответом!
Quolonel Questions

09.09.2014 05:13:11

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

command || exit 0

Продолжить выполнение при сбое команды:

command || true

https://stackoverflow.com/questions/14392349/dont-fail-jenkins-build-if-execute-shell-fails/25745593#comment55860747_25745593
Вам не нужен || exit 0в первом случае, если commandвозвращает false, выполнение будет остановлено. Тем не менее, второй вариант очень полезен!
https://stackoverflow.com/questions/14392349/dont-fail-jenkins-build-if-execute-shell-fails/25745593#comment55877510_25745593
@alfasin вы не понимаете, в чем проблема. OP не хочет, чтобы сборка Дженкинса завершилась неудачей; следовательно, мы должны exit 0, потому что любой ненулевой код выхода завершится неудачей сборки.
https://stackoverflow.com/questions/14392349/dont-fail-jenkins-build-if-execute-shell-fails/25745593#comment55941904_25745593
Я вижу, что в этом случае я бы изменил формулировку с: "остановить дальнейшее выполнение, когда команда не выполняется: "на:" остановить дальнейшее выполнение, когда команда не выполняется, и отметить задание Дженкинса как успешное:".
https://stackoverflow.com/questions/14392349/dont-fail-jenkins-build-if-execute-shell-fails/25745593#comment55977746_25745593
Давайте сделаем это профессионально, пожалуйста. Вы написали: "это не помечает задание как успешное" - я не согласен: когда вы выполняете command || exit 0- если команда не удалась-это действительно остановит дальнейшее выполнение, но также отметит задание как успешное.
https://stackoverflow.com/questions/14392349/dont-fail-jenkins-build-if-execute-shell-fails/25745593#comment56110067_25745593
@alfasin хотя я согласен с тем, что куолонель задает резкие вопросы, замечание было непрофессиональным, он был прав в том, что сказал. "выход 0" не будет отмечать успешное выполнение задания. Он просто отметит текущий шаг сборки успешным. Задание все еще может завершиться неудачей на одном из следующих этапов сборки.
https://stackoverflow.com/questions/14392349/dont-fail-jenkins-build-if-execute-shell-fails/25745593#comment56120778_25745593
@noamik ты прав! Я имел дело с заданиями только с одним шагом "execute shell", отсюда и недоразумение. Спасибо за разъяснение!
https://stackoverflow.com/questions/14392349/dont-fail-jenkins-build-if-execute-shell-fails/25745593#comment58934340_25745593
Это самый быстрый и простой способ не допустить, чтобы Дженкинс провалил полную сборку, другими словами, некритический шаг сборки, поэтому у вас есть мой +1. Это действительно очень глупо, что Дженкинс не предлагает эту функциональность по умолчанию. Хорошие дефолты-это одно, а хорошие альтернативы (OOTB) - совсем другое.
https://stackoverflow.com/questions/14392349/dont-fail-jenkins-build-if-execute-shell-fails/25745593#comment71422998_25745593
Спасибо, что это сработало! Это особенно полезно для функции плагина "Execute shell on remote host using ssh", так как вы не можете использовать /bin/bash +e, чтобы не ошибиться при ошибке. Мне также нравится идея, которую я получаю, чтобы выбрать, какие команды не подводят сборку.
Xiawei Zhang

11.02.2015 10:00:50

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

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

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


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

Еще один связанный с этим вопрос

chenchuk

30.11.2016 10:35:52

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

false
true

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

set +e
false
true

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

set +e
false

потому что последняя команда оболочки должна завершиться с 0.

jaxxed

04.07.2018 07:17:12

https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#sh-shell-script

если вы включаете свойство returnStatus: true, то возврат оболочки игнорируется.

Megha

11.03.2019 01:31:54

Для нескольких команд оболочки я игнорирую ошибки, добавляя:

set +e commands true

enter image description here

https://stackoverflow.com/questions/14392349/dont-fail-jenkins-build-if-execute-shell-fails/55099852#comment97028082_55099852
Я вообще не одобряю расстраивание-е. Если вы хотите игнорировать возвращаемое значение какой-то конкретной команды, вы можете добавить "/ / true " или что-то более значимое, возвращающее true, например: stop-service.sh / / служба Эхо была уже отключена
Sysanin

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, но тогда вы пропустите выходные данные своей команды.

Закрыть X