Bash 从命令中捕获退出代码并稍后返回

Bash 从命令中捕获退出代码并稍后返回,bash,phpunit,Bash,Phpunit,我们使用CI工具来运行PHP项目的自动化测试 作为此过程的一部分,我们希望向内部仪表板工具报告CI测试的结果 我们使用的CI工具允许我们提供bash脚本来执行。默认情况下,这些都是在脚本前面加上set-e执行的 我试图做的是运行我们的测试套件(PHPUnit),捕获退出代码,调用内部仪表板工具的API(如果此调用因任何原因失败,我不希望它使用非0退出代码,因为我希望它“始终成功”(这样,如果失败,不会导致构建失败),然后我想使用原始PHPUnit退出代码退出,这样,如果任何测试失败,那么我们的构

我们使用CI工具来运行PHP项目的自动化测试

作为此过程的一部分,我们希望向内部仪表板工具报告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请求的输出


我哪里出错了?

看起来,如果phpunit失败并返回退出代码0,测试套件执行行将始终停止脚本并返回0

可能发生的情况是phpunitexitcode返回0。您是否已在失败条件下验证phpunitexitcode的输出

||指示前一个命令是否成功,以从不执行后一个命令。
因此,如果失败,它将执行后一个命令,该命令用于获取phpunit退出代码,如果是0,则退出并返回0,如果是,则继续执行脚本。

正如Mechaflash所说,这一行
phpunit--coverage xml coverage | | phpunitexit code=$?&退出0
不正确

看看这个例子

$ ls file || echo fail && echo ok
ls: cannot access 'file': No such file or directory
fail
ok
这两部分都已执行,因此如果使用此语法| |,&&应首先设置&&

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