优化核心是减少冗余动作、预置环境、轻装启动:设pull_policy: if_not_present、预拉基础镜像、用Alpine/distroless精简镜像;禁用untracked全量缓存,显式声明node_modules等路径并exclude日志IDE文件;缓存key用files:[package-lock.json]而非静态分支名;轻量任务改用shell执行器省20–60秒。

流水线启动慢,核心卡在作业初始化阶段——镜像拉取、容器准备、依赖重装。优化关键不是堆硬件,而是砍掉冗余动作、提前准备好环境、让每次启动都“轻装上阵”。
精简镜像拉取耗时
每次作业启动都要 pull 镜像,是启动慢的头号原因。本地已有镜像却仍强制远程下载,纯属浪费时间。
- 在 runner 配置中设置 pull_policy: if_not_present,避免重复拉取
- 预加载常用基础镜像(如
node:18-alpine、maven:3.9-openjdk17)到所有 runner 节点,执行docker pull xxx一次到位 - 优先选用 Alpine 或 distroless 镜像,体积小、解压快;例如用
node:18-alpine替代node:18,镜像大小可从 1GB 降至 150MB 左右
避免 untracked 全量缓存污染
配置 untracked: true + paths: ["."] 看似省事,实则把日志、IDE配置、临时文件全塞进缓存包,上传/下载动辄几百 MB,还极易导致缓存失效。
批量替换指定目录下所有 Git 仓库的远程地址(remote URL)。 当用户需要将 Git 仓库从一个服务器迁移到另一个服务器时使用。 触发词:git remote 替换、git url 批量修改、git 仓库迁移、更换 git 地址、批量修改 remote url。
- 显式声明需缓存的路径,只保留真正可复用的内容:如
node_modules/、.gradle/caches/、vendor/ - 用
exclude排除干扰项:在cache下加exclude: ["**/*.log", "**/.idea/", "dist/"] - 禁用全局
untracked,除非你明确需要某类生成文件(如代码生成器产出)
提升缓存命中率的关键细节
缓存不生效,往往不是没配,而是 key 设得不合理或路径不精准。
- 缓存 key 优先用
files:指定依赖锁文件,例如:key: files: [package-lock.json]或[pom.xml, .mvn/maven.config],确保依赖变更才刷新缓存 - 避免用静态分支名(如
$CI_COMMIT_REF_SLUG)作唯一 key,否则不同提交但同分支会共用缓存,引发污染 - 对多语言项目,分路径、分 key 管理:Node.js 用
node_modules,Java 用target,Python 用.venv,互不干扰
选对执行器,跳过容器开销
不是所有任务都需要 Docker 容器。简单脚本类作业(如 lint、git tag、变量校验),用 Shell 执行器能省下 20–60 秒容器启动时间。
- 为轻量任务单独定义
tags: [shell]的 runner,并在 job 中指定tags: [shell] - 复杂环境(含多版本工具链、隔离依赖)再用 Docker 执行器,按需使用
- 确认 runner 配置中
executor = "shell"已启用且权限安全(仅限可信内网环境)

















