1

我有这个命令:

coverage report | tee >(grep TOTAL | awk '{exit (int($4) >= 75)?0:1}') && (exit ${PIPESTATUS[0]})

它报告代码覆盖率,然后将输出打印到stdout并将相同的输出重定向到 grep + awk,它基本上检查代码覆盖率是少于还是多于75. 最后,exit在子shell 中有一个,我假装在我的 CI/CD 管道中使用它。

问题是我的 CI/CD 总是成功完成,这不应该发生,因为在我的测试中代码覆盖率低于 75%。这意味着它PIEPSTATUS没有返回我期望它返回的内容(awk 的exit代码)。

问题出在哪里?我究竟做错了什么?

4

1 回答 1

6

退出状态

command | tee >(...)

将是退出状态,不管进程替换tee里面发生了什么。这就是您的代码无法正常工作的原因。 >(...)

您无需使用流程替换即可实现目标,如下所示:

coverage report | awk '{print} /TOTAL/ { pcnt=$4 } END {exit (int(pcnt) >= 75) ? 0 : 1}')
  • {print}打印所有行
  • /TOTAL/ ...获取百分比并将其保存在pcnt
  • END ...退出代码基于pcnt

这不仅会打印由 发出的所有行coverage report,还会确保管道的退出代码反映覆盖率逻辑。

于 2018-10-24T00:58:22.227 回答