Получение статуса завершения вложенной команды внутри перенаправления, прикрепленного к тройнику
У меня есть эта команда:
coverage report | tee >(grep TOTAL | awk '{exit (int($4) >= 75)?0:1}') && (exit ${PIPESTATUS[0]})
который сообщает о покрытии кода, а затем печатает вывод stdout
и перенаправляет этот же вывод в grep + awk, который в основном проверяет, покрывает ли покрытие кода меньше или больше, чем 75
, Наконец, есть exit
в подоболочке, которую я притворяюсь использовать в моем конвейере CI/CD.
Проблема в том, что мой CI/CD всегда завершается успешно, что не должно происходить, поскольку охват кода в моих тестах составляет менее 75%. Это означает, что PIEPSTATUS
не возвращает то, что я ожидаю, что он вернется exit
код).
В чем проблема? Что я делаю неправильно?
1 ответ
Выход из статуса
command | tee >(...)
будет статус выхода tee
независимо от того, что происходит внутри процесса подстановки >(...)
, Вот почему ваш код не работает.
Вы можете достичь своей цели без использования процесса подстановки, например так:
coverage report | awk '{print} /TOTAL/ { pcnt=$4 } END {exit (int(pcnt) >= 75) ? 0 : 1}')
{print}
печатает все строки/TOTAL/ ...
захватывает процент и сохраняет его вpcnt
END ...
выходит из кода на основеpcnt
Это не только напечатает все строки, испускаемые coverage report
, он также должен был бы убедиться, что код выхода конвейера отражает логику процента покрытия.