为什么 Ubuntu 22.04/jammy 尚未提供 R 4.6.0 二进制包?
结论
Ubuntu 22.04/jammy 已提供 R 4.6.0 二进制包。核查时,CRAN 的 jammy-cran40 仓库中已有以下文件:
r-base-core_4.6.0-2.2204.4_amd64.deb
r-base-core_4.6.0-2.2204.4_arm64.deb
目录中,这两个文件的修改时间分别为 2026 年 5 月 5 日和 5 月 6 日。当时只看到源码包,并不能据此判断 CRAN 已停止为 jammy 提供 R 4.6.0。
如果 Jenkins 必须使用二进制包安装,可以继续检查 jammy 仓库的 APT 索引。需要固定 R 版本时,也可以考虑将预编译包安装到独立目录。
为什么源码包和二进制包没有同时出现?
源码包出现,说明相应源码文件已经上传,但不代表各个 Ubuntu 发行版、各个 CPU 架构的二进制包都已完成构建和发布。
当时 noble 已有 .deb,jammy 尚未显示,只能说明两个仓库的发布时间存在差异。构建排队、构建失败或镜像同步都可能造成延迟。没有对应的构建日志或维护者说明,就无法确定这次延迟的具体原因,也无法给出确切的等待时间。
CRAN 的 Ubuntu 安装说明仍列出 jammy,并说明只有最新的 Ubuntu LTS 获得完整支持。这条支持政策也无法解释某次缺包的具体原因。
先检查 Jenkins 实际能安装什么
在 Jenkins agent 上执行以下命令,检查实际可用的版本,避免只凭浏览器中的目录列表判断:
cat /etc/os-release
dpkg --print-architecture
sudo apt-get update
apt-cache policy r-base r-base-core
apt-cache madison r-base-core
policy 用于检查候选版本和软件源优先级,madison 用于列出当前 APT 索引中可见的版本。具体含义见 Ubuntu 的 apt-cache 手册。
Ubuntu 22.04 对应的 CRAN 软件源条目为:
deb https://cloud.r-project.org/bin/linux/ubuntu jammy-cran40/
如果尚未配置仓库及签名密钥,应按 CRAN 官方安装说明完成配置,再更新索引。
目录中保留着旧 .deb 文件,不代表当前 APT 索引仍收录该版本。不指定版本安装 r-base,也不保证装到的恰好是 4.6.0。
如果流水线必须固定到 R 4.6.0,应先确认所需包及其依赖都能获取,再固定完整的 Debian 包版本号。4.6.0 是 R 版本,4.6.0-2.2204.4 还包含打包修订信息,两者不能直接互换。
需要独立切换版本时,可使用预编译包
如果流水线需要通过修改版本变量来安装对应的二进制包,可以使用 Posit 的 r-builds 项目:下载适用于 Ubuntu 22.04 的 .deb,将不同 R 版本并排安装到 /opt/R/<版本号>。
下载地址按该项目公布的规则拼接。执行前,应确认目标版本及架构有对应构建;下载失败时,应停止任务。
set -eu
R_VERSION=4.6.0
R_ARCH="$(dpkg --print-architecture)"
R_DEB="r-${R_VERSION}_1_${R_ARCH}.deb"
curl --fail --location \
--output "${R_DEB}" \
"https://cdn.posit.co/r/ubuntu-2204/pkgs/${R_DEB}"
sudo apt-get update
sudo apt-get install -y "./${R_DEB}"
export PATH="/opt/R/${R_VERSION}/bin:${PATH}"
R --version
Rscript -e 'stopifnot(getRversion() == numeric_version("4.6.0"))'
这种方式无需在 CI/CD 运行期间编译 R。Jenkins 中的 PATH 必须在实际运行测试的步骤里生效,因为不同 sh 步骤之间通常不会保留前一步的 export。也可以直接使用绝对路径调用:
/opt/R/4.6.0/bin/Rscript your-script.R
这些构建是 r-builds 提供的社区资源,维护方式与 CRAN 的 Ubuntu 仓库不同,采用前应查看项目的支持说明。
注意事项
不要在 jammy 系统中直接改用 noble-cran40 来补缺包。两个仓库面向不同的 Ubuntu 版本,系统库和依赖要求可能不同。如果选择 noble,应同时将 Jenkins agent 或容器环境迁移到 Ubuntu 24.04。
R 解释器的二进制包与项目依赖的 R 扩展包是两回事。即使安装了预编译的 R,随后执行 install.packages() 时仍可能需要编译。CRAN 的 Ubuntu 说明分别给出了两者的安装方式。
对于需要反复运行的流水线,建议在确认安装成功后,将所需安装包、依赖和校验信息保存到内部制品库,或制作固定的 Jenkins agent 镜像,避免每次构建都依赖外部仓库当时的状态。
备注:内容仅供参考。
