我有一个在.travis.yml
中调用的测试脚本:
script:
- ./test.sh
每当将提交推送到存储库时,都会运行此测试脚本。这是一个bash
脚本,我在其中创建一个临时目录,添加陷阱以在脚本完成后删除该目录,然后执行一些工作:
#!/usr/bin/env bash
set -o errexit
TMPDIR=$(mktemp --directory --tmpdir=${HOME})
trap 'rm -rf "${TMPDIR}"' EXIT
# ...some work...
引起问题的是trap
调用。
测试通过后,脚本会以状态代码0
成功退出。触发EXIT
陷阱,这开始尝试删除${TMPDIR}
。
由于权限错误,此尝试失败,例如:
rm: cannot remove ‘/home/travis/tmp.uaFEDOAgQt/.../log/error.log’: Permission denied
rm: cannot remove ‘/home/travis/tmp.uaFEDOAgQt/.../log/access.log’: Permission denied
The command "./test.sh" exited with 1.
该脚本以Travis环境用户的身份运行进程。这些进程创建这些(日志)文件。这些进程不会像其他用户一样运行。由于进程是由Travis用户启动的,因此这些目录必须由Travis用户拥有,因此应该可以删除它们。但是,它们无法删除。
如果我在本地运行测试脚本,这不是问题。这仅是在Travis CI构建环境中出现的问题。
一种解决方案是禁用陷阱。还有什么其他解决方案?是否可以将sudo
添加到在(trusty
)Travis环境中运行的命令中,而无需提示脚本输入密码?我猜想sudo
调用应该优先于权限投诉,但是尚不清楚为什么首先应该是错误。