GitLab Shell Runner无法上传超63KB制品:501 Not Implemented错误
解决GitLab CI制品上传501 Not Implemented错误(大文件失败)
首先,你的问题很典型——GitLab Runner版本与GitLab Server版本不匹配,加上跨子网网络环境的潜在限制,导致大文件制品上传失败。结合你的测试结果(63KB成功、64KB失败),核心原因大概率是新版本Runner启用了旧版GitLab不支持的分块上传特性。下面一步步帮你调试和解决:
一、开启Runner的Verbose/调试模式
你没法直接在.gitlab-ci.yml里开启制品上传的verbose模式,但可以通过修改Runner配置获取详细日志:
- 找到GitLab Runner的配置文件
config.toml(通常路径是/etc/gitlab-runner/config.toml) - 在
[[runners]]区块下添加或修改日志级别:[[runners]] # 保留原有配置 log_level = "debug" - 重启GitLab Runner服务:
sudo gitlab-runner restart - 重新运行失败的作业,查看Runner的日志(路径通常是
/var/log/gitlab-runner.log),里面会输出制品上传的完整HTTP请求/响应细节,能明确看到501错误的触发点。
二、核心问题排查:版本兼容性
你的GitLab CE是11.3.5(2018年发布),而Runner是12.0.2(2019年发布),两者版本差距过大:
- GitLab 11.x系列不支持制品分块上传,而Runner 12.0默认会对大于64KB的文件启用分块上传机制
- 当Runner尝试调用GitLab不支持的分块上传API时,GitLab就会返回
501 Not Implemented错误,这正好匹配你“63KB成功、64KB失败”的测试结果
解决版本不兼容的两种方案:
方案1:降级Runner到与GitLab匹配的版本
GitLab官方要求Runner版本与GitLab Server版本保持一致(或不超过1个大版本)。你可以安装GitLab Runner 11.3.x版本:
# 卸载当前Runner sudo gitlab-runner uninstall # 安装11.3.10版本(与GitLab 11.3.5最接近的稳定版) curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash sudo apt-get install gitlab-runner=11.3.10-1
降级后重新注册Runner,再测试大文件上传,应该能解决问题。
方案2:禁用Runner的分块上传特性
如果不想降级,可以在Runner的config.toml里禁用分块上传:
[[runners]] # 保留原有配置 [runners.feature_flags] FF_ARTIFACT_UPLOAD_CHUNKED = false # 或者强制设置分块大小为0(禁用分块) ARTIFACT_UPLOAD_CHUNK_SIZE = 0
修改后重启Runner,再测试上传大文件。
三、网络环境排查(跨子网场景)
因为Runner和GitLab不在同一子网,还要排除中间网络设备的限制:
- 检查防火墙/安全组:是否允许Runner向GitLab的HTTPS端口(默认443)发起大流量请求,是否拦截了PUT/POST方法的大请求体
- 检查反向代理(如果GitLab前端有Nginx等):确保
client_max_body_size设置足够大(比如设置为100m),避免截断大文件上传请求 - 手动测试API上传:在Runner服务器上用curl模拟上传大文件,验证GitLab API是否支持:
# 替换为你的GitLab地址、项目ID、作业ID和CI_JOB_TOKEN(从作业环境变量获取) curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file test.dat "https://your-gitlab-url/api/v4/projects/123/jobs/456/artifacts"
如果curl上传也返回501,说明问题确实在GitLab API不支持;如果curl成功,那就是Runner的配置问题。
四、额外检查:GitLab制品存储配置
- 检查GitLab服务器的磁盘空间:确保制品存储目录(默认
/var/opt/gitlab/gitlab-rails/shared/artifacts)有足够空间 - 检查GitLab的
gitlab.rb配置:是否设置了gitlab_rails['artifacts_max_size']限制,默认是100MB,如果你设置了更小的值,会导致大文件上传失败
按照以上步骤调试,应该能快速定位并解决你的问题。
内容的提问来源于stack exchange,提问作者vctls




