带有私有gitlab(ssh)的Goland模块

时间:2019-12-25 12:47:49

标签: go go-modules

美好的一天!我尝试从滑行迁移到模块(私有gitlab仓库) 并通过ssh签出代码

我有一个简单的项目,从私有gitlab存储库导入。

go.mod如下:

module my.private.package/modtest

go 1.12

require my.private.package/statistics v1.0.0

当我尝试构建我的应用程序或运行测试时,我得到:

go: my.private.package/statistics@v1.0.0: unrecognized import path "my.private.package/statistics" (parse https://my.private.package/statistics?go-get=1: no go-import meta tags ())
go: error loading module requirements

我试图将设置添加到git config:

[url "ssh://git@my.gitlab.server:9999"]
        insteadOf = https://my.private.package

但仍然出现此错误。

有什么办法可以使它工作? 谢谢。

3 个答案:

答案 0 :(得分:2)

我以前处理过Go模块和一个私有的GitLab。我们的私人GitLab有组和子组。您可能缺少的部分是~/.netrc,并且您的全局git配置可能不正确。

我为此做了GitHub要点。您可以在这里找到它:https://gist.github.com/MicahParks/1ba2b19c39d1e5fccc3e892837b10e21

您可以在下面找到要点:

问题

go命令行工具需要能够从您的私有GitLab上获取依赖项,但是需要验证。

这假定您的私人GitLab位于privategitlab.company.com

环境变量

建议使用以下环境变量:

export GO111MODULE=on
export GOPRIVATE=privategitlab.company.com

以上几行最适合您的Shell启动,例如~/.bashrc

说明

GO111MODULE=on告诉Golang命令行工具您正在使用模块。我没有用不使用的项目测试过 私有GitLab上的Golang模块。

GOPRIVATE=privategitlab.company.com告诉Golang命令行工具不要将公共Internet资源用作主机名 列出(例如公共模块代理)。

从您的私人GitLab获取个人访问令牌

要以后使用这些说明,请遵循this guide from the GitLab docs。 我知道read_api范围是Golang命令行工具正常工作所必需的,我可能怀疑read_repository为 很好,但尚未确认。

设置~/.netrc

为了使Golang命令行工具能够通过GitLab进行身份验证,最好使用~/.netrc文件。

要创建该文件(如果不存在),请运行以下命令:

touch ~/.netrc
chmod 600 ~/.netrc

现在编辑文件内容以匹配以下内容:

machine privategitlab.company.com login USERNAME_HERE password TOKEN_HERE

USERNAME_HERE替换为您的GitLab用户名,而TOKEN_HERE替换为您在GitLab中获得的访问令牌 上一节。

常见错误

不要使用以下方法设置全局git配置:

git config --global url."git@privategitlab.company.com:".insteadOf "https://privategitlab.company.com"

我相信在撰写本文时,Golang命令行工具不完全支持SSH git,这可能会导致 与~/.netrc发生冲突。

奖金:SSH配置文件

要定期使用git工具而不是Golang命令行工具,可以先设置一个~/.ssh/config文件。 为此,请运行以下命令:

mkdir ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/config
chmod 600 ~/.ssh/config

请注意,上面文件和目录的权限是SSH的基本要求,SSH可以在以下默认配置下使用 大多数Linux系统。

然后,编辑~/.ssh/config文件以匹配以下内容:

Host privategitlab.company.com
  Hostname privategitlab.company.com
  User USERNAME_HERE
  IdentityFile ~/.ssh/id_rsa

请注意上述文件中的间距很重要,如果文件不正确,则会使文件无效。

其中USERNAME_HERE是您的GitLab用户名,~/.ssh/id_rsa是文件系统中SSH private 密钥的路径。 您已经将其 public 密钥上传到了GitLab。这是some instructions

答案 1 :(得分:0)

我认为url配置应为ssh://gitlab@my.gitlab.server:9999而不是ssh://git@my.gitlab.server:9999,因为您使用的是gitlab私有存储库。

因此,配置应为:

[url "ssh://gitlab@my.gitlab.server:9999"]
    insteadOf = https://my.gitlab.server

我希望可以对此发表评论,但是我的声誉还不够,所以我将其发布为答案。

答案 2 :(得分:0)

您正在使用哪个版本的Go?如果是Go 1.13或更高版本,则默认为通过proxy.golang.org下载模块。您可以使用GOPRIVATE环境变量对一组特定的软件包进行更改。

这里是go help module-private的引文,我强烈建议您全文阅读。直接提取模块后,应使用与之前模块相同的git / ssh逻辑。

GOPRIVATE环境变量控制go命令的模块 认为是私人的(不公开),因此不应使用 代理或校验和数据库。该变量是逗号分隔的列表 模块路径前缀的全局模式(按照Go的path.Match的语法)。 例如,

GOPRIVATE = *。corp.example.com,rsc.io / private

使go命令将具有路径前缀的任何模块视为私有 匹配任何一种模式,包括git.corp.example.com/xyzzy、rsc.io/private, 和rsc.io/private/quux。