Docker内R包测试失败时如何触发GitHub Workflow任务失败
GitHub Workflow R包测试失败自动触发任务失败的配置方案
问题根因
你遇到的现象是devtools::test()默认行为导致的:默认配置下,就算测试用例全部失败,devtools::test()只会输出错误日志,不会抛出终止进程的错误,R进程最终返回退出码0,docker会将0退出码透传给GitHub Workflow,因此任务会被判定为执行成功。
解决方案
直接修改Workflow的测试步骤配置即可,修改后代码如下:
- name: run tests run: | docker run --rm ghcr.io/<org>/<repo> R --no-save --no-restore -e "devtools::test(stop_on_failure = TRUE)"
修改点说明
- 给R命令增加
--no-save --no-restore参数:避免CI非交互环境下触发工作空间保存的交互提示,阻塞执行流程 - 给
devtools::test()新增stop_on_failure = TRUE参数:只要存在任意失败的测试用例,就会直接抛出错误终止R进程,返回非0退出码 - 给docker命令增加
--rm参数:测试执行完成后自动删除容器,避免残留占用Runner资源 - 移除了不必要的
-i参数:CI环境为非交互式场景,无需开启标准输入交互,避免触发不必要的异常
兼容低版本devtools的备选方案
如果你使用的devtools版本较低不支持stop_on_failure参数,可以手动判断测试结果主动设置退出码:
- name: run tests run: | docker run --rm ghcr.io/<org>/<repo> R --no-save --no-restore -e " test_result <- devtools::test() if (sum(sapply(test_result, function(x) x$failed)) > 0) { quit(status = 1, save = 'no') } "
修改后只要有测试用例失败,步骤就会返回非0退出码,GitHub Workflow会自动将对应任务判定为失败。
内容的提问来源于stack exchange,提问作者Harshit Nagar
相关产品推荐
相关产品推荐

