尝试在 CircleCI 上获取 golang 私有依赖项时的问题

Issues when trying to get golang private dependencies on CircleCI

我正在使用 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 项目,我可以在本地使用它来执行与上述相同的步骤。

非常欢迎任何帮助,因为我已经在互联网上阅读了大量文档/评论,但似乎没有任何效果。

谢谢。

回答我自己的问题:

  • Github 阻止用户获取 go get 私有存储库,即使 运行ning 的用户是所有者(在 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

我已经测试了其他解决方案,但这是唯一一个运行良好的解决方案。

众所周知的 replace 解决方法可能并不总是有效。如果你有一棵依赖关系树并且 private module 是一个嵌套的,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 包。