尝试在 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=onGOPRIVATE 呢?您是否检查过 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>"

(其中&lt;token&gt; 是您至少可以读取的 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 私有依赖项时的问题的主要内容,如果未能解决你的问题,请参考以下文章

在 CircleCI 上运行 pytest-qt

CircleCI 的 Fastlane 测试飞行

golang实现微信支付v3版本

如果在iTunes上提交应用程序已生成但丢失了如何获取私钥

将CircleCI更改部署到Heroku

测试在 Xcode 中通过,但在 Circleci 上失败