拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Argo CD Go 包导入实战:解决 unknown revision v0.0.0 报错与 go.mod replace 完整配置

Argo CD Go 包导入实战解决 unknown revision v0.0.0 报错与 go.mod replace 完整配置【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cd本文围绕 Argo CD 官方文档 Importing Argo CD go packages 展开讲解在自定义项目中以 Go 依赖方式引入 Argo CD 源码包时为何会触发 unknown revision v0.0.0 类错误以及如何通过照抄对应版本 go.mod 的 replace 段彻底解决问题。读完本文你将掌握Argo CD 各版本如 v2.4.15 与当前 v3.x的模块导入路径差异、replace 段的完整配置方法以及 gitops-engine 子模块、Go 工具链版本等容易踩坑的细节。问题背景为什么导入 Argo CD 包会报 unknown revision v0.0.0当你在自己的项目里importArgo CD 的 Go 包例如 CRD 类型定义pkg/apis/application/v1alpha1其真实导入路径为github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1可参考仓库内部的实际用法 hydrator_dependencies.go时go mod tidy或go build下载依赖过程中可能出现类似如下错误invalid version: unknown revision v0.0.0官方文档给出的根因是Argo CD 直接依赖了一批 Kubernetes 包而这些 Kubernetes 包在其 go.mod 中出现了 未知 的 v0.0.0 版本见 import.md 的 Issue 一节。从源码结构看这背后有两层机制Kubernetes 的 staging 仓库特性。Kubernetes 主仓库将k8s.io/api、k8s.io/apimachinery、k8s.io/client-go等拆分为独立的 staging 模块。k8s.io/kubernetes的 go.mod 中对这些 staging 模块的引用并非真实发布的版本号而是依赖 replace 指令指向本地目录。官方文档中引用的注释链接kubernetes/kubernetes 问题 79384讨论的正是这一现象。Go 的 replace 指令只对主模块生效。这是 Go Modules 的既定规则依赖模块 go.mod 里的replace声明对下游消费者是无效的。也就是说即便 Argo CD 在自己的 go.mod 里把所有 k8s.io 模块 replace 到了可用版本你的项目作为主模块也不会继承这些替换——Go 只会解析出形如k8s.io/api v0.0.0的要求而这个版本号在远端并不存在于是报出 unknown revision v0.0.0。因此修复动作必须由消费者你的项目来完成而不是等待 Argo CD 侧改动。解决方案照抄对应版本 Argo CD go.mod 的 replace 段官方文档给出的标准解法只有一句话在你自己的 go.mod 中添加 replace 段内容与你所使用的 Argo CD对应版本go.mod 中的 replace 段保持一致。关键约束在于对应版本四个字replace 段与特定版本的依赖组合绑定v2.x、v3.x 之间的 replace 段差异很大不能跨版本混用。如何找到指定版本的 go.mod文档说明的操作路径是进入 Argo CD 源码仓库点击分支/标签branches/tags下拉框切换到你要使用的版本 tag例如v2.4.15即可查看该版本下的 go.mod 及其他所有文件。以当前仓库为参照根目录下的 go.mod 就是 HEAD 版本VERSION 文件标记为3.6.0见 VERSION的依赖清单若你要使用某个已发布 tag则切换到该 tag 后再查看即可。完整示例一Argo CD v2.4.15 的 replace 段以下 replace 段来自官方文档适用于引用 Argo CDv2.4.15的项目。请完整加入你自己的 go.modreplace ( // https://github.com/golang/go/issues/33546#issuecomment-519656923 github.com/go-check/check github.com/go-check/check v0.0.0-20180628173108-788fd7840127 github.com/golang/protobuf github.com/golang/protobuf v1.4.2 github.com/gorilla/websocket github.com/gorilla/websocket v1.4.2 github.com/grpc-ecosystem/grpc-gateway github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/improbable-eng/grpc-web github.com/improbable-eng/grpc-web v0.0.0-20181111100011-16092bd1d58a // Avoid CVE-2022-28948 gopkg.in/yaml.v3 gopkg.in/yaml.v3 v3.0.1 // https://github.com/kubernetes/kubernetes/issues/79384#issuecomment-505627280 k8s.io/api k8s.io/api v0.23.1 k8s.io/apiextensions-apiserver k8s.io/apiextensions-apiserver v0.23.1 k8s.io/apimachinery k8s.io/apimachinery v0.23.1 k8s.io/apiserver k8s.io/apiserver v0.23.1 k8s.io/cli-runtime k8s.io/cli-runtime v0.23.1 k8s.io/client-go k8s.io/client-go v0.23.1 k8s.io/cloud-provider k8s.io/cloud-provider v0.23.1 k8s.io/cluster-bootstrap k8s.io/cluster-bootstrap v0.23.1 k8s.io/code-generator k8s.io/code-generator v0.23.1 k8s.io/component-base k8s.io/component-base v0.23.1 k8s.io/component-helpers k8s.io/component-helpers v0.23.1 k8s.io/controller-manager k8s.io/controller-manager v0.23.1 k8s.io/cri-api k8s.io/cri-api v0.23.1 k8s.io/csi-translation-lib k8s.io/csi-translation-lib v0.23.1 k8s.io/kube-aggregator k8s.io/kube-aggregator v0.23.1 k8s.io/kube-controller-manager k8s.io/kube-controller-manager v0.23.1 k8s.io/kube-proxy k8s.io/kube-proxy v0.23.1 k8s.io/kube-scheduler k8s.io/kube-scheduler v0.23.1 k8s.io/kubectl k8s.io/kubectl v0.23.1 k8s.io/kubelet k8s.io/kubelet v0.23.1 k8s.io/legacy-cloud-providers k8s.io/legacy-cloud-providers v0.23.1 k8s.io/metrics k8s.io/metrics v0.23.1 k8s.io/mount-utils k8s.io/mount-utils v0.23.1 k8s.io/pod-security-admission k8s.io/pod-security-admission v0.23.1 k8s.io/sample-apiserver k8s.io/sample-apiserver v0.23.1 )注意其中注释承载的三类信息复制时建议一并保留go-check/check的注释指向 Go 语言 issue 33546说明该 pseudo-version 是为规避模块解析问题而钉住的gopkg.in/yaml.v3 v3.0.1显式标注了规避CVE-2022-28948的意图大段k8s.io/* v0.23.1对应 Kubernetes 问题 79384 的 staging 模块处理方案。完整示例二当前仓库v3.6.0的 replace 段如果你引用的是当前仓库所代表的版本github.com/argoproj/argo-cd/v3VERSION 为 3.6.0replace 段与 v2.4.15 已经明显不同。以下是 go.mod 中实际存在的 replace 段replace ( github.com/golang/protobuf github.com/golang/protobuf v1.5.4 github.com/grpc-ecosystem/grpc-gateway github.com/grpc-ecosystem/grpc-gateway v1.16.0 golang.org/x/tools golang.org/x/tools v0.35.0 // Avoid CVE-2022-3064 gopkg.in/yaml.v2 gopkg.in/yaml.v2 v2.4.0 k8s.io/api k8s.io/api v0.37.0 k8s.io/apiextensions-apiserver k8s.io/apiextensions-apiserver v0.37.0 k8s.io/apimachinery k8s.io/apimachinery v0.37.0 k8s.io/apiserver k8s.io/apiserver v0.37.0 k8s.io/cli-runtime k8s.io/cli-runtime v0.37.0 k8s.io/client-go k8s.io/client-go v0.37.0 k8s.io/cloud-provider k8s.io/cloud-provider v0.37.0 k8s.io/cluster-bootstrap k8s.io/cluster-bootstrap v0.37.0 k8s.io/code-generator k8s.io/code-generator v0.37.0 k8s.io/component-base k8s.io/component-base v0.37.0 k8s.io/component-helpers k8s.io/component-helpers v0.37.0 k8s.io/controller-manager k8s.io/controller-manager v0.37.0 k8s.io/cri-api k8s.io/cri-api v0.37.0 k8s.io/cri-client k8s.io/cri-client v0.37.0 k8s.io/cri-streaming k8s.io/cri-streaming v0.37.0 k8s.io/csi-translation-lib k8s.io/csi-translation-lib v0.37.0 k8s.io/dynamic-resource-allocation k8s.io/dynamic-resource-allocation v0.37.0 k8s.io/endpointslice k8s.io/endpointslice v0.37.0 k8s.io/externaljwt k8s.io/externaljwt v0.37.0 k8s.io/kms k8s.io/kms v0.37.0 k8s.io/kube-aggregator k8s.io/kube-aggregator v0.37.0 k8s.io/kube-controller-manager k8s.io/kube-controller-manager v0.37.0 k8s.io/kube-proxy k8s.io/kube-proxy v0.37.0 k8s.io/kube-scheduler k8s.io/kube-scheduler v0.37.0 k8s.io/kubectl k8s.io/kubectl v0.37.0 k8s.io/kubelet k8s.io/kubelet v0.37.0 k8s.io/legacy-cloud-providers k8s.io/legacy-cloud-providers v0.37.0 k8s.io/metrics k8s.io/metrics v0.37.0 k8s.io/mount-utils k8s.io/mount-utils v0.37.0 k8s.io/pod-security-admission k8s.io/pod-security-admission v0.37.0 k8s.io/sample-apiserver k8s.io/sample-apiserver v0.37.0 k8s.io/sample-cli-plugin k8s.io/sample-cli-plugin v0.37.0 k8s.io/sample-controller k8s.io/sample-controller v0.37.0 )对比 v2.4.15 的示例可以看到演进轨迹k8s.io 模块族从 v0.23.1 整体抬升到 v0.37.0并新增了k8s.io/cri-client、k8s.io/cri-streaming、k8s.io/externaljwt、k8s.io/dynamic-resource-allocation等后来从 kubernetes 主仓库拆分出来的 staging 模块安全钉住的也从 yaml.v3 变成了gopkg.in/yaml.v2 v2.4.0注释标明规避 CVE-2022-3064。这正说明了必须按对应版本复制的重要性——版本越新replace 段覆盖面越广漏掉任何一个 k8s.io 模块都可能复现 v0.0.0 报错。一个需要留意的特例gitops-engine 的本地 replace当前 go.mod 末尾还有一条单独的替换replace github.com/argoproj/argo-cd/gitops-engine/v3 ./gitops-engine它指向仓库内的gitops-engine/子目录。从源码结构看gitops-engine/go.mod 声明了独立模块github.com/argoproj/argo-cd/gitops-engine/v3其自身也带有一整套 k8s.io v0.37.0 的 replace 段其中还有一条注释提醒升级这些版本后若 schema 有变化需在仓库维护流程中运行hack/update_static_schema.sh。对消费者而言这条 ./gitops-engine是源码目录内开发用的本地替换在正式发布时require 段中的github.com/argoproj/argo-cd/gitops-engine/v3会被钉到对应的发布 tag 版本go.mod 的注释写明 Tagged as gitops-engine/vX.Y.Z at release time。因此你引用已发布的 Argo CD 版本时不需要也不应该复制这条./gitops-engine本地路径替换但如果你同时直接 import 了gitops-engine/v3下的包其 k8s.io 模块族仍依赖主模块你的项目声明的 replace 覆盖建议将两个 replace 段主模块 gitops-engine取并集后统一放到你的 go.mod 中。其他必须同步确认的约束1. 模块路径中的大版本号后缀。Go Modules 规定大版本号 ≥ 2 的模块其模块路径必须以/vN结尾。因此引用 v2.x如 v2.4.15时import 路径形如github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1引用 v3.x当前版本时import 路径形如github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1。两类路径不能混用require 的行与 import 语句必须与 Argo CD 版本的大版本号保持一致。2. Go 工具链版本。当前 go.mod 声明go 1.27.0且注释明确除非确实用到了新版特性否则不要随意提升。引用该版本的 Argo CD 包你的项目需要不低于该版本声明的 Go 工具链go 1.27.0指令会自动触发工具链下载或要求本机满足。v2.x 老版本对应的 Go 版本要求以该版本 tag 的 go.mod 为准。3. 依赖更新流程。若你在升级 Argo CD 版本后遇到invalid version: unknown revision一类的报错除 replace 段外还应检查是否复制了错误的 commit SHA。仓库的依赖管理文档 docs/developer-guide/dependencies.md 在更新 notifications-engine 依赖时也给出了同样的排错提示出现该错误通常是 SHA 抄错了。实操检查清单将 Argo CD 包引入你自己的项目时可以按以下顺序操作确定目标 Argo CD 版本 tag例如v2.4.15或v3.6.0切换到该 tag 查看其 go.mod在 require 中加入github.com/argoproj/argo-cd/vN vX.Y.ZN 为大版本号import 时使用对应的/vN/...路径将该 tag 下 go.mod 的整个 replace 段含注释复制到你的 go.mod若直接依赖 gitops-engine 包合并 gitops-engine/go.mod 中的 k8s.io 钉版本但丢弃 ./gitops-engine这类本地路径替换确认本机 Go 版本 ≥ 该 go.mod 声明的版本运行go mod tidy再执行go build ./...。若仍报unknown revision v0.0.0逐项比对 replace 段通常是漏掉了某一个k8s.io/*条目。小结unknown revision v0.0.0 并非 Argo CD 的缺陷而是 Go 模块机制依赖侧 replace 不传递与 Kubernetes staging 仓库无独立版本号的 k8s.io 模块族叠加的必然结果。官方给出的解法——把你所用 Argo CD 版本 go.mod 的 replace 段原样搬到自己的项目——简洁且可验证v2.4.15 需要 20 余条 k8s.io v0.23.1 钉版本当前 v3.6.0 则需要 33 条 k8s.io v0.37.0 钉版本外加 protobuf、grpc-gateway、yaml、x/tools 等安全/兼容钉版本。按对应版本复制、核对大版本号后缀与 Go 工具链版本即可在自己的项目里稳定地引用 Argo CD 的类型定义与 API 包。【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cd创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门