GitLab Runner执行ng lint命令超时问题求助
问题详情
配置的GitLab CI lint任务执行ng lint --fix时会超时(2小时),但本地同版本Node.js下跑同样命令仅需5秒。试过把npm install放单独Job传依赖、直接在当前Job执行npm install,都没用;用本地机器当Runner时,看到node进程跑完lint就消失了,但Runner一直挂着不动。
CI配置:
lint: stage: frontend_check only: changes: - frontend/**/* script: - cd frontend/ngapp - npm run lint - npm run prettier
ESLint配置见用户提供的.eslintrc.json。
解决思路
1. 关掉ESLint的createDefaultProgram选项
你的ESLint配置里开了createDefaultProgram: true,这个选项会让ESLint额外创建一个TypeScript程序实例,在CI环境下很可能导致进程跑完了却没法正常退出。改.eslintrc.json:
{ "root": true, "ignorePatterns": ["projects/**/*"], "overrides": [ { "files": ["*.ts"], "parserOptions": { "project": ["tsconfig.json", "e2e/tsconfig.json"], "createDefaultProgram": false // 改成false }, // 其他配置不变 } ] }
这个选项是给旧版TypeScript兼容用的,现在的Angular项目根本不需要开,关了能避免不必要的资源占用和进程挂起。
2. 禁用Node.js输出缓冲
GitLab Runner默认的输出缓冲可能让Runner误以为进程还在跑,实际lint早就完了。在CI任务里加个环境变量:
lint: stage: frontend_check only: changes: - frontend/**/* variables: CI_NODE_NO_OUTPUT_BUFFER: "1" script: - cd frontend/ngapp - npm run lint - npm run prettier
或者直接在脚本里先执行export CI_NODE_NO_OUTPUT_BUFFER=1,确保lint的输出能实时传给Runner,不会被缓冲卡着。
3. 拆分lint和prettier任务
把两个命令拆成独立的CI任务,看看是哪个导致的挂起:
lint: stage: frontend_check only: changes: - frontend/**/* script: - cd frontend/ngapp - npm run lint prettier: stage: frontend_check only: changes: - frontend/**/* script: - cd frontend/ngapp - npm run prettier
这样能快速定位是lint还是prettier的问题,缩小排查范围。
4. 直接调用ESLint二进制文件
绕开Angular CLI的封装,直接用npx eslint执行,避免CLI可能带来的异常:
script: - cd frontend/ngapp - npx eslint . --fix --ext .ts,.html - npm run prettier
或者改package.json里的lint命令:
{ "scripts": { "lint": "eslint . --fix --ext .ts,.html" } }
5. 检查依赖和TS配置一致性
确认CI环境的tsconfig.json和本地完全一致,同时检查传递的依赖artifact有没有漏东西(比如node_modules/.cache这类缓存目录)。如果依赖传丢了,ESLint可能在CI里重新编译大量文件,导致异常挂起。
6. 调整Runner资源限制
如果用的是Docker Runner,给它分配足够的CPU和内存,资源不够也可能导致进程没法正常退出。改Runner的配置文件:
[[runners]] [runners.docker] cpu_shares = 1024 memory = "2048m"
内容的提问来源于stack exchange,提问作者ForestG

