You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gitea Docker Registry首次推送报500/未授权问题求助

Jenkins+Podman推送镜像到Gitea Registry每日首次构建失败问题分析

问题现象

  • Jenkins流水线通过Podman构建镜像并推送到私有Gitea Docker Registry,日常构建正常,但间隔数小时(次日)的首次构建必失败
  • 失败触发点为镜像层推送阶段,报错如下:

Error: writing blob: uploading layer to https://192.168.0.5:4000/v2/myorg/myproject/blobs/uploads/ptuh7yizsrqvx5wlg9uctlzdv?digest=sha256%3A7ca0dabc572c112e5141bac7e5f29a0c1b1f727ce939ac1e7da342d3adf324a: received unexpected HTTP status: 500 Internal Server Error

  • 访问报错链接返回权限相关提示:

errors
0
code "UNAUTHORIZED"
message ""

  • Jenkins执行登录脚本podman login -u builderuser -p builderpassword 192.168.0.5:4000显示Login Succeeded!,但推送仍失败;提前执行podman logout 192.168.0.5:4000也无效,重新触发构建则恢复正常

排查线索

  1. Gitea服务日志中发现数据库唯一键冲突错误:

Nov 11 08:50:40 server gitea[34985]: 2022/11/11 08:50:40 ...es/container/blob.go:66:func1() [E] [636dfed0-7] Error inserting package: pq: duplicate key value violates unique constraint »UQE_package_version_s«

  1. Gitea源码auths.go中存在官方标注的未修复问题:

// FIXME: if the name conflicts, it will result in 500: Error 1062: Duplicate entry 'aa' for key 'login_source.UQE_login_source_name'

问题分析

表面的UNAUTHORIZED报错属于客户端(Podman)对服务器500错误的误解析,实际根源是Gitea处理镜像推送时的数据库唯一键冲突。

仅每日首次构建触发该问题的原因,大概率和Gitea的缓存过期机制有关:

  • 间隔数小时后,Gitea内部缓存的镜像包版本元数据失效,首次推送时会尝试重新插入元数据到数据库,但之前某次推送中断残留的脏数据触发了唯一键约束冲突
  • 首次失败后,Gitea内部会自动清理或更新缓存/脏数据,再次构建时元数据插入逻辑恢复正常,因此重新触发后可成功推送

临时规避/解决方向

  • 在Jenkins流水线中添加构建失败自动重试逻辑,比如首次失败后等待10秒自动重试1次,覆盖每日首次构建的异常场景
  • 定期清理Gitea Registry中对应镜像的历史脏数据:手动删除仓库中镜像的无效旧版本,或通过Gitea API清理异常的包元数据
  • 升级Gitea到最新稳定版本,检查该数据库唯一键冲突的FIXME问题是否已被官方修复

内容的提问来源于stack exchange,提问作者Bevor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 07:20:35