Gitlab CI:如何缓存Ubuntu容器中before_script的配置安装任务?
解决GitLab CI中重复安装依赖耗时的问题
当然可以,有几种实用方案能避免每次流水线都重复执行耗时的依赖安装步骤,按推荐优先级排序如下:
1. 自定义基础镜像(最推荐)
这是彻底解决问题的最优方案——把所有需要安装的软件、配置都预先打包到一个自定义Docker镜像里,后续CI直接使用这个镜像,完全跳过每次的安装步骤。
步骤:
- 编写
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" # 如果还有其他配置步骤,比如复制配置文件、设置权限等,都可以在这里添加
- 构建并推送这个镜像到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
- 修改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
相关产品推荐
相关产品推荐

