You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitLab CI/CD使用r-base:latest镜像时apt-get无法定位系统包问题

问题:GitLab CI/CD部署R Shiny应用至Posit Connect失败(flextable包安装问题)

我尝试通过GitLab CI/CD部署R Shiny应用到Posit Connect,目标是让流水线运行app.R并完成部署。我对CI/CD和Docker了解有限,用ChatGPT生成的基于r-base:latest镜像的部署代码均无效,核心问题是安装flextable等R包时失败,报错信息如下:

Error in library(flextable) : there is no package called ‘flextable’

我使用的CI/CD代码如下:

image: r-base:latest

stages:
  - deploy

deploy_shiny_app:
  stage: deploy
  before_script:
    # First update the package lists
    - apt-get update
    # Then install the required system libraries (all on one line to avoid shell continuation issues)
    - apt-get install -y libxml2-dev libssl-dev libcurl4-openssl-dev libfontconfig1-dev libfreetype6-dev libharfbuzz-dev libfribidi-dev libcairo2-dev
  script:
    - |
      Rscript -e '
        # Create a persistent library directory if it does not exist
        dir.create("/usr/local/lib/R/site-library", recursive = TRUE, showWarnings = FALSE);
        # Install the "remotes" package to facilitate installation of CRAN packages
        install.packages("remotes", repos="https://cloud.r-project.org/", lib="/usr/local/lib/R/site-library");
        # Use remotes to install all required CRAN packages into the persistent library
        remotes::install_cran(c("flextable", "shiny", "DT", "dplyr", "readxl", "shinythemes", "ggplot2", "gridExtra", "data.table", "rmarkdown", "janitor"),
                              repos="https://cloud.r-project.org/", lib="/usr/local/lib/R/site-library");
        # Add the persistent library to the R library paths
        .libPaths(c("/usr/local/lib/R/site-library", .libPaths()));
        # Run the Shiny application
        source("app.R")
      '
  environment:
    name: production
  only:
    - master
  variables:
    CONNECT_API_KEY: ${CONNECT_API_KEY}
    CONNECT_SERVER: ${CONNECT_SERVER}
    CONNECT_USER: ${CONNECT_USER}

问题解答

1. 为什么GitLab流水线无法找到并安装这些系统库?

  • r-base:latest基于Debian镜像,apt-get update可能因网络或镜像源问题更新失败,导致后续无法定位系统库包
  • 缺少flextable依赖的部分系统库:除了你列出的库,flextable还依赖libpng-dev、libtiff-dev等图形处理类库
  • 自定义R库路径的加载逻辑有问题:手动指定lib路径后,后续source("app.R")时可能未正确加载该路径,导致包找不到

2. 需要做哪些调整才能成功部署Shiny应用(尤其是解决flextable包的问题)?

核心调整步骤:

  1. 修复系统库安装逻辑
    添加非交互式安装参数,避免apt-get的交互提示,同时补全flextable依赖的系统库:

    apt-get update -qq && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
      libxml2-dev libssl-dev libcurl4-openssl-dev libfontconfig1-dev libfreetype6-dev \
      libharfbuzz-dev libfribidi-dev libcairo2-dev libpng-dev libtiff-dev libjpeg-dev
    

    其中-qq减少冗余输出,--no-install-recommends避免安装不必要的依赖,加速构建流程。

  2. 优化R包安装与加载
    取消手动指定lib路径,使用默认系统库路径,并确保安装所有间接依赖:

    Rscript -e '
      install.packages("remotes", repos="https://cloud.r-project.org/");
      remotes::install_cran(c("flextable", "shiny", "DT", "dplyr", "readxl", "shinythemes", "ggplot2", "gridExtra", "data.table", "rmarkdown", "janitor"),
                            repos="https://cloud.r-project.org/", dependencies=TRUE);
      # 提前验证flextable安装状态
      if (!require(flextable)) stop("flextable安装失败");
    '
    

    新增dependencies=TRUE确保安装flextable的所有间接依赖,避免遗漏。

  3. 补充Posit Connect部署逻辑
    原脚本仅在容器内启动应用,未实现部署到Posit Connect的步骤,需安装rsconnect包并调用部署函数:

    rsconnect::deployApp(
      appDir = ".",
      appName = "你的应用名称",
      account = Sys.getenv("CONNECT_USER"),
      server = Sys.getenv("CONNECT_SERVER"),
      apiKey = Sys.getenv("CONNECT_API_KEY"),
      forceUpdate = TRUE
    )
    

    确保GitLab项目的CI/CD变量中已正确配置CONNECT_API_KEY、CONNECT_SERVER、CONNECT_USER。

  4. 可选:使用预构建镜像简化流程
    可以替换为Posit官方的rocker/shiny镜像,该镜像已预装大部分Shiny应用所需的系统库和R包,减少构建时间:

    image: rocker/shiny:latest
    

调整后的完整CI/CD代码:

image: r-base:latest

stages:
  - deploy

deploy_shiny_app:
  stage: deploy
  before_script:
    - apt-get update -qq && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends libxml2-dev libssl-dev libcurl4-openssl-dev libfontconfig1-dev libfreetype6-dev libharfbuzz-dev libfribidi-dev libcairo2-dev libpng-dev libtiff-dev libjpeg-dev
  script:
    - |
      Rscript -e '
        # 安装remotes和部署工具rsconnect
        install.packages(c("remotes", "rsconnect"), repos="https://cloud.r-project.org/");
        # 安装所有依赖包,包含间接依赖
        remotes::install_cran(c("flextable", "shiny", "DT", "dplyr", "readxl", "shinythemes", "ggplot2", "gridExtra", "data.table", "rmarkdown", "janitor"),
                              repos="https://cloud.r-project.org/", dependencies=TRUE);
        # 验证flextable安装状态
        if (!require(flextable)) {
          stop("flextable包安装失败,请检查系统库和网络连接");
        }
        # 部署到Posit Connect
        rsconnect::deployApp(
          appDir = ".",
          appName = "你的Shiny应用名称",
          account = Sys.getenv("CONNECT_USER"),
          server = Sys.getenv("CONNECT_SERVER"),
          apiKey = Sys.getenv("CONNECT_API_KEY"),
          forceUpdate = TRUE
        )
      '
  environment:
    name: production
  only:
    - master
  variables:
    CONNECT_API_KEY: ${CONNECT_API_KEY}
    CONNECT_SERVER: ${CONNECT_SERVER}
    CONNECT_USER: ${CONNECT_USER}

内容的提问来源于stack exchange,提问作者Joe the Second

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 07:32:05