离线GitLab CI运行semantic-release Docker容器耗时40分钟如何优化?
问题根因
你遇到的耗时过长问题核心出在npx的运行逻辑和依赖安装方式不匹配离线环境:
- 你当前Dockerfile中执行的是局部
npm install,依赖仅安装在镜像构建时的工作目录下,容器运行CI任务时工作目录会切换到GitLab仓库目录,无法读取到提前预装的依赖 - 调用
npx semantic-release时,npx默认会优先尝试从npm远程仓库查询、下载最新版本的semantic-release及所有依赖,你的离线环境无法访问公网,npx会持续重试网络请求直到超时,1660秒的耗时全部来自网络重试开销,你日志中npx: installed 575 in 1660.75s说明运行时完全没有用到镜像中预装的依赖,反而浪费大量时间重试拉包。
解决方案
1. 修改Dockerfile,全局预装所有依赖
调整Dockerfile将semantic-release及插件安装到全局路径,同时配置npm强制离线模式,避免运行时任何网络请求:
FROM node:13 RUN npm config set strict-ssl false \ # 配置npm运行时强制离线,禁用所有联网请求 && npm config set offline true \ && npm config set audit false \ && npm config set fund false # 全局安装semantic-release和依赖插件,所有575个依赖都会预装到镜像中 RUN npm install -g semantic-release@17.4.4 @semantic-release/gitlab@6.2.2 # 构建时验证命令可用,避免离线运行时才发现问题 RUN semantic-release --version
2. 修改gitlab-ci.yml,去掉npx调用
因为已经全局安装了semantic-release,直接调用命令即可,无需使用npx,彻底避免npx的联网逻辑:
--- release: image: "semantic:1" only: refs: - main - alpha - "/^(([0-9]+)\\.)?([0-9]+)\\.x/" - "/^([0-9]+)\\.([0-9]+)\\.([0-9]+)(?:-([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?(?:\\+[0-9A-Za-z-]+)?$/" script: # 直接调用全局命令,无需npx - semantic-release stage: release stages: - release
修改后重新构建镜像,导入到离线Runner运行即可,整个semantic-release启动耗时会降到10秒以内。
内容的提问来源于stack exchange,提问作者ZZTest
相关产品推荐
相关产品推荐

