我目前正在为我们公司开发的R软件包进行持续的集成设置。每个R包有一个Jenkins项目,每个项目有相应的库。
我已经定义了一个逻辑,它将包的所有依赖项安装到项目库中。现在我想定义一个基本运行的检查阶段
devtools::check("${PROJECT_DIR}/pkg")但只对依赖项使用项目库。我尝试以以下方式使用callr包。
callr::r(
function(...) {
devtools::check(...)
),
args = list("${PROJECT_DIR}/pkg"),
libpath = "${PROJECT_DIR}/lib"
)但是,检查过程仍然能够找到没有安装在libpath中的包。是否有方法确保在构建阶段只使用"${PROJECT_DIR}/lib"?
到目前为止,我已经尝试了以下几种方法,但都没有用
callr()参数的libpathwithr::with_libpaths参数的newdevtools::check和R CMD BUILD中的文档以获得适当的参数.libPaths("${JOB_DIR}/lib")这里有一个重复来解释callr的意外行为。我希望在第3行中出现错误。
find.package("ggplot2", .libPaths()[1])
#> Error in find.package("ggplot2", .libPaths()[1]): there is no package called 'ggplot2'
callr::r(function() { ggplot2::vars() }, libpath = .libPaths()[1])
#> named list()
find.package("ggplot2", .libPaths()[2])
#> [1] "/data/R/3.5.3/lib/R/library/ggplot2"
callr::r(function() { ggplot2::vars() }, libpath = .libPaths()[2])
#> named list()发布于 2019-04-18 14:07:11
按照这个问题编码,有一种方法可以用base::assign将其归档。如果有更合适的解决办法,我很想听听。
callr::r(function() {
assign(".lib.loc", .libPaths()[1], envir = environment(.libPaths))
ggplot2::vars()
})
#> Error in loadNamespace(name): there is no package called ‘ggplot2’我在这里的问题有两个
.libPaths()的内部结构发生变化,随时都可以破坏。.Library和.Library.site (.libPaths()的内部结构),以确保devtools::check受到适当的影响。发布于 2019-04-19 15:01:26
这可能有点偏离主题,但是您考虑过在这个用例中使用docker吗?
您可以定义在Dockerfile中引用的Jenkinsfile,它将为运行的每个CI作业定义一个自定义映像。使用Jenkins中的devtools::install(),将包安装到坞容器上。当CI完成时,这个容器就会被抛出。
使用这种方法,您不必担心在运行CI时手动安装包,也不必担心不同包之间的名称空间冲突。
这肯定有一个较高的启动成本,但我认为你会发现,这将是值得的长期测试你的R包。资料来源:我也在我的工作中测试内部R包。
样本Dockerfile
FROM docker.io/rocker/r-base
USER root
# Install packages needed for package development
RUN R -e 'install.packages(c("devtools", "rmarkdown", "testthat", "roxygen2"))'然后在Dockerfile中引用此Jenkinsfile,以便安装、测试和检查包(下面的管道示例)
agent {
dockerfile {
args '-u root'
}
}
stages {
stage('Install') {
steps {
sh 'r -e "devtools::install()"'
}
}
stage('Test') {
steps {
sh '''
r -e "options(testthat.output_file = 'test-out.xml'); devtools::test(reporter = 'junit')"
'''
junit 'test-out.xml'
}
}
stage('Check') {
// Might need to modify expected ouput, depends on devtools version
steps {
sh '''
testOutput=$(R -e "devtools::check(args='--no-tests')" 2>&1)
echo "${testOutput}" | grep -q "0 errors ✔ | 0 warnings ✔ | 0 notes ✔"
'''
}
}
}
}https://stackoverflow.com/questions/55746843
复制相似问题