Travis中R包的测试失败且缺乏解释

166次阅读
没有评论

问题描述

在开发R包时,使用Travis进行持续集成。测试和R CMD CHECK在本地以及Linux下的3个R版本(oldrel、release和devel)通过。但在macOS下的所有三个版本均失败,并且Travis日志中没有任何信息:

...R CMD check fail logs
0.01s$ for name in $(find "${RCHECK_DIR}" -type f -name "*fail"); do
    echo ">>> Filename: ${name} <<<";
    cat ${name};
done
logR CMD check log logs...

用户在Travis日志中查看了所有在testthat中编写的测试都失败了。尽管Travis的测试曾经在Linux和macOS上都通过,但用户不希望在等待Travis的回答时再去修改代码以寻找问题,而是希望能够有一些更直接、更快速的方法来解决问题。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

检查警告与错误

首先,确保你在.travis.yml中使用了推荐的R包设置,将警告升级为错误,如下所示:

warnings_are_errors: true

接着,查看Travis日志中的前一部分,即Checking package的部分,这部分会给出更多有关问题的信息。

解决字体缺失问题

对于macOS下的问题,特别是涉及到字体缺失的情况,可以在Checking package部分查找问题的线索。例如,下面是一个字体缺失问题的示例:

在Travis日志中,Checking package部分显示inconsolata字体丢失,导致文档构建失败:

* checking PDF version of manual ... WARNING
LaTeX errors when creating PDF version.
This typically indicates Rd problems.
LaTeX errors found:
! LaTeX Error: File `inconsolata.sty' not found.
...

这会导致LaTeX出现错误、R出现警告以及Travis报错。

解决方案示例

对于字体缺失问题,有时可能是TeXLive版本不匹配导致的。你可以尝试以下解决方案:

  1. .travis.yml中指定较旧的macOS版本,例如 macOS 10.12:
osx_image: xcode9.2

这可以通过以下链接查找不同XCode和OSX版本的对应关系:Travis页面

方案2

使用脚本或工具来管理容器的启动顺序可能会增加复杂性,并且需要确保容器A和容器B之间的依赖关系正确设置。
另一种方法是编写脚本或使用工具来控制容器的运行顺序。你可以使用docker run命令来手动控制容器的启动顺序,或者使用一些第三方工具来管理容器的依赖关系。

示例

以下是一个简单的bash脚本示例,可以在容器A启动后启动容器B:

#!/bin/bash
# 启动容器A
docker run -d --name container_a your_image_a
# 等待容器A完全启动
while ! docker exec container_a echo "Container A is ready"; do
  sleep 1
done
# 启动容器B
docker run -d --name container_b your_image_b

在这个示例中,我们首先使用docker run命令启动容器A,并将其命名为container_a。然后,使用一个循环来等待容器A完全启动(这里是通过在容器内运行echo命令来测试)。一旦容器A就绪,我们再使用docker run命令启动容器B,并将其命名为container_b

请注意,这只是一个示例脚本,实际情况可能因环境和需求而异。你可以根据实际情况进行调整和扩展。

总结

当Travis中的R包测试在macOS下失败并且Travis日志中缺乏详细信息时,可以尝试以下解决方案:

  1. 检查.travis.yml中的设置,确保警告被升级为错误。
  2. 在Travis日志中查找Checking package部分,以获取更多有关问题的信息。
  3. 解决字体缺失等可能导致构建失败的问题,可以尝试降级TeXLive版本等方法。
  4. 如果需要更精细的控制,可以编写脚本或使用工具来管理容器的启动顺序,确保容器A在容器B之前启动。

以上是解决Travis中R包测试失败的一些建议,希望能对你有所帮助!

正文完