Подтвердить что ты не робот

Как обнаружить ошибку сборки из ant/maven через bash script?

Я пишу сценарий bash для автоматизации процесса сборки. Есть два основных блока сборки, один из них - задача муравья, а второй - простая старая mvn clean install. Я хочу сделать что-то, когда есть ошибка сборки, происходящая из любого из этих двух процессов сборки.

Проблема в том, что эти сборки будут время от времени содержать тестовые сбои или ошибки, но конечный результат успешен. И я считаю, что код состояния ($?), Возвращаемый этими процессами, должен быть равен 0, независимо от того, удастся ли выполнить сборку или удастся, я могу ошибаться.

Итак, каков наилучший способ для моего сценария обнаружить конечный результат (сборка не удалась/удалась), не получая ложную информацию во время промежуточной сборки (тестовые ошибки и т.д.) От них?

4b9b3361

Ответ 1

mvn clean test
if [[ "$?" -ne 0 ]] ; then
  echo 'could not perform tests'; exit $rc
fi
  • $? это специальная переменная оболочки, которая содержит код завершения (независимо от того, успешно он завершен или нет) самой последней из недавно выполненных команд.
  • -ne означает "не равный". Итак, здесь мы тестируем, если код выхода из mvn clean не равен нулю.

Ответ 2

Существует несколько проблем с Maven 2, возвращающих неверные коды возврата (т.е. всегда возвращающие 0). В частности, MNG-3651, который был исправлен в Maven 2.0.9.

В более старых версиях mvn.bat закончил эту строку:

exit /B %ERROR_CODE%

Из Maven 2.0.9 и далее последняя строка была изменена на:

cmd /C exit /B %ERROR_CODE%

Таким образом возвращается код возврата не-0, если сборка завершилась неудачей. В случае построения ERROR код возврата равен 1. Если вы не можете выполнить обновление до 2.0.9+, вы можете рассмотреть возможность изменения mvn.bat, как указано выше, для возврата правильного кода.

Ответ 3

В соответствии с Ant manual:

сценарии запуска ant (в их версиях Windows и Unix) возвращают код возврата java-программы. Таким образом, успешная сборка возвращает 0, неудачные сборки возвращают другие значения.

Maven также возвращает ненулевой код выхода при ошибке. Здесь ссылка, показывающая, как опросить этот статус, используя API-интерфейс Maven Invocation.

Итак, мне кажется, что вы должны иметь возможность явно обрабатывать коды возврата в script , Предположительно, вы можете игнорировать коды ошибок, относящиеся к тестам и т.д., Если это вас не касается.

exec коды ошибок в ant зависят от операционной системы. Это может помочь вам:

Ответ 4

Вот что я делаю, чтобы получить желаемый результат.

    <exec executable="${env.M2_HOME}/bin/mvn" dir="${basedir}"
          failonerror="true" osfamily="unix">
        <arg value="-DskipTests=${argSkipTests}"/>
        <arg value="-Doffline=${argOffline}"/>
        <arg line="${projectsLine}"/>
        <arg line="${resumeFromLine}"/>
        <arg line="${alsoMakeLine}"/>
        <arg line="${alsoMakeDependentsLine}"/>
        <arg line="${commandsLine}"/>
    </exec>

Ответ 5

Правильное решение для Unix/Linux:

mvn clean install
rc=$?
if [ $rc -ne 0 ] ; then
  echo Could not perform mvn clean install, exit code [$rc]; exit $rc
fi

Сам оператор "if" является командой, и если он успешен, он сбрасывает $? переменная к 0. То же самое относится к эхо. Таким образом, вы должны использовать промежуточную локальную переменную, например, $ rc, чтобы сохранить код возврата из "mvn clean install", затем он также может быть передан команде "exit".

Ответ 6

В bash есть встроенная команда, которая выполняет именно это.

# exit when any command fails
set -e

Я поместил это в начало моих скриптов bash, которые я скопировал с этого превосходного ресурса.

# keep track of the last executed command
trap 'last_command=$current_command; current_command=$BASH_COMMAND' DEBUG

# echo an error message before exiting
trap 'echo "\"${last_command}\" command filed with exit code $?."' EXIT