Захватить код выхода из команды и вернуть его позже - PullRequest
0 голосов
/ 29 января 2020

Мы используем инструмент CI для запуска автоматических тестов наших PHP проектов.

В рамках этого процесса мы sh сообщаем результаты тестов CI нашему внутреннему инструменту панели инструментов.

Инструмент CI, который мы используем, позволяет нам предоставлять bash скрипты для выполнения. По умолчанию они выполняются с добавлением set -e к сценарию.

Что я пытаюсь сделать, так это запустить наш набор тестов (PHPUnit), захватить код выхода, сделать вызов API нашего встроенный инструмент панели инструментов (если по какой-либо причине этот вызов завершится неудачно, я не хочу, чтобы он использовал код выхода, отличный от 0, так как я хочу, чтобы он «всегда выполнялся успешно» (таким образом, если он не будет выполнен, это не приведет к сбою сборки) Затем я хочу завершить работу с исходным кодом выхода PHPUnit, чтобы в случае сбоя какого-либо из тестов наша сборка не удалась.

В настоящее время мой скрипт выглядит следующим образом:

# To reverse the `set -e` prepended by the CI tool
set +e

# Run the test suite and capture the exit code
phpunit --coverage-xml coverage || phpunitexitcode=$? && exit 0

# Send the data I want to our internal dashboard tool and have it always return exit 0
author=$(cat ~/.ci-dashboard-env | grep AUTHOR | cut -d'=' -f2)
start=$(cat ~/.ci-dashboard-env | grep CHIPPER_BUILD_START | cut -d'=' -f2)
duration=$(($(date '+%s') - $start))

curl -X POST -s -o /dev/null -w "CI Dashboard Response: %{http_code}" \
    -F "project=hub" \
    -F "author=${author}" \
    -F "build_time=${duration}" \
    -F "phpunit_output=@coverage/index.xml" \
    -F "branch=${CI_COMMIT_BRANCH}" \
    https://dashboard.example.com/api/build || exit 0

# Exit with the original PHPUnit exit code so that if the tests failed then the CI tool fails
exit $phpunitexitcode

При выполнении этого Похоже, что в случае сбоя набора тестов внутренний API-интерфейс панели управления не обращается ни к какому выводу, поскольку выходные данные запускаемого скрипта ничего не показывают только в комплекте PHPUnit и не включают в себя выходные данные запроса curl.

Куда я иду не так?

Ответы [ 2 ]

1 голос
/ 29 января 2020

Похоже, что строка выполнения вашего набора тестов всегда останавливает ваш скрипт и возвращает 0, если phpunit завершается неудачно и возвращает код завершения 0.

Вероятно, что phpunitexitcode возвращает 0. Вы уже проверили вывод phpunitexitcode в состоянии сбоя?

|| указывает, успешна ли предыдущая команда, чтобы никогда не выполнять последнюю команду. Так что, если это не удастся, он выполнит последнюю команду, которая предназначена для захвата кода завершения phpunit, и если он равен 0, чтобы выйти и вернуть 0 против, если это <0>, он возобновляет работу сценария.

0 голосов
/ 29 января 2020

Как сказал Мехафла sh, эта строка phpunit --coverage-xml coverage || phpunitexitcode=$? && exit 0 неверна

Посмотрите на этот пример

$ ls file || echo fail && echo ok
ls: cannot access 'file': No such file or directory
fail
ok

Обе части выполнены, так что если вы используете этот синтаксис || , && вы должны установить && first

$ ls file && echo ok || echo fail
ls: cannot access 'file': No such file or directory
fail
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...