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

Gitlab CI:如何缓存Ubuntu容器中before_script的配置安装任务?

解决GitLab CI中重复安装依赖耗时的问题

当然可以,有几种实用方案能避免每次流水线都重复执行耗时的依赖安装步骤,按推荐优先级排序如下:

1. 自定义基础镜像(最推荐)

这是彻底解决问题的最优方案——把所有需要安装的软件、配置都预先打包到一个自定义Docker镜像里,后续CI直接使用这个镜像,完全跳过每次的安装步骤。

步骤:

  1. 编写Dockerfile,基于ubuntu:jammy镜像添加所有依赖安装命令:
FROM ubuntu:jammy

# 安装所需软件包,替换成你的实际依赖
RUN apt-get update && apt-get install -y \
    package1 package2 package3 \
    # 清理apt缓存减少镜像体积
    && apt-get clean && rm -rf /var/lib/apt/lists/*

# 预先配置环境变量(比如你的DISPLAY)
ENV DISPLAY ":0.0"

# 如果还有其他配置步骤,比如复制配置文件、设置权限等,都可以在这里添加
  1. 构建并推送这个镜像到GitLab容器注册表(或其他镜像仓库):
# 登录GitLab容器注册表
docker login registry.your-gitlab-domain.com
# 构建镜像
docker build -t registry.your-gitlab-domain.com/your-project/your-custom-jammy:latest .
# 推送镜像
docker push registry.your-gitlab-domain.com/your-project/your-custom-jammy:latest
  1. 修改CI配置,直接使用自定义镜像:
stages:
  - build

# 替换成你的自定义镜像地址
image: registry.your-gitlab-domain.com/your-project/your-custom-jammy:latest

build_executable:
  stage: build
  # 现在before_script可以完全删除,或者只保留少量临时配置
  script:
    # 你的短构建流程
  artifacts:
    paths:
      - dist/
  tags:
    - docker-runner

2. 使用GitLab CI缓存功能

如果暂时无法制作自定义镜像,可以用GitLab的缓存功能缓存apt下载的包或者已安装的软件目录,减少重复下载的时间(注意:还是要执行安装命令,但不需要重新下载包)。

修改CI配置如下:

stages:
  - build

image: ubuntu:jammy
variables:
  DISPLAY: ":0.0"

build_executable:
  stage: build
  cache:
    # 设置唯一缓存键,确保不同环境的缓存不冲突
    key: ubuntu-jammy-deps
    paths:
      # 缓存apt的包缓存目录,避免重复下载
      - /var/cache/apt/archives/
      # 如果你的软件安装到了非系统目录(比如/opt/my-tools),也可以添加进来
      # - /opt/my-tools/
  before_script:
    # 安装命令依然保留,但apt会优先使用缓存的包
    apt-get update && apt-get install -y package1 package2 package3
  script:
    # 你的短构建流程
  artifacts:
    paths:
      - dist/
  tags:
    - docker-runner

3. 使用工件(Artifacts)传递依赖

如果以上两种方案都不适用,可以单独创建一个prepare阶段,专门安装依赖并将整个环境打包成工件,后续构建阶段直接复用这个工件。

示例CI配置:

stages:
  - prepare
  - build

image: ubuntu:jammy
variables:
  DISPLAY: ":0.0"

prepare_deps:
  stage: prepare
  script:
    # 安装所有依赖
    apt-get update && apt-get install -y package1 package2 package3
    # 如果有自定义配置文件,也可以一起打包
    # mkdir -p ./config && cp /path/to/config ./config/
  artifacts:
    paths:
      # 打包apt相关目录和已安装的软件路径
      - /var/lib/apt/
      - /usr/local/bin/
      # ./config/
    # 设置工件有效期,避免占用过多存储空间
    expire_in: 1 week
  tags:
    - docker-runner

build_executable:
  stage: build
  # 指定依赖prepare_deps阶段的工件
  dependencies:
    - prepare_deps
  before_script:
    # 按需恢复配置(有些软件安装后直接可用,这步可省略)
    # cp ./config/* /path/to/config/
  script:
    # 你的短构建流程
  artifacts:
    paths:
      - dist/
  tags:
    - docker-runner

方案对比

方案优点缺点
自定义基础镜像速度最快、一劳永逸需要维护镜像、推送权限
GitLab CI缓存配置简单、快速见效仍需执行安装命令、缓存有大小限制
工件传递依赖无需镜像仓库权限工件体积大、下载耗时

内容的提问来源于stack exchange,提问作者slarag

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 16:47:44