Reputation: 2290
GitLab is a free, open-source way to host private .git
repositories but it does not seem to work with Go. When you create a project it generates a URL of the form:
[email protected]:private-developers/project.git
where:
1.2.3.4
is the IP address of the gitlab serverprivate-developers
is a user group which has access to the private repoGolang 1.2.1 doesn't seem to understand this syntax.
go get [email protected]:private-developers/project.git
results in:
package [email protected]/project.git: unrecognized import path "[email protected]/project.git"
Is there a way to get this to work?
Upvotes: 71
Views: 94772
Reputation: 79
Found an article that covers this in a decent amount of detail here, including how to get this to work in a Docker container. Configuring Gitlab repos to be cloned with SSH rather than HTTPS and using GOPRIVATE
seems to be the main two things to keep in mind.
Upvotes: 1
Reputation: 4554
For HTTPS private gitlab repo, @Rick Smith's answer is enough. Here's a compensation for HTTP repo, first run the command:
git config --global url."[email protected]:".insteadOf "http://mygitlab.com/"
then use below go get
command to get the golang project:
go get -v -insecure mygitlab.com/user/repo
Upvotes: 2
Reputation: 272
GitLab version 11.8+ and Go version 1.13+ will work with BASIC auth by using your GitLab personal token. Go to Settings -> Access Tokens in your Gitlab, add a personal access token or use your existing one. In your ~/.netrc file, add following lines:
machine <your GitLab domain> (e.g. gitlab.com)
login <your GitLab id>
password <your GitLab personal access token>
Then you should be able to do go get locally.
If you need to build it in CI, then add following line in your .gitlab-ci.yml file:
before_script:
- echo -e "machine <your GitLab domain>\nlogin gitlab-ci-token\npassword ${CI_JOB_TOKEN}" > ~/.netrc
Upvotes: 10
Reputation: 383
Easiest way with 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}
See more details here: https://docs.gitlab.com/ee/user/project/new_ci_build_permissions_model.html#dependent-repositories
Upvotes: 27
Reputation: 144
The way I usually do it is:
Ensure you are using SSH.
once that's done you can configure your git to use ssh
instead https
If you are using Mac OX. you can run vim ~/.gitconfig and add
[url "[email protected]:"]
insteadOf = https://gitlab.com/
once configured you can run
GOPRIVATE="gitlab.com/your_username_or_group" go get gitlab.com/name_or_group/repo_name
I hope that helps.
Upvotes: 3
Reputation: 3227
From dep version 5.2, dep
supports private repositories for Gitlab private repositories.
On .netrc file, you can provide your Gitlab username and access token for accessing private repositories.
.netrc
file in your $HOME directory$ touch $HOME/.netrc
.netrc
with your Gitlab credentialsmachine gitlab.<private>.com
login <gitlab-username>
password <gitlab-access-token>
... (more private repositories if needed)
dep
command to resolve private packages. In this case,$ dep ensure -v
Upvotes: 3
Reputation: 9251
Run this command:
git config --global url."[email protected]:".insteadOf "https://1.2.3.4/"
Assuming you have the correct privileges to git clone
the repository, this will make go get
work for all repos on server 1.2.3.4
.
I tested this with go version 1.6.2, 1.8, and 1.9.1.
Upvotes: 46
Reputation: 2290
For the record, this works outside of go using gitlab 7.3.2 and, as JimB has observed, can be used as a workaround. I find that i do get prompted for username/password, even though an SSH key is registered with gitlab:
git clone http://1.2.3.4/private-developers/project.git
Alternatively i can use the SSH equivalent which, since i have an SSH key registered with gitlab, avoids the prompts:
git clone [email protected]:private-developers/project.git
Neither works with go currently. A fix may be in 7.9 but i haven't had a chance to test it: upcoming bugfix
Upvotes: 1
Reputation: 1135
This issue is now resolved in Gitlab 8.* but is still unintuitive. The most difficult challenge indeed is go get
and the following steps will allow you to overcome those:
Create an SSH key pair. Be sure to not overwrite an existing pair that is by default saved in ~/.ssh/
.
ssh-keygen -t rsa -b 4096
Create a new Secret Variable in your Gitlab project. Use SSH_PRIVATE_KEY
as Key and the content of your private key as Value.
Modify your .gitlab-ci.yml
with a 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'
Add the public key from the key pair created in step 1 as a Deploy Key in the project that you need to go get
.
Upvotes: 23
Reputation: 23068
Gitlab does support go get
natively.
go get
will issue an http request to the url you provide and look for meta tags that point to the exact source control path.
For my gitlab installation this is mygitlabdomain.com/myProject/myRepo
. For you I assume this would be 1.2.3.4/private-developers/project
.
Unfortunately it only appears to give the http scm path, not the ssh path, so I had to enter my credentials to clone. You can easily fiddle with the remote in your local repository after it clones if you want to update to the ssh url.
You can test the url by poking http://1.2.3.4:private-developers/project?go-get=1
and viewing source and looking for the meta tag.
Upvotes: 3
Reputation: 99205
You can setup your git credentials and Go will use them:
git config credential.helper store
echo https://your-github-username:[email protected] >> ~/.git-credentials
Upvotes: 0
Reputation: 109325
If go get
can't fetch the repo, you can always do the initial clone with git directly:
git clone git@gitlab:private-developers/project.git $GOPATH/src/gitlab/private-developers/project
The tools will then work normally, expect for go get -u
which will require the -f
flag because the git remote doesn't match the canonical import path.
Upvotes: 7