Как пометить сборки 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.
Другие вопросы по тегам