上周五的时候 GitHub 的一个 Golang 项目的 CI 报错了,看了下 CI 的报错是在 go build 拉取依赖的时候,说是构建的时候拉取到的依赖和 go.sum 中设置的不一致出于安全考虑拒绝执行,于是苦逼的 op 就排查原因,排查了半天一直以为是自己的问题,最后二分法定位到了 proxy.golang.org ,竟然是因为依赖的一个库的某个版本在 proxy.golang.org 上找不到,这个链接:
https://proxy.golang.org/github.com/golang-infrastructure/go-pointer/@v/v0.0.4.info
访问的时候会报 404 ,而查看这个包的所有版本是可以看到是有 v0.0.4 这个版本的:
https://proxy.golang.org/github.com/golang-infrastructure/go-pointer/@v/list
我就感觉很神奇,因为我本地构建的时候没有任何问题,然后想了一下,我本地构建的时候都会走 goproxy.cn 的镜像代理,线上的 CI 环境因为是在国外,所以是没有设置代理的,走的是默认的 proxy.golang.org ,于是我就去 goproxy.cn 看了一下:
https://goproxy.cn/github.com/golang-infrastructure/go-pointer/@v/v0.0.4.info
发现 goproxy.cn 是没问题的,我就很懵逼,不知道是什么情况,难道真的是官方数据错误?
后续解决方案: 这个被依赖的库是 op 自己的,于是死马当活马医,给这个库打了个新 tag v0.0.5 看了看,新 tag v0.0.5 是没问题的,但是 v0.0.4 仍然无法访问。
有问题的 release 在此: https://github.com/golang-infrastructure/go-pointer/releases/tag/v0.0.4
有没有遇到过的大佬指点下迷津
1
Ayanokouji 2023-07-24 17:37:31 +08:00
我刚才也遇到了,重新打包好了,现在你那个地址也能访问了
|
2
CC11001100 OP @Ayanokouji 刚刚试了下,https://proxy.golang.org/github.com/golang-infrastructure/go-pointer/@v/v0.0.4.info 仍然是 404 ,大佬的意思是我要把这个 v0.0.4 的 release 删除掉重新打个 v0.0.4 的 release 吗?
|
3
Ayanokouji 2023-07-24 17:47:57 +08:00
@CC11001100 我也不清楚,我刚遇到的是 swag 的问题,重新编译就好了
|
4
0o0O0o0O0o 2023-07-24 17:50:14 +08:00 1
checksum mismatch 对应的是 GOPROXY=direct
404 对应的是 GOPROXY=https://proxy.golang.org 原因大概是你一个月前打 v0.0.4 tag 时删除了好几次: https://api.github.com/users/golang-infrastructure/events?page=1&per_page=30 |
5
0o0O0o0O0o 2023-07-24 17:52:42 +08:00 1
我觉得你可以避免进行这种删除 tag 再 push 再打相同名称的 tag 的操作,我个人的理解是 goproxy 从原理上就不建议这样做
|
6
CC11001100 OP @0o0O0o0O0o 可能真的是这个原因,大佬牛皮,我已经记不得当时为啥要删除了重新打 tag 了,看来我以后得注意尽量不进行这类操作,请问我现在有什么补救措施让这个 v0.0.4 的 tag 能用吗
|
7
0o0O0o0O0o 2023-07-24 18:18:07 +08:00 via iPhone 1
@CC11001100 #6
你可以看看这个: https://go.dev/blog/go116-module-changes#module-retraction 我希望是能标记它而不是让它可用,如果能的话,那生态的安全性会受到威胁吧 |
8
CC11001100 OP @0o0O0o0O0o 嗯。。有道理,感谢大佬解惑,撒花结贴 ❀❀❀
|
9
joesonw 2023-07-24 19:30:45 +08:00
你删了 tag , 又没有走官方 proxy 拉包吧?因为你本地是 gorpoxycn , 所以上面有记录。
|
10
learningman 2023-07-24 19:47:35 +08:00 via Android
go sumdb 只会记录他第 1 次见到某个 tag 的 hash ,你修改了 tag 以后他不认后面的,也是出于防止投毒的考虑
|
11
flyqie 2023-07-25 01:04:21 +08:00 via Android
|
12
learningman 2023-07-25 10:57:34 +08:00 via Android
@flyqie 不能说非常少见,只能说完全没有。npm 或者 pypi 这样的中心式的源,都是只允许删除或者 yank/deprecated 某个版本,不可能允许更改的。go 虽然是分布式的源,但是他实际上也用中心化 sumdb 实现了限制。
|