如何将 Go 与私有 GitLab 存储库一起使用
How to use Go with a private GitLab repo
GitLab 是一种免费的开源方式来托管私有 .git
存储库,但它似乎不适用于 Go。当您创建一个项目时,它会生成一个 URL 形式的:
git@1.2.3.4:private-developers/project.git
其中:
1.2.3.4
是gitlab服务器的IP地址
private-developers
是可以访问私有仓库的用户组
Golang 1.2.1 似乎不理解这个语法。
go get git@1.2.3.4:private-developers/project.git
结果:
package git@23.251.148.129/project.git: unrecognized import path "git@1.2.3.4/project.git"
有没有办法让它工作?
如果 go get
无法获取 repo,您始终可以直接使用 git 进行初始克隆:
git clone git@gitlab:private-developers/project.git $GOPATH/src/gitlab/private-developers/project
这些工具将正常工作,期望 go get -u
需要 -f
标志,因为 git 远程与规范导入路径不匹配。
您可以设置您的 git 凭据,Go 将使用它们:
- 在您的 git集线器上(在设置中的某处)生成一个唯一密码。
git config credential.helper store
echo https://your-github-username:your-generated-password@github.com >> ~/.git-credentials
- 利润。
Gitlab 本身支持 go get
。
go get
将向您提供的 url 发出 http 请求,并查找指向确切源代码控制路径的元标记。
对于我的 gitlab 安装,这是 mygitlabdomain.com/myProject/myRepo
。对你来说,我假设这将是 1.2.3.4/private-developers/project
.
不幸的是,它似乎只提供了 http scm 路径,而不是 ssh 路径,所以我必须输入我的凭据才能克隆。如果您想更新到 ssh url.
,您可以在克隆后轻松 fiddle 使用本地存储库中的遥控器
您可以通过戳 http://1.2.3.4:private-developers/project?go-get=1
并查看源代码并查找元标记来测试 url。
郑重声明,这可以在 go 之外使用 gitlab 7.3.2 工作,并且正如 JimB 观察到的那样,可以用作解决方法。我发现我确实收到了输入 username/password 的提示,即使在 gitlab 中注册了 SSH 密钥:
git clone http://1.2.3.4/private-developers/project.git
或者我可以使用 SSH 等价物,因为我有一个在 gitlab 注册的 SSH 密钥,避免了提示:
git clone git@1.2.3.4:private-developers/project.git
目前都不支持 go。修复可能在 7.9 中,但我还没有机会测试它:
upcoming bugfix
运行 这个命令:
git config --global url."git@1.2.3.4:".insteadOf "https://1.2.3.4/"
假设您拥有 git clone
存储库的正确权限,这将使 go get
对服务器 1.2.3.4
上的 all 存储库有效。
我用 go 版本 1.6.2、1.8 和 1.9.1 测试了这个。
此问题现已在 Gitlab 8.* 中解决,但仍然不直观。最困难的挑战确实是 go get
,以下步骤将帮助您克服这些挑战:
创建 SSH 密钥对。确保不要覆盖默认保存在 ~/.ssh/
.
中的现有对
ssh-keygen -t rsa -b 4096
在您的 Gitlab 项目中创建一个新的秘密变量。使用 SSH_PRIVATE_KEY
作为 Key 并且 private 密钥的内容作为 Value.
将您的 .gitlab-ci.yml
修改为 before_script
。
before_script:
# install ssh-agent if not already installed
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
# run ssh-agent
- eval $(ssh-agent -s)
# add the SSH key stored in SSH_PRIVATE_KEY
- ssh-add <(echo "$SSH_PRIVATE_KEY")
# for Docker builds disable host key checking
- mkdir -p ~/.ssh
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
将步骤 1 中创建的密钥对中的 public 密钥添加为 部署密钥在您需要 go get
.
的项目中
对于 HTTPS 私有 gitlab 存储库,@Rick Smith 的回答就足够了。这是对 HTTP repo 的补偿,首先 运行 命令:
git config --global url."git@mygitlab.com:".insteadOf "http://mygitlab.com/"
然后使用下面的go get
命令获取golang项目:
go get -v -insecure mygitlab.com/user/repo
从dep版本5.2开始,dep
支持Gitlab私有仓库的私有仓库。
在 .netrc 文件中,您可以提供您的 Gitlab 用户名和访问令牌以访问私有存储库。
- 在您的 $HOME 目录中创建
.netrc
文件
$ touch $HOME/.netrc
- 使用您的 Gitlab 凭据编辑您的
.netrc
machine gitlab.<private>.com
login <gitlab-username>
password <gitlab-access-token>
... (more private repositories if needed)
- 在您的 Go 存储库中,运行
dep
命令解析私有包。在这种情况下,
$ dep ensure -v
我通常的做法是:
确保您使用的是 SSH。
完成后,您可以将 git 配置为使用 ssh
而不是 https
如果您使用的是 Mac OX。你可以 运行 vim ~/.gitconfig
并添加
[url "git@gitlab.com:"]
insteadOf = https://gitlab.com/
配置完成后您可以运行
GOPRIVATE="gitlab.com/your_username_or_group" go get gitlab.com/name_or_group/repo_name
希望对您有所帮助。
使用 Gitlab 的最简单方法
before_script:
- git config --global url."https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/".insteadOf https://gitlab.com/
- go env -w GOPRIVATE=gitlab.com/${CI_PROJECT_NAMESPACE}
在此处查看更多详细信息:https://docs.gitlab.com/ee/user/project/new_ci_build_permissions_model.html#dependent-repositories
GitLab 11.8+ 版和 Go 1.13+ 版将使用您的 GitLab 个人令牌与 BASIC 身份验证一起使用。
转到 Gitlab 中的设置 -> 访问令牌,添加个人访问令牌或使用现有的访问令牌。
在您的 ~/.netrc 文件中,添加以下行:
machine <your GitLab domain> (e.g. gitlab.com)
login <your GitLab id>
password <your GitLab personal access token>
那你去本地应该就可以了。
如果您需要在 CI 中构建它,请在您的 .gitlab-ci.yml 文件中添加以下行:
before_script:
- echo -e "machine <your GitLab domain>\nlogin gitlab-ci-token\npassword ${CI_JOB_TOKEN}" > ~/.netrc
GitLab 是一种免费的开源方式来托管私有 .git
存储库,但它似乎不适用于 Go。当您创建一个项目时,它会生成一个 URL 形式的:
git@1.2.3.4:private-developers/project.git
其中:
1.2.3.4
是gitlab服务器的IP地址private-developers
是可以访问私有仓库的用户组
Golang 1.2.1 似乎不理解这个语法。
go get git@1.2.3.4:private-developers/project.git
结果:
package git@23.251.148.129/project.git: unrecognized import path "git@1.2.3.4/project.git"
有没有办法让它工作?
如果 go get
无法获取 repo,您始终可以直接使用 git 进行初始克隆:
git clone git@gitlab:private-developers/project.git $GOPATH/src/gitlab/private-developers/project
这些工具将正常工作,期望 go get -u
需要 -f
标志,因为 git 远程与规范导入路径不匹配。
您可以设置您的 git 凭据,Go 将使用它们:
- 在您的 git集线器上(在设置中的某处)生成一个唯一密码。
git config credential.helper store
echo https://your-github-username:your-generated-password@github.com >> ~/.git-credentials
- 利润。
Gitlab 本身支持 go get
。
go get
将向您提供的 url 发出 http 请求,并查找指向确切源代码控制路径的元标记。
对于我的 gitlab 安装,这是 mygitlabdomain.com/myProject/myRepo
。对你来说,我假设这将是 1.2.3.4/private-developers/project
.
不幸的是,它似乎只提供了 http scm 路径,而不是 ssh 路径,所以我必须输入我的凭据才能克隆。如果您想更新到 ssh url.
,您可以在克隆后轻松 fiddle 使用本地存储库中的遥控器您可以通过戳 http://1.2.3.4:private-developers/project?go-get=1
并查看源代码并查找元标记来测试 url。
郑重声明,这可以在 go 之外使用 gitlab 7.3.2 工作,并且正如 JimB 观察到的那样,可以用作解决方法。我发现我确实收到了输入 username/password 的提示,即使在 gitlab 中注册了 SSH 密钥:
git clone http://1.2.3.4/private-developers/project.git
或者我可以使用 SSH 等价物,因为我有一个在 gitlab 注册的 SSH 密钥,避免了提示:
git clone git@1.2.3.4:private-developers/project.git
目前都不支持 go。修复可能在 7.9 中,但我还没有机会测试它: upcoming bugfix
运行 这个命令:
git config --global url."git@1.2.3.4:".insteadOf "https://1.2.3.4/"
假设您拥有 git clone
存储库的正确权限,这将使 go get
对服务器 1.2.3.4
上的 all 存储库有效。
我用 go 版本 1.6.2、1.8 和 1.9.1 测试了这个。
此问题现已在 Gitlab 8.* 中解决,但仍然不直观。最困难的挑战确实是 go get
,以下步骤将帮助您克服这些挑战:
创建 SSH 密钥对。确保不要覆盖默认保存在
中的现有对~/.ssh/
.ssh-keygen -t rsa -b 4096
在您的 Gitlab 项目中创建一个新的秘密变量。使用
SSH_PRIVATE_KEY
作为 Key 并且 private 密钥的内容作为 Value.将您的
.gitlab-ci.yml
修改为before_script
。before_script: # install ssh-agent if not already installed - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )' # run ssh-agent - eval $(ssh-agent -s) # add the SSH key stored in SSH_PRIVATE_KEY - ssh-add <(echo "$SSH_PRIVATE_KEY") # for Docker builds disable host key checking - mkdir -p ~/.ssh - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
将步骤 1 中创建的密钥对中的 public 密钥添加为 部署密钥在您需要
go get
. 的项目中
对于 HTTPS 私有 gitlab 存储库,@Rick Smith 的回答就足够了。这是对 HTTP repo 的补偿,首先 运行 命令:
git config --global url."git@mygitlab.com:".insteadOf "http://mygitlab.com/"
然后使用下面的go get
命令获取golang项目:
go get -v -insecure mygitlab.com/user/repo
从dep版本5.2开始,dep
支持Gitlab私有仓库的私有仓库。
在 .netrc 文件中,您可以提供您的 Gitlab 用户名和访问令牌以访问私有存储库。
- 在您的 $HOME 目录中创建
.netrc
文件
$ touch $HOME/.netrc
- 使用您的 Gitlab 凭据编辑您的
.netrc
machine gitlab.<private>.com
login <gitlab-username>
password <gitlab-access-token>
... (more private repositories if needed)
- 在您的 Go 存储库中,运行
dep
命令解析私有包。在这种情况下,
$ dep ensure -v
我通常的做法是:
确保您使用的是 SSH。
完成后,您可以将 git 配置为使用 ssh
而不是 https
如果您使用的是 Mac OX。你可以 运行 vim ~/.gitconfig 并添加
[url "git@gitlab.com:"]
insteadOf = https://gitlab.com/
配置完成后您可以运行
GOPRIVATE="gitlab.com/your_username_or_group" go get gitlab.com/name_or_group/repo_name
希望对您有所帮助。
使用 Gitlab 的最简单方法
before_script:
- git config --global url."https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/".insteadOf https://gitlab.com/
- go env -w GOPRIVATE=gitlab.com/${CI_PROJECT_NAMESPACE}
在此处查看更多详细信息:https://docs.gitlab.com/ee/user/project/new_ci_build_permissions_model.html#dependent-repositories
GitLab 11.8+ 版和 Go 1.13+ 版将使用您的 GitLab 个人令牌与 BASIC 身份验证一起使用。 转到 Gitlab 中的设置 -> 访问令牌,添加个人访问令牌或使用现有的访问令牌。 在您的 ~/.netrc 文件中,添加以下行:
machine <your GitLab domain> (e.g. gitlab.com)
login <your GitLab id>
password <your GitLab personal access token>
那你去本地应该就可以了。
如果您需要在 CI 中构建它,请在您的 .gitlab-ci.yml 文件中添加以下行:
before_script:
- echo -e "machine <your GitLab domain>\nlogin gitlab-ci-token\npassword ${CI_JOB_TOKEN}" > ~/.netrc