Как пометить сборки Jenkins как SUCCESS только на определенных значениях выхода из ошибки (кроме 0)?
Когда я запускаю Execute shell
шаг сборки для выполнения скрипта и этот скрипт возвращает 0
, Jenkins
помечает сборку как SUCCESS
в противном случае он помечается как FAILURE
что является ожидаемым поведением по умолчанию как 0
означает отсутствие ошибок, а любое другое значение представляет ошибку.
Есть ли способ пометить сборку как SUCCESS
только если возвращаемое значение соответствует определенному значению, отличному от 0
(например 1
, 2
, 3
...)?
PS: в случае, если вам интересно, зачем я это ищу, это позволит мне выполнить модульное тестирование самого Jenkins, так как мои сценарии написаны так, чтобы возвращать различные значения выхода в зависимости от различных факторов, что позволяет мне ожидать определенных значений в зависимости от на некоторых ошибках установки и на том, чтобы убедиться, что вся моя интеграция с Jenkins обнаружит их.
6 ответов
Хорошо, я продолжал IRC #jenkins
и никто не знает о плагине для установки определенного статуса работы в зависимости от конкретного кода выхода:(Мне удалось сделать то, что я хотел, создав Execute shell
шаг со следующим содержанием:
bash -c "/path/to/myscript.sh; if [ "\$?" == "$EXPECTED_EXIT_CODE" ]; then exit 0; else exit 1; fi"
- Запуск сценария под bash -c
позволяет поймать код выхода и предотвращает Jenkins
от остановки выполнения сборки, когда этот код завершения отличается от 0 (что обычно происходит).
-\$?
интерпретируется как $?
после выполнения скрипта и представляет его код выхода.
-$EXPECTED_EXIT_CODE
это один из параметров моей работы, который определяет код выхода, который я ожидаю.
-The if
оператор просто делает следующее: если я получу ожидаемый код выхода, выйдите с 0, чтобы сборка была помечена как SUCCESS
иначе выйдите с 1, чтобы сборка была помечена как FAILURE
,
/path/to/myscript.sh || if [ "$?" == "$EXPECTED_EXIT_CODE" ]; then continue; else exit 1; fi
Я бы использовал продолжить вместо выхода 0, если у вас есть другие пункты ниже, через которые вам нужно пройти.
Может справиться с этим через плагин Text-finder:
- Пусть ваш скрипт напечатает код выхода, с которым он собирается выйти, например:
Failed on XXX - Exiting with RC 2
- Используйте плагин Text-finder, чтобы перехватить это сообщение об ошибке и пометить сборку как "Failed" или "Unstable",
Например, если вы решили, что RC 2, 3 и 4 должны пометить сборку как "Нестабильная", найдите текст в этом шаблоне:Exiting with RC [2-4]
,
Создайте оболочку для вашего скрипта оболочки. Попросите эту обертку выполнить ваши тесты, а затем установите значение повторного запуска в соответствии с любыми критериями.
Я делаю это так:
set +e
./myscript.sh
rc="$?"
set -e
if [ "$rc" == "$EXPECTED_CODE_1" ]; then
#...actions 1 (if required)
exit 0
elif [ "$rc" == "$EXPECTED_CODE_2" ]; then
#...actions 2 (if required)
exit 0
else
#...actions else (if required)
exit "$rc"
fi
echo "End of script" #Should never happen, just to indicate there's nothing further
Вот +e
заключается в том, чтобы избежать поведения по умолчанию Jenkins, чтобы сообщить о сбое при любом чихании во время выполнения скрипта. Тогда вернись с -e
,
Так что вы можете обрабатывать свой код выхода соответствующим образом, иначе в конечном итоге FAIL с возвращенным кодом.
robocopy "srcDir" "destDir" /"copyOption" if %ERRORLEVEL% LEQ 2 exit 0
Если код выхода robocopy меньше или равен 2, он успешно завершится.
Коды выхода Robocopy:
0×00 0 No errors occurred, and no copying was done.
The source and destination directory trees are completely synchronized.
0×01 1 One or more files were copied successfully (that is, new files have arrived).
0×02 2 Some Extra files or directories were detected. No files were copied
Examine the output log for details.
0×04 4 Some Mismatched files or directories were detected.
Examine the output log. Housekeeping might be required.
0×08 8 Some files or directories could not be copied
(copy errors occurred and the retry limit was exceeded).
Check these errors further.
0×10 16 Serious error. Robocopy did not copy any files.
Either a usage error or an error due to insufficient access privileges
on the source or destination directories.