尝试在 CircleCI 上获取 golang 私有依赖项时的问题
Posted
技术标签:
【中文标题】尝试在 CircleCI 上获取 golang 私有依赖项时的问题【英文标题】:Issues when trying to get golang private dependencies on CircleCI 【发布时间】:2021-01-11 17:19:51 【问题描述】:我使用 CircleCI 作为我的工具来构建要在 Kubernetes 上发布的图像。
我的项目正在使用 Golang,而我正在使用 Go Modules。
事实证明,在检查我的代码后,步骤 go get -v -t -d ./...
运行时我遇到了问题。
在某些时候,对于一些依赖项(这是我公司的内部依赖项,它们在我公司的 github 项目下),我会收到unknown revision
消息。
我已经配置了机器帐户,因为我有自己的 github 帐户集。
我已尝试添加以下行
- run: echo -e "Host github.com\n\tStrictHostKeyChecking no\n" > ~/.ssh/config
- run: cp key ~/.ssh/id_rsa
- run: git config --global url."ssh://git@github.com".insteadOf "https://github.com" || true
- run: git config --global gc.auto 0 || true
- run: go get -v -t -d ./...
cp key ~/.ssh/id_rsa
命令复制了一个ssh key
,它可以访问 github 项目,我可以在本地使用它来执行上述相同的步骤。
非常欢迎任何帮助,因为我已经在互联网上阅读了大量的文档/cmets,但似乎没有任何效果。
谢谢。
【问题讨论】:
我有几个问题,你有GO111MODULE=on
,GOPRIVATE
呢?您是否检查过 ssh 是否在某个步骤上与 ssh -T git@github.com
一起工作?
unknown revision
意味着您的 go.mod
表示对远程仓库中不存在的版本的依赖。您的本地副本中是否有 replace
指令可能会覆盖某些依赖项解析行为?
@Зелёный 是的,我启用了GO111MODULE
,并设置了GOPRIVATE
。另外,SSH 工作正常,刚刚检查了ssh -T git@github.com
。
@Adrian 是的,由于某种原因,它没有找到特定的标签(在我的情况下,v0.0.3
),但它存在。我没有任何替换指令,我现在仔细检查了。
你确定标签存在于远程,而不仅仅是你的本地副本?
【参考方案1】:
回答我自己的问题:
Github 阻止用户获取go get
私有存储库,即使正在运行的用户是所有者(在 docker 上 - 因为 circleCI 正在使用 docker 容器运行构建)
为了解决这个问题,我生成了一个开发者令牌:https://github.com/settings/tokens
并使用令牌允许访问私有存储库:git config --global url."https://<my-dev-token>:x-oauth-basic@github.com/<company-slug>".insteadOf "https://github.com/<company-slug>" || true
我已经测试了其他解决方案,但这是唯一一个运行良好的解决方案。
【讨论】:
曾经适用于我们的案例,但是如果你有一个依赖树并且 private 是一个嵌套的树(如第 2 级),它看起来好像不起作用【参考方案2】:众所周知的replace
解决方法可能并不总是有效。如果您有一棵依赖树并且私有模块是嵌套的,则 mod 校验和验证将失败。为了解决这个问题,需要在go.mod
中有一个条目。此外,该条目应在go mod tidy
之后继续存在。否则可能会被意外删除。
所以除了类似于下面的replace
解决方案:
git config --global url."https://<token>:x-oauth-basic@github.com/<org-slug>".insteadOf "https://github.com/<org-slug>"
(其中<token>
是您至少可以读取的 GH 令牌)
需要使用tools 方法让go.mod 保留条目。
例子:
$ cat tools.go
// +build tools
package tools
import (
_ "github.com/<org-slug>/<dependency-name>/tools" // this is your private dependency
)
确保在依赖库中也有 tools
包。
【讨论】:
以上是关于尝试在 CircleCI 上获取 golang 私有依赖项时的问题的主要内容,如果未能解决你的问题,请参考以下文章