Bash 即使测试失败,TravisCI构建也会成功

Bash 即使测试失败,TravisCI构建也会成功,bash,shell,docker,travis-ci,Bash,Shell,Docker,Travis Ci,这就是我在travis.yml中运行测试的地方: # Run tests script: # Test application in Docker container - ./tools/docker-test.sh shell脚本docker test.sh如下所示: #!/usr/bin/env bash githash="$(git rev-parse --short HEAD)" echo "-----------------------------------------

这就是我在
travis.yml
中运行测试的地方:

# Run tests
script:
  # Test application in Docker container
  - ./tools/docker-test.sh
shell脚本
docker test.sh
如下所示:

#!/usr/bin/env bash

githash="$(git rev-parse --short HEAD)"

echo "-------------------------------------------------"
echo "| Running unit tests                            |"
echo "-------------------------------------------------"

docker create -it --name test eu.gcr.io/test/test:$githash
docker start test
docker exec test /bin/sh -c "go test ./..."
docker stop test
docker rm -fv test
即使测试失败,TravisCI构建也是成功的


如何让TravisCI知道测试是否失败?我不知道这是否是一个问题,因为没有从Docker传播错误,没有从shell脚本传播错误,或者TravisCI不知道go测试何时成功或失败。

您的脚本正在退出,状态代码为最后一个命令
Docker rm-fv test

您需要捕获测试的状态代码,然后清理docker,然后退出

这个代码示例来自稍微不同的解决方案,但它是相同的解决方案

#/usr/bin/env bash
set-e
#设置默认返回码
RC=2
#清理
函数清理{
回显“移除容器”
docker停止测试| |正确
docker rm-f测试| |正确
退出$RC
}
陷阱清理出口
#测试步骤
docker create-it--name测试路径
docker启动测试
docker exec test/bin/sh-c“go test./…”
RC=$?

为什么要将清除移到函数?这是必要的还是仅仅是一种风格偏好?为什么在docker stop测试和docker rm-f测试之间加上括号?我知道这些命令随后会在子shell中运行。这样做的好处是什么?清理功能是这样的,无论哪一步失败,docker都会在之后通过
陷阱进行清理。实际上,这是一个错误。正在寻找跳过
set-e
结果检查的更快方法
stop
rm
应始终在不导致脚本退出的情况下运行。