Gitlab v15.3 CI流水线间歇性挂起问题求助
GitLab CI v15.3 间歇性挂起问题解决方案建议
核心问题定位
挂起发生在Checking out e18f49c1 as XYZ ...和Skipping Git submodules setup之后,结合大代码库、大.gitlab-ci.yml的场景,大概率是Git checkout阶段的资源竞争或性能瓶颈导致。
具体解决方案
1. 优化Git checkout配置
- 启用Git浅克隆:在CI配置中添加
GIT_DEPTH: 1,减少克隆的历史数据量,降低磁盘和网络负载。如果需要历史提交,可以设置为合适的深度(比如GIT_DEPTH: 50)。 - 禁用不必要的Git操作:如果确实不需要子模块,显式设置
GIT_SUBMODULE_STRATEGY: none,避免系统自动检测子模块的开销。 - 使用Git稀疏检出:针对大仓库,只检出需要的目录,减少磁盘IO和克隆时间。示例配置:
before_script: - git sparse-checkout init --cone - git sparse-checkout set src/ docs/
2. 调整CI Runner资源配置
- 增加Runner的CPU和内存配额:大仓库克隆和解析
.gitlab-ci.yml需要更多资源,资源不足时容易导致进程挂起。 - 优化Runner并发设置:降低单Runner的并发任务数,避免资源竞争。修改
config.toml中的concurrent值,或者针对特定Runner设置limit参数。 - 清理Runner缓存:定期清理Runner的本地缓存和构建目录,避免磁盘空间不足或旧数据干扰。
3. 优化.gitlab-ci.yml文件
- 拆分大型配置文件:将复杂的job拆分为多个模板或include文件,减少主配置文件的解析压力。
- 减少不必要的全局配置:避免在
before_script或variables中定义过多全局内容,只在需要的job中添加。 - 使用锚点和模板复用:减少配置冗余,降低文件大小和解析时间。
4. GitLab版本升级与补丁
- 升级到GitLab v15.3的后续补丁版本:v15.3存在一些CI相关的已知bug,比如克隆阶段的死锁问题,后续小版本(如v15.3.5+)已经修复部分此类问题。
- 考虑升级到更高稳定版本:如果条件允许,升级到v15.11或更高的LTS版本,获得更完善的CI稳定性修复。
5. 排查网络与存储问题
- 检查Runner与GitLab服务器的网络连接:间歇性网络波动可能导致克隆阶段卡住,尝试更换Runner的网络环境,或使用本地缓存仓库。
- 检查Runner的存储性能:使用SSD存储替代HDD,提升磁盘IO速度,避免因磁盘慢导致的进程挂起。
临时应急方案
- 配置CI自动重试:在易挂起的job中添加
retry: 2,让系统自动重试挂起的任务,减少人工干预。 - 使用自定义checkout脚本:替换默认的checkout步骤,手动执行git克隆命令,添加超时机制。示例:
job_name: script: - timeout 180 git clone --depth 1 https://gitlab.example.com/your/repo.git . - git checkout e18f49c1 - # 后续构建步骤
内容的提问来源于stack exchange,提问作者djna
相关产品推荐
相关产品推荐

