You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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配置获取详细日志:

  1. 找到GitLab Runner的配置文件config.toml(通常路径是/etc/gitlab-runner/config.toml
  2. [[runners]]区块下添加或修改日志级别:
    [[runners]]
      # 保留原有配置
      log_level = "debug"
    
  3. 重启GitLab Runner服务:
    sudo gitlab-runner restart
    
  4. 重新运行失败的作业,查看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

火山引擎 最新活动